既可恶又不得不注意的地方:
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.