为了返回退出状态,未加引号、未声明的变量扩展到什么值0
?
这是我遇到的特定情况的示例:
[ -n $var ]; echo $?
0
[ -n "$var" ]; echo $?
1
var
在这两个测试中,都没有声明该变量。我本可以通过使用 进行测试来省去麻烦-z
,其中引用或不引用显然没有什么区别,但我遇到了这种特殊情况,我开始想知道。我更深入地研究了 bash 执行的所有扩展,但找不到对此行为的任何解释。
作为一般规则,我通常引用变量,但希望这种行为的原因可以帮助我更好地理解引用。
答案1
、test
和命令的行为都是相同的[
,[[
因为它们根据不同的情况执行不同的操作他们给出了多少参数
(不包括结束语]
/ ]]
)。
- 有 1 个参数,如果参数不为空,测试就会成功
- 如果有 2 个参数,则参数被视为一元运算符(例如
-n
)和操作数。 - 有 3 个参数时,参数被视为一个操作数、一个二元运算符(例如
=
)和另一个操作数 - 超过 3 个参数,
test
并[
给出“参数太多”错误,并且[[
可能给出不同的错误(它有一个更复杂的解析器)。
现在,查看[ -n $var ]
示例并与[[
构造进行比较。既然[[
不做分词,它知道变量值在哪里。当var=""
, 给定[[ -n $var ]]
, 参数扩展后,bash 会[[ -n "" ]]
清楚地看到哪个错误的。
但对于test
和[
,分词有效。所以[ -n $var ]
变成[ -n ]
(空字符串消失)。现在,[
看到一个论点这是一个非空字符串,因此是真的。
如果您引用变量:[ -n "$var" ]
,那么您将得到预期的错误结果。