请按照以下示例(请注意 STRING 为空)
获取错误
[root@linux /tmp]# STRING=
[root@linux /tmp]# [ $STRING = dog ] && echo "yes its a dog"
bash: [: =: unary operator expected
无错误的语法
[root@linux /tmp]# STRING=
[root@linux /tmp]# [[ $STRING = dog ]] && echo "yes its a dog"
[root@linux /tmp]# [[ $STRING != dog ]] && echo "yes its a dog"
yes its a dog
为什么当我使用单方括号时,我得到一元运算符?
但是在Double Square括号的情况下,语法会给出好的结果
答案 0 :(得分:4)
与[[ ]]
不同,单个方括号可以像普通命令一样进行分词。可以想象它将参数传递给test
内置。 [[ ]]
是特殊的,其中的变量不会与IFS分开。这就是为什么它更适合使用[[ ]]
,因为它更有效,更安全。
这只是您可以使用[
做的事情之一。使用[
,您可以使用{ }
和( )
来使其正常运行。请注意( )
召唤一个子shell,{ }
总是需要一个分号,这个分号很难看。但是,您可以使用[[ ]]
安全地执行此操作:
[[ a != b && c != d && ( something || something ) ]]
顺便解决您的问题,您必须将变量放在双引号中以防止拆分:
[ "$STRING" = dog ]
[[
不需要它。
Sere Word Splitting:https://www.gnu.org/software/bash/manual/html_node/Word-Splitting.html
添加强>
似乎$STRING
实际上被跳过作为空的而不是分裂的参数。类似地,它被解释为正常命令的概念将适用,并且应用双引号将修复它。
答案 1 :(得分:2)
因为[[
很特别。 [
需要保留Bourne shell兼容性,包括其限制。由于[[
是在bash中单独引入的构造,因此可以修复它。
答案 2 :(得分:1)
搜索起来很困难,但这是经常被问到的。尝试谷歌搜索" bash方括号"你会看到很多关于这个主题的讨论,主要是关于SO:
https://www.google.com/search?q=bash+square+brackets
简短的回答是始终使用[[除非你不知道......