为什么var =“”; [-n $ var]&& echo T || echo F返回F?

时间:2014-02-28 13:14:03

标签: bash

我找到了以下命令:

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

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 "" ]

这是对[的双参数调用,它将按预期执行:测试第二个参数的长度是否为非零。