您的位置:首页 > 运维架构 > Shell

shell综合

2013-12-19 19:01 309 查看
既可恶又不得不注意的地方:

1、if 与[ 之间必须有空格,

2、[ ]与判断条件之间也必须有空格,

3、]与; 之间不能有空格,

4、变量赋值的时候,等号两边不能有空格,

调试:
sh -x xxx.sh

shell与编辑器的纠结:
syntax error: unexpected end of file问题的解决办法
dos文件转换成 unix 文件格式
dos 格式 文件 传输到 unix 系统时 , 会在每行的结尾多一个 ^M , 当然也有可能看不到 , 但是在 vi 的时候 , 会在下面显示此文件的格式 , 比如 "dos.txt" [dos] 120L, 2532C 字样 , 表示是一个 [dos] 格式文件 , 如果是 MAC 系统的 , 会显示 [MAC] , 因为文件格式的原因有时会导致我们的 unix 程序 , 或者 shell 程序出现错误 , 那么需要把这些 dos 文件格式转换成 unix 格式 , 方法是
vi dos.txt
:set fileformat=unix
:w
这样文件就转换成 unix 格式 文件了 ,一般在 windows 机器上编写好了文件传到 unix 下就可能会出现这样的情况 , 而一般我们使用 ftp 命令, 常常会加上 bin 参数表示二进制传输, 可是试一下不加 bin 参数 , 可能传到 unix 下就是 unix 格式

tip1:求绝对值

${-300#-}
分析:
${varname#sub}
将$varname开头部分的sub去掉
${varaname%sub}
将$varname结尾部分的sub去掉

tip2:获取系统当前时间戳

now=`date +%s`


注意:date和+号之间有空格。

tip3:读取一个文件里的内容,并对其进行处理

#!/bin/bash

now=`date +%s`
#echo $now
cat ./listencron.log | while read line
do
value=$[$now-$line]
r=${value#-}
if [ $r -gt 300 ];then
echo "it is no"
/bin/bash ./a.sh
ps -ef|grep cron.php|grep -v grep|cut -c 9-15|xargs kill -9
cd /data/test && /usr/bin/php /data/test/cron.php
else
echo "it is ok"
fi
done


tip4:执行一个shell脚本,并且传入参数

#!/bin/bash
echo "The first agrv is $1"
echo "The second agrv is $2"


./test.sh aaa bbb
注:$1 -$n 代表的就是第几个参数。并且要给予该文件x权限。

tip5:shell里的时间与时间戳转换
date +%s 可以得到UNIX的时间戳;
用shell将时间字符串与时间戳互转:
date -d "2010-10-18 00:00:00" +%s 输出形如:1287331200
而时间戳转换为字符串可以这样做:
date -d @1287331200 "+%Y-%m-%d" 输出形如:2010-10-18
如果需要得到指定日期的前后几天,可以:
1、seconds=`date -d "2010-10-18 00:00:00" +%s` #得到时间戳
2、seconds_new=`expr $seconds + 86400` #加上一天的秒数86400
3、date_new=`date -d @$seconds_new "+%Y-%m-%d"` #获得指定日前加上一天的日前

date 的具体用法可以查看另外一篇博文 《shell date 命令详解》http://blog.csdn.net/runming918/article/details/7223520

tip6:循环中依次+1比较特殊

#!/bin/bash
count=1    //赋值语句,不加空格
cat test | while read line        //cat 命令的输出作为read命令的输入,read读到的值放在line中
do
echo "Line $count:$line"
count=$[ $count + 1 ]          //注意中括号中的空格。
done


备注:如果直接用count=$count+1,则会输出1+1.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: