shell语法

作者: 狼之足迹 | 来源:发表于2016-08-15 20:46 被阅读61次

    条件测试

    shell 条件测试0为真,1为假

    test

    [ ] 

    [[ ]]

    参数之间使用空格隔开

    测试命令

    -d 存在且为目录

    -f 存在且为普通文件

    -z 字符串长度为0

    -n 字符串长度非0

    str1 = str2 字符串相同为真

    str1 != str2 不相同为真

    arg1 op arg2

    -eq 相等
    -ne 不等
    -lt 小于
    -le 小于等于
    -gt 大于
    -ge 大于等于

    逻辑操作


    -a and
    -o or

    两个好的习惯

    X${str1} == X${str2} 字符串比较如果一个为空,那么会错误展开,可以增加前缀防止
    变量取值放在""之间,理由同上

    分支

    if/then/elif/else/fi

    #!/bin/bash
    # ##################
    echo "if..else if fi"
    read num
    if [[ $num -eq 100 ]]; then    #语句放在同一行时应当以分号隔开
        #statements
        echo "num=100"
    elif [[ $num -lt 100 ]]; then
        #statements
        echo "num<100"
    else
       # echo "num>100"
      : #空体应当是用冒号,,冒号作为一个命令,结果总是为真
    fi

    更好做法

    [  ] && {}
    或者[  ] || {}

    case命令

    case/esac

    case $_op in
        "+" )
        (( sum=$num1+$num2 ))
        printf "$num1 $_op $num2 = %s\n" "$sum"
        ;;
      "+")
      :
      ;;
      *)
      ;;

    循环语句

    do/done用于标识一个语句块的开始和结束,可以放在for行用分号隔开

    #!/bin/bash
    for i in {a..z}
    do
        echo "printf val is : $i"
    done

    一个例子:1+2+..+100=1050

    #!/bin/bash
    str=`seq 1 1 100 | tr '\n' '+' | sed 's/+$/\n/'`
    printf ${str}=
    echo `seq 1 1 100 | tr '\n' '+' | sed 's/+$/\n/' | bc `

    执行结果

    1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100=5050

    另一种实现方式
    sum=0
    str=""
    for (( i = 0; i < 101; i++ )); do
        #statements
        (( sum = $i + $sum))
        str=$str${i}
        if [[ $i -eq 100 ]]; then
            #statements 
            break
        fi
        str=$str'+'
    done
    echo ${str}=$sum

    while [ : ];do :;done

    位置参数和特殊变量

    $0 位置参数0
    $1 ...
    $2 ...
    ...
    $# 相当于参数个数argc-1
    $@参数列表...  $1$2$3....
    $* 同上
    $?上一条命令的exitstatus
    $$当前shell的进程号
    位置参数可以使用shift命令左移(覆盖前边的n个参数)会改变$#  $@

    函数

    函数定义

    FUNCNAME(){
    }
    function关键字可选
    函数调用eg is_dir    #不需要参数,参数获取使用$@

    #!/bin/bash
    function is_dir(){
        local dir=$1
        if [[ -d $dir ]]; then
            #statements
            return 0
        else
            return 1
        fi
    }

    调试
    -n 读一遍脚本中命令但不执行,用于检查脚本中的语法错误
    -v
    -x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来

    三种方法使用

    #/bin/bash -x
    $ sh -x ./test.sh
    在脚本中使用set -x 和 set +x 对脚本中某一段代码进行跟踪

    数组

    bash不支持多维数组,并且没有限定数组大小.(无越界之说)下标从0开始

    定义:

    array_name=(value1..valuen)
    或者
    array_name[0]=""
    array_name[3]=""
    array_name[6]=""

    读取
    ${arrname[index]}
    echo ${arr[*]}
    获取字符串长度或者数组长度
    i=${#arr[@]}

    相关文章

      网友评论

        本文标题:shell语法

        本文链接:https://www.haomeiwen.com/subject/pfnusttx.html