测试-n和测试-z都为真的情况

时间:2012-02-28 16:25:52

标签: linux shell

#! /bin/bash

echo "Please input 2 nums: "

read a b

if [ -z $b ]; then
        echo b is zero !
fi

if [ -n $b ]; then
        echo b is non-zero !
fi

运行脚本时,只输入1个数字,而另一个为空,则b应该为空。但结果是印有回声。

-laptop:~$ ./test.sh 
Pleaes input 2 nums: 
5 
b is zero !
b is non-zero !

b是null还是非null?有人可以对此发表评论吗?谢谢!

3 个答案:

答案 0 :(得分:4)

替换

if [ -z $b ]; then

if [ -z "$b" ]; then

在其他if条件下也一样。

请参阅http://tldp.org/LDP/abs/html/testconstructs.html进行一些有趣的测试。

答案 1 :(得分:3)

一切都在引号中。我不记得在哪里,但有人最近在SO或USE上解释了这一点 - 没有引号它实际上没有进行空/非空字符串测试,只是检查-n-z非空字符串本身。这是同样的测试,使这成为可能:

$ var=-n
$ if [ "$var" ]
then
    echo whut
fi

返回whut

这意味着您还可以进行一种函数式编程:

$ custom_test() {
    if [ "$1" "$2" ]
    then
        echo true
    else
        echo false
    fi
}

$ custom_test -z "$USER"
false
$ custom_test -n "$USER"
true

答案 2 :(得分:1)

-n测试要求在测试括号内引用该字符串。使用带有! -z的未加引号的字符串,或者甚至仅在测试括号中单独使用未加引号的字符串通常有效,但这是一种不安全的做法。始终引用经过测试的字符串。

$ b=''
$ [ -z $b ] && echo YES  # after expansion: `[ -z ] && echo YES` <==> `test -z && echo YES`
YES
$ [ -n $b ] && echo YES  # after expansion: `[ -n ] && echo YES` <==> `test -n && echo YES`
YES

test反对任何事情,屈服true