Bash - 使用双方括号和单方括号时

时间:2014-06-02 05:52:03

标签: linux bash shell sh ksh

请按照以下示例(请注意 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括号的情况下,语法会给出好的结果

3 个答案:

答案 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

https://serverfault.com/questions/52034/what-is-the-difference-between-double-and-single-square-brackets-in-bash

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29

简短的回答是始终使用[[除非你不知道......