单词“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
两者都是真的。为什么呢?
答案 0 :(得分:9)
onDestroy();
相当于[[ … ]]
,即test
和test true
。查看测试手册(1):
test false
STRING的长度为非零
-n STRING
相当于STRING
-n STRING
和true
都是非空字符串。
答案 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
测试的任何缺失方面?感谢。