zoukankan      html  css  js  c++  java
  • 【重点】Shell入门教程:流程控制(3)条件判断式的真假值

    之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断。传回0,即为真;传回非0,即为假。

    在Bash中,这种可以影响程序流程的式子,称为条件判断式。判断式的操作数分成“单元”及“二元”两种。如“-f 文件”可测试文件是否存在,运算符 -f 后接一个操作数“文件”,这种判断式称为“单元”;如“参数 1 -gt 参数2”可测试“参数1”的值是否大于“参数2”,运算符 -gt 的左右各接一个要比较的参数,这种判断式称为“二元”。大多数“单元”的判断式用于判断文件的相关属性,少数用于测试字符串和Bash的选项。

    1.关于文件属性的判断式

    Bash关于文件属性的条件判断式,如下表:

    序号判断式在什么情况下为真
    1 -a 文件 如果文件存在
    2 -b 文件 如果文件存在,且该文件是区域设备文件
    3 -c 文件 如果文件存在,且该文件是字符设备文件
    4 -d 文件 如果文件存在,且该文件是目录
    5 -e 文件 如果文件存在(注意,有可能是目录名)
    6 -f 文件 如果文件存在,且该文件是一般文件
    7 -g 文件 如果文件存在,且该文件设立了 set group id 属性
    8 -h 文件 如果文件存在,且该文件是符号链接文件
    9 -k 文件 如果文件存在,且该文件设立了 sticky 位的属性
    10 -p 文件 如果文件存在,且该文件是管道文件(FIFO)
    11 -r 文件 如果文件存在,且该文件具有可读取的属性
    12 -s 文件 如果文件存在,且该文件的文件大小大于0
    13 -t 文件描述符 如果文件描述符是开启的,且链接了某一个终端
    14 -u 文件 如果文件存在,且该文件设立了 set user id 属性
    15 -w 文件 如果文件存在,且该文件可写入的属性
    16 -x 文件 如果文件存在,且该文件有可执行的属性
    17 -O 文件 如果文件存在,且该文件为有效的使用者 id 所拥有
    18 -G 文件 如果文件存在,且该文件为有效的群组 id 所拥有
    19 -L 文件 如果文件存在,且该文件是符号链接文件
    20 -S 文件 如果文件存在,且该文件是 socket 文件
    21 -N 文件 如果文件存在,且该文件自上次读取后,曾修改过
    22 文件1 -nt 文件2 如果文件1 比 文件2 新;或文件1存在,但文件2不存在
    23 文件1 -ot 文件2 如果文件1 比 文件2 旧;或文件2存在,但文件1不存在
    24 文件1 -ef 文件2 如果文件1 和 文件2 参考到相同的设备和 inode 编号

    举例:

    #!/bin/bash
    
    [ -e "/etc/hosts" ] || (echo '/etc/hosts 文件不存在.'; exit 1)
    if [ "$?" -eq 1 ]; then
    	exit
    fi
    echo '/etc/hosts 文件存在,后续处理继续执行下去...'

    行3,使用 -e 判断 /etc/hosts 这个文件是否存在,如果不存在,则 () 开启一个字 shell,显示文件不存在的信息,然后传回离去状态值 1。

    行4,如果离去状态为1,就结束script。

    2.关于字符串的条件判断式

    Bash关于字符串的条件判断式,如下表:

    序号判断式在什么情况下为真
    1 -z 字符串 如果字符串长度为 0 (即空字符串)
    2 -n 字符串 如果字符串长度不为 0 (即非空字符串)
    3 字符串 如果字符串不为 0
    4 字符串1 == 字符串2 如果两个字符串相等
    5 字符串1 = 字符串2 如果两个字符串相等
    6 字符串1 != 字符串2 如果两个字符串不相同
    7 字符串1 < 字符串2 如果字符串1 小于 字符串2
    8 字符串1 > 字符串2 如果字符串1 大于 字符串2

    特别注意:如果 < 和 > 出现在 [ ] 或 test 命令中,要用 转义特殊字符的意义,即要写成:[ 字符串1 < 字符串2 ] 和 [ 字符串1 > 字符串2 ];但如果出现在 [[ ]] 中,则不必。

    #!/bin/bash
    
    if [ "$LOGNAME" != "root" ]; then
    	echo '本程序须使用root权限执行.'
    	exit 1
    fi
    
    echo '现在正在以root权限执行本程序.'

    在对比字符串时,最好把变量名称用双引号含括,以免变量内容为空时造成语法错误。以下示例是不好的写法:

    #!/bin/bash
    
    NAME=$1
    
    if [ $NAME = "Joy" ]; then
    	echo '你是Joy'
    else
    	echo '你不是Joy'
    fi
    

    行5,如果变量$NAME的值为空,会造成if语法不完成的错误:

    if [ = "Joy" ]; then

    正确的写法:

    #!/bin/bash
    
    NAME=$1
    
    if [ "$NAME" = "Joy" ]; then
    	echo '你是Joy'
    else
    	echo '你不是Joy'
    fi
    

    另外,为了提高移植性,让script可在其他shell环境中执行,如传统的Boune Shell,会利用以下技巧来判断字符串是否相等,以避免空值变量造成语法错误:

    #!/bin/bash
    
    NAME=$1
    
    if [ X"$NAME" = X"Joy" ]; then
    	echo '你是Joy'
    else
    	echo '你不是Joy'
    fi

    行5,如果 $NAME 为空,式子变成:

    if [ X = X"jOY" ]; then

    这样,可保证语法完整。这里的 X,可换成其他任一英文字符。

    3.关于算式的条件判断式

    所谓算式,在此指其值或运算结果是数值(如 整数、非字符串)

    序号判断式在什么情况下为真
    1 参数1 -eq 参数2 参数1 和 参数2 的值相等
    2 参数1 -ne 参数2 参数1 和 参数2 的值不相等
    3 参数1 -lt 参数2 参数1 的值小于 参数2
    4 参数1 -le 参数2 参数1 的值小于或等于 参数2
    5 参数1 -gt 参数2 参数1 的值大于 参数2
    6 参数1 -ge 参数2 参数1 的值大于或等于 参数2

    举例:

    #!/bin/bash
    
    declare i len
    len=$1
    
    if [ $len -eq 100 ]; then
    	echo '长度100'
    else
    	echo "长度不是100,而是$len"
    fi

    行4,由命令行位置参数$1,取得len的变量值。

    4.关于Bash选项的条件判断式

    序号判断式在什么情况下为真
    1 -o set的选项名称 如果该选项是开启的状态

    举例:

    #!/bin/bash
    
    set -o
    
    if [ -o history ]; then
    	echo 'Bash选项history开启'
    else
    	echo 'Bash选项history关闭'
    fi

    行3,使用set命令行选出目前Shell中的选项。

    行5,判断history选项是否开启。

  • 相关阅读:
    梯度
    正则化、方差、偏差
    K近邻python
    感知器python
    使用 Admission Webhook 机制实现多集群资源配额控制
    微众银行案例|容器化实践在金融行业落地面临的问题和挑战
    一个优秀的云原生架构需要注意哪些地方
    如何根据不同业务场景调节 HPA 扩缩容灵敏度
    如何使用容器镜像服务 TCR 轻松实现容器 DevOps
    腾讯云联合多家生态伙伴,重磅开源 SuperEdge 边缘容器项目
  • 原文地址:https://www.cnblogs.com/52php/p/5669931.html
Copyright © 2011-2022 走看看