0%

shell 单中括号与双中括号区别

$type '[' '[[' 'test'
[ is a shell builtin
[[ is a reserved word
test is a shell builtin

[testShell 的内部命令,而 [[ 是Shell的关键字

[test

[test 是相等的

$[ 2 < 1 ] && echo True || echo False
zsh: 没有那个文件或目录: 1
False

它就和参数组合为一体被 shell 解释,那样比如 > < 就被 shell 解释为重定向符号

[[

x=1
y=1

$[ $x == 1 && $y == 1 ] && echo True || echo False
-bash: [: missing `]'
False


$[[ $x == 1 && $y == 1 ]] && echo True || echo False
True


$[ $x == 1 -a $y == 1 ] && echo True || echo False
True

[[ 中使用 &&|| 表示逻辑与和逻辑或。[ 中使用 -a-o 表示逻辑与和逻辑或

总结

使用 [[ ... ]] 条件判断结构,而不是 [ ... ],能够防止脚本中的许多逻辑错误。
比如,&&||<> 操作符能够正常存在于[[ ]]条件判断结构中,
但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]]
如果不使用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]