我找到了以下命令:
var=""; [ -n $var ] && echo T || echo F
此命令返回 F。在我的理解中,$var是空的,因此命令应返回 T。
我还检查了这个:
[ -n "" ] && echo T || echo F
这如我预期的那样返回 T。
我不明白为什么
[ -n "" ] && echo T || echo F
返回 T 但
var="" [ -n $var ] && echo T || echo F
返回 F?
我在 CentOS6.4 bash4.1.2 上检查了它们
执行摘要:始终引用您的参数扩展,除非您知道为什么不应该引用它。请改用[ -n "$var" ]
。
当未引用时,
[ -n $var ]
扩展到
[ -n ]
也就是说,空字符串从输入中删除,bash
只剩下对[
的单参数调用,这意味着如果参数为非空,则该命令返回 true。 -n
这里不是运算符;它只是一个非空字符串。
您需要引用参数扩展,以便
[ -n "$var" ]
扩展到
[ -n "" ]
这是对 [
的双参数调用,它将按您的预期执行:测试第二个参数是否具有非零长度。
使用变量时输出的这种差异是你没有引用该变量。
当你说:
[ -n $var ] && echo T || echo F
命令行管理程序将其读取为:
'[' -n ']'
并返回T
. 这种情况相当于说[ foo ]
永远是正确的。
另一方面,当你说:
[ -n "" ] && echo T || echo F
命令行管理程序将其读取为:
'[' -n '' ']'
并返回F
.