bash 中未加引号的空变量扩展为什么?

bash 中未加引号的空变量扩展为什么?

为了返回退出状态,未加引号、未声明的变量扩展到什么值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" ],那么您将得到预期的错误结果。

相关内容