我在 Linux 上运行这个:
$ number=4
$ test $number -eq 4
$ echo $?
0
$ test $number -lt 2
$ echo $?
1
结果(0 和 1)正确吗?
答案1
在 Unix 系统上,如果实用程序执行顺利、成功且没有错误等,则实用程序将返回零退出状态。如果实用程序失败,它将返回非零退出状态。
这样,就可以通过退出状态告诉用户什么时候出错了(参见“退出值”或某些手册的类似部分,例如 的手册rsync
)。简而言之,如果操作成功,退出状态为零,如果不为零,则失败,退出状态可能会说明失败的原因。
您使用的实用程序test
遵循此模式,如果比较成功(为“true”),则返回零。如果比较(或它执行的任何操作)失败(它是“假”),它将返回一个非零退出状态。
该if
关键字采用一个实用程序并对其退出状态起作用。如果实用程序返回零退出状态,则它将采用默认分支,否则它将采用以下else
分支:
if test 4 -eq 3; then
echo 4 is 3
else
echo 4 is not 3
fi
if
可以采用任何实用程序:
if grep -q 'secret' file.txt; then
echo file.txt contains secret
else
echo file.txt does not contain secret
fi
if mkdir mydir; then
echo created directory mydir
else
echo failed to create directory mydir
fi
答案2
按照惯例,0
这意味着操作成功,除 0 以外的任何值都是错误。因此,如果$?
是0
,则测试成功,如果不是0
,例如如果是1
,则测试失败。
如果你运行这个,你也许会更清楚地看到这一点:
$ number=4
$ if test $number -eq 4; then echo "YES ($?)"; else echo "NO ($?)"; fi
YES (0)
$ if test $number -lt 2; then echo "YES ($?)"; else echo "NO ($?)"; fi
NO (1)
答案3
shell 不是C
。在C
0 为假时,其他一切都为真。在 shell 0 为真/成功时,其他一切都为假。这是因为失败的方法有很多种,但成功的方法只有一种。
具体来自测试的信息页面。
Exit status:
0 if the expression is true,
1 if the expression is false,
2 if an error occurred.