为什么“真实”和“假”测试都是真的?

时间:2015-05-14 04:57:43

标签: linux bash shell command-line-interface

单词“true”和“false”是bash的特殊单词(builtins)。 如果在if测试中使用,它们可以直观地预期:

$ if true; then echo "true"; else echo "false"; fi
true
$ if false; then echo "true"; else echo "false"; fi
false

然而,这两个测试:

$ [[ true ]] && echo "true" || echo "false"
true
$ [[ false ]] && echo "true" || echo "false"
true

两者都是真的。为什么呢?

3 个答案:

答案 0 :(得分:9)

在这种情况下,

onDestroy();相当于[[ … ]],即testtest true。查看测试手册(1):

  

test false STRING的长度为非零

     

-n STRING相当于STRING

-n STRINGtrue都是非空字符串。

答案 1 :(得分:2)

这是因为在您的第一个示例中,true是内置命令。

然而,在你的第二个例子中,true里面的[[ true ]]不被解释为一个命令,而只是被视为一个类似字符串的标记,如果string不为空则返回true。 / p>

第二个例子可以像这样编写来修复:

$ true && echo "true" || echo "false"
true
$ false && echo "true" || echo "false"
false

答案 2 :(得分:0)

当我们使用测试或其等效的[时,我们有时会得到奇怪的结果。让我们试着理解为什么会这样。

我们可以手动进行简单的测试:

$ test 0    && echo "0 is T|$?" || echo "0 is F|$?"
0 is T|0
$ test 1    && echo "1 is T|$?" || echo "1 is F|$?"
1 is T|0

或者

$ [ 0 ] && echo "0 is T|$?" || echo "0 is F|$?"
0 is T|0
$ [ 1 ] && echo "1 is T|$?" || echo "1 is F|$?"
0 is T|0

并且中间震惊的是,上述两项测试均报告为真。 测试告诉我们0等于1吗?

要回答这个问题,我们可以创建一个测试函数并运行this page中出现的所有测试 一个页面,其目的也是用" test"来解释所有细节。借助测试功能,我们可以运行类似于下一个的脚本。它会打印测试结果和函数'的退出值:

#!/bin/bash --
tval(){
    printf "test %s\t" "$1"; shift
    [ "$@" ] && printf "%15s is T|%s" "$*" "$?" || printf "%15s is F|%s" "$*" "$?"
    printf "\n" 
}

tval "zero" "0"
tval "one"  "1"
tval "minus 1"  "-1"
tval "string"   "xyz"
tval "false"    "false"
tval "true"     "true"

tval "empty"    ""
tval "Null"     ""
tval "null var" "$xyz"
tval "\$false"  "$false"
tval "\$true"   "$true"

结果:

test zero                     0 is T|0
test one                      1 is T|0
test minus 1                 -1 is T|0
test string                 xyz is T|0
test false                false is T|0
test true                  true is T|0
test empty                      is F|1
test Null                       is F|1
test null var                   is F|1
test $false                     is F|1
test $true                      is F|1

从上面的所有测试中,一元测试的规则变得清晰:

    The test command has a very simple mind.
    It always works is a very simple way.
Any time the tested value has some content, that is, it's lenght is not zero, it's result is TRUE.

嗯,对于任何一个"一元"这是完全正确的。测试。 即测试对不能用空格分割的值执行。 二进制[ -n $var ]或三元[ 1 -eq "$one" ]的测试 如果条件(-n-eq)有效,则会产生真值 令人惊讶的是,这种(更复杂的)二进制或三元测试更直观易懂。存在大量较长的测试列表,但我觉得这些测试不属于这个简短问题的范围。

在有条件-n的情况下询问var是否为零长度有时会被称为迂腐,因为完全相同的测试没有任何明确的条件。

然而,当明确使用条件-n时,读者通常会更清楚地了解程序员的目标。
条件-z测试"零长度& #34;

通过这些测试:

xyz="str";  tval "-n var"       "-n" "$xyz"
xyz="str";  tval "-z var"       "-z" "$xyz"
one=1;      tval "1 -eq \$one"  "1" "-eq" "$one"
one=2;      tval "1 -eq \$one"  "1" "-eq" "$one"

我们得到:

test -n var              -n str is T|0
test -z var              -z str is F|1
test 1 -eq $one         1 -eq 1 is T|0
test 1 -eq $one         1 -eq 2 is F|1

测试的任何缺失方面?感谢。