我正在学习[[
复合命令,即句子中的新词。
某些网站包括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手册中找到明确的解释。有些网站只是说没有理由就行。 有人知道这个机制,请告诉我。如果我不小心错过了网站/手册中的解释,请原谅我使用你的时间。非常感谢你。
答案 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
。