美文网首页
Shell 语句语法详解

Shell 语句语法详解

作者: zplodge | 来源:发表于2017-11-09 19:06 被阅读0次

    Shell 语句语法详解

    shell里的if语句

    if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

    if ... fi 语句;

    if ... else ... fi 语句;

    if ... elif ... else ... fi 语句。

    三种语句格式分别如下所示:

    #####################################

    if [ ! -e "test.sh" ]

    then

        echo "the file is not exit"

        #do something

    fi

    #####################################

    if [ ! -e "test.sh" ]

    then

        echo "the file is not exit"

        #do something

    else

        echo "the  file is exit"

        #do something

    fi

    #####################################

    if [ -e "test1.sh" ]

    then

        echo "the test1 file is exit"

        #do something

    elif [ -e "test2.sh" ]

    then

        echo "the test2 file is exit"

        #do something

    else

        echo "the test1 and test2 file are not exit"

        #do something

    fi

    #####################################


    if语句使用方法

    if语句后的条件需要用方括号括起来,并且方括号里的操作和左右方括号之间需要用括号括起来,例如:

    if [ -e "/home/test.sh" ]

    该语句为判断home路径下是否存在tesh.sh的文件,如果存在则返回true,不存在返回false,同理如果判断文件不存在则可以用如下指令:

    if [ ! -e "/home/test.sh " ]

    此时如果文件不存在则返回true,存在返回false。

    整数比较

    -eq 等于,如:if [ "$a" -eq "$b" ]

    -ne 不等于,如:if [ "$a" -ne "$b" ]

    -gt 大于,如:if [ "$a" -gt "$b" ]

    -ge 大于等于,如:if [ "$a" -ge "$b" ]

    -lt 小于,如:if [ "$a" -lt "$b" ]

    -le 小于等于,如:if [ "$a" -le "$b" ]

    大于(需要双括号),如:(("$a" > "$b"))

    >= 大于等于(需要双括号),如:(("$a" >= "$b"))

    小数据比较可使用AWK

    字符串比较

    = 等于,如:if [ "$a" = "$b" ]

    == 等于,如:if [ "$a" == "$b" ],与=等价

    注意:==的功能在[[]]和[]中的行为是不同的,如下:

    1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true

    2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true

    3 [ $a == z* ] # File globbing 和word splitting将会发生

    4 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true

    一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.

    但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

    != 不等于,如:if [ "$a" != "$b" ]

    这个操作符将在[[]]结构中使用模式匹配.

    大于,在ASCII字母顺序下.如:

    if [[ "$a" > "$b" ]]

    if [ "$a" \> "$b" ]

    注意:在[]结构中">"需要被转义.

    -z 字符串为"null".就是长度为0.

    -n 字符串不为"null"

    文件操作

    [ -a 文件 ] 如果文件存在为真。

    [ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。

    [ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。

    [ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。

    [ -e 文件 ] 为真 如果 文件 存在。

    [ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。

    [ -g 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SGID 位。

    [ -h 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。

    [ -k 文件 ] 为真 如果 文件 存在 而且 他的粘住位已经设置。

    [ -p 文件 ] 为真 如果 文件 存在 而且 是一个 已经命名的管道 (F 如果O)。

    [ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。

    [ -s 文件 ] 为真 如果 文件 存在 而且 比零字节大。

    [ -t FD ] 为真 如果 文件 文件描述符已经打开 而且 指向一个终端。

    [ -u 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SUID (set user ID)位。

    [ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。

    [ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。

    [ -O 文件 ] 为真 如果 文件 存在 而且 属于有效用户ID。

    [ -G 文件 ] 为真 如果 文件 存在 而且 属于有效组ID。

    [ -L 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。

    [ -N 文件 ] 为真 如果 文件 存在 而且 has been mod 如果ied since it was last read。

    [ -S 文件 ] 为真 如果 文件 存在 而且 是一个 socket。

    [ 文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2

    [ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。

    [ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode

    与或非操作

    [ 表达式1 -a 表达式2 ] 如果表达式1 而且表达式2 同时为真则为真 。

    [ 表达式1 -o 表达式2 ] 如果表达式1 或者表达式2 其中之一为真则为真。

    或者是:

    if [[( 表达式1 ) &&( 表达式2 ) || ( 表达式3 )]]

    比如:

    if [[( "$dev_type_config" != "ZC" ) &&( "$dev_type_config" != "ZED" ) && ( "$dev_type_config" != "ZR" )]]


    shell for语句

    # !/bin/bash

    for ((i=0; i<5; i++))

    #for var in {0..5}

    #for var in {0..100..2}

    do

    if ((i==1))

    then

    continue

    fi

    echo "the value is $i"

    done

    do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。

    •Sheel支持列表for循环使用略写的计数方式,1~5的范围用{1..5}表示(大括号不能去掉,否则会当作一个字符串处理)。

    Sheel中还支持按规定的步数进行跳跃的方式实现列表for循环,例如for var in {0..100..2}为以2作为步进长度。


    shell while语句

    while 循环称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句。为了避免死循环,必须保证循环体中包含循环出口条件即表达式存在退出状态为非0的情况。

    #!/bin/bash

    echo "Please input the num "

    read num

    echo "num is $num"

    factorial=1

    while [ "$num" -gt 0 ]

    do

    let "factorial= factorial*num"

    let "num--"

    done

    echo "The factorial is $factorial"

    shell until语句

    until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。

    #!/bin/bash

    i=1

    until [[ "$i" -gt 9 ]]    #大于9

    do

    let "square=i*i"

    echo "$i * $i = $square"

    let "i++"

    done

    shell case语句

    注意下面的case * 并不是所有,而是输入值不在case中,相当于default. 在循环中可以使用continue/break等关键字,非常类似c和java等其他语言的循环。

    #!/bin/bash

    case $1 in

    "install" )

    echo "operation type is install" ;;

    "uninstall" )

    echo "operation type is uninstall" ;;

    * )

    echo "operation type is not support" ;;

    esac

    特殊变量和值

    $#    表示变量的个数,常用于循环

    $@    当前命令行所有参数。置于双引号中,表示个别参数

    $*    当前命令行所有参数。置于双引号中,表示将命令行所有参数当初一个单独参数

    $-(连字号)    在引用数给予Shell的选项

    $?    表示上一个命令退出的状态

    $$    表示当前进程编号

    $0    表示当前程序名称

    $!    表示最近一个后台命令的进程编号

    $HOME    表示当前用户根目录

    $IFS    表示内部的字段分隔符

    $LANG    当前locale默认名称

    $PATH    环境变量

    $PPID    父进程编号

    $PWD    当前工作目录

    下列特殊值可以帮助排查问题

    0    成功退出

    >0    退出失败

    1-125    命令退出失败,失败返回的相关值由程序定义(譬如,程序内退出只执行 exit 2,则返回为2)

    126    命令找到了,但无法执行

    127    命令找不到

    >128    命令因受到信号而死亡

    相关文章

      网友评论

          本文标题:Shell 语句语法详解

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