$type '[' '[[' 'test'
[ is a shell builtin
[[ is a reserved word
test is a shell builtin
[
和 test
是 Shell
的内部命令,而 [[
是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 ]