[[复合命令]中的未设置参数是否在bash中为空字符串?

时间:2016-08-26 09:06:09

标签: bash

我正在学习[[复合命令,即句子中的新词。

某些网站包括bashFAQ/31 on What is the difference between test, [ and [[ ?,说它不需要在其中引用参数。   我的问题是未引用的未设置参数究竟发生了什么。   我尝试了以下代码,

unset UNDEF_VAR
[[ ${UNDEF_VAR} = "" ]]
echo "result is $?"

,输出

result is 0

所以,我希望[[]]之间的未设置变量$ {UNDEF_VAR}被翻译为空字符串,与旧的if的情况相反," ["。  但遗憾的是,我无法在上面的网站和bash手册中找到明确的解释。有些网站只是说没有理由就行。  有人知道这个机制,请告诉我。如果我不小心错过了网站/手册中的解释,请原谅我使用你的时间。非常感谢你。

2 个答案:

答案 0 :(得分:2)

据我所知,扩展未设置参数的唯一参考是来自POSIX规范的这句话:

  

参数的值(如果有的话)应该被替换。

这样做的结果是"$foo"是一个空字符串,因为引号之间没有任何值。

bash手册页有关于分词的说法:

  

保留显式空参数(“”或“”)。不带引号的隐含          null参数,由没有参数的扩展产生          价值,被删除。如果在其中扩展了没有值的参数          双引号,null参数结果并保留。

[[ ... ]]内,参数扩展不会进行字拆分,因此不清楚完全,其中“无替换值”变为“空值”。我假设参数扩展被视为隐式引用,无论它们是否实际存在。

答案 1 :(得分:1)

[[版本的行为更像你期望的那样(至少和我一样)。如果变量未设置或为空,则它是独立的。

$ unset foo
$ [[ $foo == "" ]] && echo true || echo false
true
$ foo=""
$ [[ $foo == "" ]] && echo true || echo false
true

[你需要小心。你需要引用它,如果它有可能是空的或未设置的:

$ [ $foo = "" ] && echo true || echo false
bash: [: =: unary operator expected
false
$ [ "$foo" = "" ] && echo true || echo false
true

另请注意,使用[[时,应与==进行比较,如果使用[,请与=进行比较。如果混合使用AFAIR zsh会造成麻烦。

当然,正如@fedorqui所说,比较空字符串应该使用-z