我知道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"