测试 -n 给出意想不到的结果

测试 -n 给出意想不到的结果

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

Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo

重击 4.x

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

答案1

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

在 POSIX shell 的语法中bash$VARIABLE双引号之外是“split+glob”运算符:变量的值被拆分为空格分隔的单词列表,每个单词被解释为通配符模式并替换为匹配文件的名称(如果没有匹配文件,则单独保留)。如果变量的值为空,则拆分后的单词列表为空列表。要获取变量的值而不进行进一步处理,变量扩展需要位于双引号内。

之所以[[有效是因为它是 bash 特殊语法而不是命令;在此特殊语法中,$VARIABLE表示“值”(模式匹配运算符、和的VARIABLE右侧除外)。使用的功能与 相同。以下内容可以满足您的要求:===!==~[test

test -n "$undeclared_variable" && echo "Foo"

相关内容