2

Bash参考手册

[字符串]

[-n字符串]

如果string的长度不为 0 ,都将返回true

但事实并非如此

greet=

if [ $greet ]; then
    echo '1'
else 
    echo '2'
fi

if [ -n $greet ]; then
    echo '1'
else
    echo '2'
fi

输出为
2
1

Bash参考手册只是说

-n string  
string  

True if the length of string is non-zero.  

那么,这两种形式的真正区别是什么?

4

3 回答 3

4

正如@user1502952 所说,您需要使用双引号;但让我解释一下为什么。假设您执行:

greet=
[ -n $greet ] && echo "it's nonblank"

当 shell 解析该[ -n $greet ]部分时,它会扩展$greet为空字符串,然后进行分词。例如,如果$greet扩展为中间有空格的东西,它会将每个“单词”视为[命令的单独参数。然而,在这种情况下,$greet它扩展为什么都没有,它根本不包含任何“单词”,因此被视为零参数[- 它实际上从命令中消失了。So[ -n $greet ]等价于[ -n ],它检查字符串 "-n" 是否为 nonblank。是的,所以它评估为真。

将此与[ -n "$greet" ]: 进行比较,在这种情况下,双引号允许扩展$greet,但防止分词。所以[命令实际上得到了一个长度为零的第二个参数,意识到它-n应该是一个运算符,并得到预期的答案。

于 2013-09-15T17:53:21.657 回答
1

使用 -n 选项时,需要使用双引号。

 if [ -n "$greet" ]

由于字符串为空,因此上述表达式的计算结果为 false,因为长度为零。

 if [ "$greet" ] 

由于字符串为空,这也评估为 false。

此外,要检查空字符串,可以使用 -z 选项。

if [ -z "$greet" ] 

这将是真的,因为字符串是空的。

也检查此链接:http ://tldp.org/LDP/abs/html/comparison-ops.html

于 2013-09-15T06:20:23.597 回答
0

Bash 在内部[而不是内部执行分词[[,因此如果使用,则不必引用参数[[

$ x=
$ [ -n $x ]; echo $?; [ -n "$x" ]; echo $?
0
1
$ [[ -n $x ]]; echo $?; [[ -n "$x" ]]; echo $?
1
1

type显示[[ $x ]][[ -n $x ]]

$ f() { [[ $x ]]; }; type f
f is a function
f ()
{
    [[ -n $x ]]
}
于 2013-10-13T00:00:14.983 回答