为什么空字符串中的[-n $ var]为真?

时间:2015-06-18 18:18:03

标签: linux bash

代码:

#!/bin/bash

EXISTS=""

echo ${#EXISTS} #print size of string

if [ -n $EXISTS ]; then
    echo "It exists!"
else
    echo "It is empty."
fi

if [ -z $EXISTS ]; then
    echo "It is empty."
else
    echo "It exists!"
fi

输出:

0
It exists!
It is empty.

来自man bash

  

-z string

     
    

如果字符串的长度为零,则为真。

  
     

-n string

     
    

如果字符串的长度不为零,则为真。

  

有人可以向我解释-n的这种行为,为什么它不同意-z?谢谢!

2 个答案:

答案 0 :(得分:4)

引用变量或更好地使用BASH中的[[...]]

if [[ -n $EXISTS ]]; then echo "It exists!"; else echo "It is empty."; fi

它将打印:

It is empty.

类似地:

if [ -n "$EXISTS" ]; then echo "It exists!"; else echo "It is empty."; fi
It is empty.

答案 1 :(得分:3)

EXISTS=""
if [ -n $EXISTS ]; then
    ...
fi

[ ... ]的行为取决于结束]之前的参数数量。

如果只有一个参数,它会测试该参数是否为非空。由于字符串"-n"非空,[ -n ]为真。 -n仅在其后跟另一个参数时被解释为运算符。

要解决此问题,请引用参数,使其被解释为单个空参数,而不是无参数:

if [ -n "$EXISTS" ]; then
    ...
fi