Shell脚本--test/[]和[[]]

0. 序言

test([]) 和 [[]] 在 Shell 中都是用来检测某个条件是否成立。通过附带选项,可以进行数值、字符串和文件三个方面的检测。

0.1. 与数值比较相关的选项

num1 -eq num2    判断 num1 是否和 num2 相等
num1 -ne num2    判断 num1 是否和 num2 不相等
num1 -gt num2    判断 num1 是否大于 num2
num1 -lt num2    判断 num1 是否小于 num2
num1 -ge num2    判断 num1 是否大于等于 num2
num1 -le num2    判断 num1 是否小于等于 num2

注意:只能用来比较整数。

0.2. 与字符串判断相关的选项

-z str          判断字符串 str 是否为空
-n str          判断宇符串 str 是否为非空
str1 = str2
str1 == str2    =和==是等价的,都用来判断 str1 是否和 str2 相等
str1 != str2    判断 str1 是否和 str2 不相等
str1 > str2     判断 str1 是否大于 str2
str1 < str2     判断 str1 是否小于 str2

注意:>(<) 在 test 中使用时需要加上转义,即:\>(\<)。这样写是为了防止被误认为重定向运算符。而在 [[]] 中则不需要转义。

0.3. 与文件检测相关的选项

文件类型判断
-b filename    判断文件是否存在,并且是否为块设备文件
-c filename    判断文件是否存在,并且是否为字符设备文件
-d filename    判断文件是否存在,并且是否为目录文件
-e filename    判断文件是否存在
-f filename    判断文件是否存在,井且是否为普通文件
-s filename    判断文件是否存在,并且是否为非空
-L filename    判断文件是否存在,并且是否为符号链接文件
-p filename    判断文件是否存在,并且是否为管道文件
-S filename    判断该文件是否存在,并且是否为套接字文件
文件权限判断
-r filename    判断文件是否存在,并且是否拥有读权限
-w filename    判断文件是否存在,并且是否拥有写权限
-x filename    判断文件是否存在,并且是否拥有执行权限
文件比较
filename1 -nt filename2    判断 filename1 的修改时间是否比 filename2 的新
filename -ot filename2    判断 filename1 的修改时间是否比 filename2 的旧

0.4. 与逻辑运算相关的选项

expression1 -a expression     逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才成立
expression1 -o expression2    逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立
!expression                   逻辑非,对 expression 进行取反。

注意:[[ ]] 不能使用 -o 和 -a 选项,只能只用 || 和 &&。

1. test/[]

test 是 Shell 内置命令,其用法为:

test expression

test 命令也可以简写为 [],它的用法为:

[ expression ]

当  expression 成立时,退出状态为 0,否则为非 0 值。

注意 [] 和 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。

使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。

假设 test 命令对应的函数是 func(), 使用如下:

test -z $str
会被替换成
func("-z $str")

如果 str 为空字符串时,那么会被替换成:

func("-z ")

会认为 -z 参数没有选项,分析出错。如果给 $str 加上双引号,则会被替换成:

func("-z \"\"")

很显然, -z 选项后面跟的是一个空字符串(\"表示转义字符),就不会出错。因此,在 test 中使用变量建议用双引号包围起来。

 

2. [[]]

[[]] 是 Shell 内置关键字,其用法为:

[[ expression ]]

当 expression 成立时,退出状态为 0,否则为非 0 值。

注意 [[ ]] 判断 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。

2.1. 特殊点

[[ ]] 在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:

  • 不需要把变量名用双引号包围起来,即使变量是空值,也不会出错。
  • 不需要对 >、< 进行转义,转义后会出错。

[[ ]]  支持 &&、|| 和 ! 三种逻辑运算符

对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个 test 命令连接起来,例如:

[ -z "$str1" ] || [ -z "$str2" ]

也可以借助选项把多个表达式写在一个 test 命令中,例如:

[ -z "$str1" -o -z "$str2" ]

使用 [[ ]] 对上面的语句进行改进:

[[ -z $str1 || -z $str2 ]]

2.2. 支持正则表达式

可以使用 =~ 来检测字符串是否符合某个正则表达式,它的用法为:

[[ str =~ regex ]]

 

posted @ 2023-04-18 15:26  时间在哪  阅读(77)  评论(0)    收藏  举报