shell脚本

来源:互联网 发布:淘宝商品视频广告制作 编辑:程序博客网 时间:2024/05/29 10:58

获取当前时间距纪元时间(1970年1月1日)所经过的天数

#!/bin/shdeclare -a DATE=(`date +"%S %M %k %d %m %Y"`)#DATE=(`date +"%S %M %k %d %m %Y"`)  It's ok as well.second=${DATE[0]}minute=${DATE[1]}hour=${DATE[2]}day=${DATE[3]}month=${DATE[4]}year=${DATE[5]}epoch_days=719591if [ $month -gt 2 ]; then    month=$((month+1))else    month=$((month+13))    year=$((year-1))fitoday_days=$(((year*365)+(year/4)-(year/100)+(year/400)+(month*306001/10000)+day))days_since_epoch=$((today_days-epoch_days))echo "$days_since_epoch"seconds_since_epoch=$(((days_since_epoch*86400)+(hour*3600)+(minute*60)+second))echo "$seconds_since_epoch"


将输入信息转换为大写字符后再进行条件判断:

#!/bin/shecho  -n "Please let me know your name. "read namename=`echo $name | tr [a-z] [A-Z]`if [[ $name == "STEPHEN" ]]; then    echo "Hello, Stephen."else    echo "You are no Stephen."fi


三、判断参数是否为数字:

      有些时候我们需要验证脚本的参数或某些变量的值是否为数字,如果不是则需要需要给出提示,并退出脚本。
      /> cat > test3.sh
      #!/bin/sh
      #1. $1是脚本的第一个参数,这里作为awk命令的第一个参数传入给awk命令。
      #2. 由于没有输入文件作为输入流,因此这里只是在BEGIN块中完成。
      #3. 在awk中ARGV数组表示awk命令的参数数组,ARGV[0]表示命令本身,ARGV[1]表示第一个参数。
      #4. match是awk的内置函数,返回值为匹配的正则表达式在字符串中(ARGV[1])的起始位置,没有找到返回0。
      #5. 正则表达式的写法已经保证了匹配的字符串一定是十进制的正整数,如需要浮点数或负数,仅需修改正则即可。
      #6. awk执行完成后将结果返回给isdigit变量,并作为其初始化值。
      #7. isdigit=`echo $1 | awk '{ if (match($1, "^[0-9]+$") != 0) print "true"; else print "false" }' `
      #8. 上面的写法也能实现该功能,但是由于有多个进程参与,因此效率低于下面的写法。
      isdigit=`awk 'BEGIN { if (match(ARGV[1],"^[0-9]+$") != 0) print "true"; else print "false" }' $1`
      if [[ $isdigit == "true" ]]; then
          echo "This is numeric variable."
          number=$1
      else
          echo "This is not numeric variable."
          number=0
      fi
      CTRL+D
      /> ./test3.sh 12

      This is numeric variable.
      /> ./test3.sh 12r
      This is not numeric variable.

四、判断整数变量的奇偶性:

      为了简化问题和突出重点,这里我们假设脚本的输入参数一定为合法的整数类型,因而在脚本内部将不再进行参数的合法性判断。
      /> cat > test4.sh
      #!/bin/sh
      #1. 这里的重点主要是sed命令中正则表达式的写法,它将原有的数字拆分为两个模式(用圆括号拆分),一个前面的所有高位数字,另一个是最后一位低位数字,之后再用替换符的方式(\2),将原有数字替换为只有最后一位的数字,最后将结果返回为last_digit变量。 
      last_digit=`echo $1 | sed 's/\(.*\)\(.\)$/\2/'`
      #2. 如果last_digit的值为0,2,4,6,8,就表示其为偶数,否则为奇数。
      case $last_digit in
      0|2|4|6|8)
          echo "This is an even number." ;;
      *)
          echo "This is not an even number." ;;
      esac
      CTRL+D
      /> ./test4.sh 34
      This is an even number.
      /> ./test4.sh 345
      This is not an even number.
        
五、将Shell命令赋值给指定变量,以保证脚本的移植性:

      有的时候当我们在脚本中执行某个命令时,由于操作系统的不同,可能会导致命令所在路径的不同,甚至是命令名称或选项的不同,为了保证脚本具有更好的平台移植性,我们可以将该功能的命令赋值给指定的变量,之后再使用该命令时,直接使用该变量即可。这样在今后增加更多OS时,我们只需为该变量基于新系统赋予不同的值即可,否则我们将不得不修改更多的地方,这样很容易导致因误修改而引发的Bug。
      /> cat > test5.sh
      #!/bin/sh
      #1. 通过uname命令获取当前的系统名称,之后再根据OS名称的不同,给PING变量赋值不同的ping命令的全称。
      osname=`uname -s`
      #2. 可以在case的条件中添加更多的操作系统名称。
      case $osname in
      "Linux")
          PING=/usr/sbin/ping ;;
      "FreeBSD")
          PING=/sbin/ping ;;
      "SunOS")
          PING=/usr/sbin/ping ;;
      *)
          ;;
      esac
      CTRL+D
      /> . ./test5.sh
      /> echo $PING
      /usr/sbin/ping
    

0 0