测试 -n 给出意外结果

Gre*_*hal 8 shell bash string quoting test

我知道test -n <expression>如果表达式的计算结果为大于 0 的字符串长度,则返回 false。为什么会发生以下情况?

Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo
Run Code Online (Sandbox Code Playgroud)

重击 4.x

我的期望是,既然test -n $undeclared_variable应该评估 false,那么 Foo 不应该被回应。如果我使用[[ ]]而不是测试,它会按预期工作。

jor*_*anm 15

你需要引用你的变量。没有引号,您正在编写test -n而不是test -n <expression>. 该test命令不知道您提供了一个扩展为空的变量。

在POSIX壳等的语法bash$VARIABLE双引号的外面是“分裂+水珠”操作符:所述变量的值被分成的空格分隔单词的列表,并且每个字被解释为一个通配符模式和由取代匹配文件的名称(如果没有匹配文件,则单独保留)。如果变量的值为空,则拆分后的词列表为空列表。要获取变量的值而不进一步处理,变量扩展需要在双引号内。

之所以[[有效是因为它是 bash 特殊语法而不是命令;这个特殊的语法,内$VARIABLE装置“的值VARIABLE”(除了在模式匹配运营商的右手侧===!==~)。Using 的[功能与test. 以下是你想要的:

test -n "$undeclared_variable" && echo "Foo"
Run Code Online (Sandbox Code Playgroud)

  • 为什么`test -n` 无论如何评估为真?我认为如果什么都不通过,那将是错误的。 (3认同)
  • `[[` 在 `bash` 中是特殊的。但是对于任意命令,例如 `test`,未加引号的未定义变量被替换为空(无参数),而 `"$undefined_variable"` 被替换为空字符串的参数(长度 = 0)。 (2认同)