shell综合

既可恶又不得不注意的地方:

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.

原文地址:https://www.cnblogs.com/thinksasa/p/3482723.html