您实际上不需要此处的引号。这是很少使用无引号的变量是安全的情况之一。您可以通过以下方式确认set -x
:
$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
如上所示,bash将测试的带引号和未引号版本解析为完全相同的内容。对于zsh
我认为支持该[[ ]]
运算符的任何其他外壳来说,也应该如此。
请注意,便携性不是这种情况[ ]
:
$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!
与[ ]
构造不同,该构造[[ ]]
确实需要引用。
一些有用的链接,以了解有关何时以及为何需要报价的更多信息: