我找到了以下命令:
var=""; [ -n $var ] && echo T || echo F
此命令返回F. 根据我的理解,$ var为null,因此命令应该返回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
答案 0 :(得分:2)
使用变量时输出的这种差异是你不引用变量。
当你说:
[ -n $var ] && echo T || echo F
shell将其读作:
'[' -n ']'
并返回T
。这种情况相当于说[ foo ]
,这总是正确的。
另一方面,当你说:
[ -n "" ] && echo T || echo F
shell将其读作:
'[' -n '' ']'
并返回F
。
答案 1 :(得分:2)
执行摘要:总是引用您的参数扩展,除非您知道为什么它不应该。请改用[ -n "$var" ]
。
当没有引用时,
[ -n $var ]
扩展为
[ -n ]
也就是说,从输入中删除空字符串,并且bash
保留一个对[
的单参数调用,这意味着如果参数非空,则该命令返回true。 -n
这里不是运营商;它只是一个非空字符串。
您需要引用参数扩展以便
[ -n "$var" ]
扩展为
[ -n "" ]
这是对[
的双参数调用,它将按预期执行:测试第二个参数的长度是否为非零。