shell编程-各种判断和比较

Scroll Down

2.1 智能化脚本的基础之测试

在Shell 中可以使用多种方式进行条件判断,如[[ 表达式 ]]、[ 表达式 ]或者test 表达式。使用条件表达式可以测试文件属性,进行字符或数字的比较,但是不管使用哪种方式进行判断,系统默认不会有任何输出结果,可以通过echo $?命令查看上一条命令的退出码,或者使用&&和||操作符结合其他命令进行结果的输出操作。

表达式两边必须有空格,否则程序会出错。使用[[]]和test 进行排序比较时,使用的比较符号不同。在test 或[]中不能直接使用<或>符号进行排序比较,如果需要在一行代码中输入多条命令,在shell中可以使用分号; &&和||三个符号把命令分隔,其中:

  • 命令A; 命令B 系统会先执行A命令,不管A命令的执行结果如何再执行B命令,整个命令的退出码以最后一条命令为准,B 命令如果执行成功则退出码为0,B 命令如果执行失败则退出码为非0
  • 命令A && 命令B 仅当前一条命令执行成功后,才会执行后一条命令,A 命令执行失败则不执行B 命令。而整行命令的退出码取决于两条命令是否同时执行成功,如果A 命令执行成功并且B 命令执行也成功,则整行命令的退出码为0,而A 命令或B 命令中的任何一条命令执行失败,则整行命令的退出码为非0
  • 命令A || 命令B ,仅当前一条命令不执行或执行失败后才执行后一条命令。例如,输入“A 命令||B 命令”,因为A 命令是命令行的第一条命令,所以一定会执行,如果A 命令执行成功了就不再执行B 命令,如果A 命令执行失败,则执行B 命令,A 命令和B 命令为二选一的关系。A 命令或B命令中有任何一条命令的退出码为0,则整行命令的退出码就是0,否则返回非0

2.2 字符串的判断和比较

可以使用test和[]来进行字符串判断,使用$?查看上一条命令退出码,0表示正确,非0表示错误
image.png

image.png

在表达式中使用-z 可以测试一个字符串是否为空,下面测试一个未定义的变量TEST,如果变量值为空则屏幕显示Y,否则显示N

注意: 在Shell 中进行条件测试时一定要注意空格问题。使用[]测试时,左方括号右边和右方括号左边都必须有空格。而且测试的比较符号两边也必须都有空格

我们还可以使用-n 测试一个字符串是否非空(变量值不为空)。但是在实际应用时最好将测试对象使用双引号引起来,因为如果一个变量为空时计算机理解空格也是有值的,所以计算结果总为真,不能使用单引号,因为单引号会屏蔽特殊字符。
image.png

2.3 整数的判断和比较

image.png
image.png
grep 命令使用-o 选项可以仅显示匹配内容,而不显示全行所有内容
image.png

2.4 文件属性的判断和描述

image.png
image.png

  • 软链接: 软链接创建后,如果源文件被删除,则软链接将无法继续使用,可以跨分区和磁盘创建软链接
  • 硬链接: 硬链接创建后,如果源文件被删除,则硬链接依然可以正常使用、正常读写数据,但硬链接不可以跨分区或磁盘创建

image.png

image.png

在测试权限时需要注意,超级管理员root 在没有rw 权限的情况下,也是可以读写文件的,rw 权限对超级管理员是无效的。但是如果文件没有x 权限,哪怕是root 也不可以执行该文件

image.png

默认touch 命令创建的文件都是空文件,在使用-s 测试文件是否为非空文件时,因为文件是空文件,所以测试结果为假。当文件中有内容时,测试文件是否为非空时,结果为真
image.png