当我们使用 test 或其等效的 [ 时,有时会得到奇怪的结果。让我们试着理解为什么会这样。
我们可以手动进行简单的测试:
$ 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
从以上所有测试中,一元测试的规则变得清晰:
test 命令的思路很简单。
它始终有效是一种非常简单的方法。
任何时候测试值有一些内容,
也就是说,它的长度不为零,
它的结果是 TRUE。
嗯,任何“一元”测试都是如此。
即测试对不能用空格分割的值执行。
二进制 [ -n $var ] 或三进制 [ 1 -eq "$one" ] 的测试
如果条件(-n 或 -eq)有效,则返回真值。
令人惊讶的是,这个(更复杂的)二元或三元测试更容易理解。存在大量较长的测试,但我觉得这些超出了这个简短问题的范围。
有时用 -n 条件询问 var 是否不为零长度被称为迂腐,因为在没有任何明确条件的情况下会发生完全相同的测试。
但是,当显式使用条件 -n 时,读者通常会更清楚程序员的目标是什么。
条件 -z 测试“零长度”。
通过这个测试:
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
测试中是否缺少任何方面?谢谢。