在 Unix 系统中,退出状态 0 是成功;其他任何事情都是失败的。
test
这与内部操作无关。当条件为真时,该test
命令也返回(退出状态为)0,当条件为假时返回 1。
评论和答案
pfnuesel问:
这总是正确的吗?在某些特定情况下是否没有类似 C 的真/假评估?
指定一个反例......是的,我相信它总是正确的。运行[ "$var" != "value" ]; echo $?
或[[ $var != value ]]; echo $?
类似的命令组合,看看你得到了什么。
i=0; (( i++ )); echo $?
嗯……有趣;这绝对让我停下来思考。它使事情复杂化,但是(假设您同意它从 1 产生echo $?
),我认为这意味着该((
命令正在小心地反转逻辑。如果您((
针对 的各种值对命令运行测试$i
,您会发现当表达式的计算结果为 0 时(就像在您的示例中那样,因为它是一个后增量),然后退出状态为 1,即为 false,但否则,退出状态为 0,这是真的。这适用于bash
and ksh
(我认为是bash
以下ksh
)。
我使用这个脚本来帮助自己澄清事情:
for start in {-3..3}
do
for shell in bash ksh sh
do
output=$($shell -c "i=$start;"' if (( i++ )); then echo $? true $i; else echo $? false $i; fi')
printf "%-4s %4s %s %-5s %s\n" $shell "[$start]" $output
done
done
输出:
bash [-3] 0 true -2
ksh [-3] 0 true -2
sh [-3] 0 true -2
bash [-2] 0 true -1
ksh [-2] 0 true -1
sh [-2] 0 true -1
bash [-1] 0 true 0
ksh [-1] 0 true 0
sh [-1] 0 true 0
bash [0] 1 false 1
ksh [0] 1 false 1
sh [0] 1 false 1
bash [1] 0 true 2
ksh [1] 0 true 2
sh [1] 0 true 2
bash [2] 0 true 3
ksh [2] 0 true 3
sh [2] 0 true 3
bash [3] 0 true 4
ksh [3] 0 true 4
sh [3] 0 true 4
有趣的是,POSIX shell((
语法识别出作为命令的可能性:
如果一个以“”开头的字符序列((
如果前面有一个''会被shell解析为算术扩展,那么$
实现扩展的shell((expression))
可以将“”作为算术表达式来((
计算。而不是分组命令。符合要求的应用程序应确保(
用空格分隔两个前导 ' ' 字符,以防止 shell 执行算术评估。