因为 test 与 [ 是等价的,我们在之后的部分也偶尔提到它。我们先使用 type 命令检查一下:$ type "test" "[" "[["test is a shell builtin[ is
因为 test
与 [
是等价的,我们在之后的部分也偶尔提到它。
我们先使用 type
命令检查一下:
$ type "test" "[" "[["test is a shell builtin[ is a shell builtin[[ is a reserved word
test
和 [
属于 Shell 的内建命令,[[
属于 Shell 的保留关键字。
而在使用上,test
和 [
等价:
$ test -f file && echo TrueTrue$ [ -f file ] && echo TrueTrue
因为是命令,所以需要跟它的参数使用空格隔开,然后 ]
作为最后一个参数表示条件结束,而像 <
、>
符号就会被理解为重定向,导致错误:
$ [ 1 < 2 ]zsh: no such file or directory: 2
而关键字不同,所以 [[
能够按照常规的语义理解其中的内容:
$ [[ 1 < 2 ]] && echo True || echo FalseTrue
双中括号中的表达式看作一个单独的语句,并返回其退出状态码。
而逻辑与(and)和逻辑或(or)在 [
和 [[
中的用法也不同:
[
中使用 -a
和 -o
参数连接不同的条件,[[
中使用 &&
和 ||
。
$ [ $a == 1 && $b == 1 ] && echo True || echo False[: ']' expectedFalse$ [ $a == 1 -a $b == 1 ] && echo True || echo FalseTrue$ [[ $a == 1 && $b == 1 ]] && echo True || echo FalseTrue
最后,推荐使用 [[
来进行各种判断,这能避免很多错误,比如 $a
为空的情况下,[ $a == 1 ]
就是语法错误,因为 [
命令拿到的实际上只有 ==
、1
、]
三个参数。