这个问题是Bash conditional based on exit code of command的后续问题.
我理解并利用了对这一问题的公认答案:
$ cat ./txt
foo
bar
baz
$ if ! grep -Fx bax txt &>/dev/null; then echo "not found"; fi
not found
$但是,我无法理解语法来实现一个看似简单的前提:,我如何为命令的特定退出代码编写一个条件呢?
This post指出,如果错误代码> 1,grep可能会失败;因此,我想编写上面的条件,特别是如果grep返回错误代码1,则打印"not“。我如何编写这样的语句?以下几点似乎不起作用(很明显,我在摇晃):
$ # Sanity-check that grep really fails with error code 1:
$ grep -Fx bax txt &>/dev/null
$ echo $?
1
$
$
$ if grep -Fx bax txt &>/dev/null -eq 1; then echo "not found"; fi
$ if grep -Fx bax txt &>/dev/null == 1; then echo "not found"; fi
$ if grep -Fx bax txt &>/dev/null = 1; then echo "not found"; fi
$ if [ grep -Fx bax txt &>/dev/null -eq 1 ]; then echo "not found"; fi
$ if [ grep -Fx bax txt &>/dev/null == 1 ]; then echo "not found"; fi
$ if [ grep -Fx bax txt &>/dev/null = 1 ]; then echo "not found"; fi
$注意:我特别避免先运行命令,然后在条件中使用$?,这是因为对第一个注意到的帖子的公认答案指出了原因。
发布于 2020-05-27 01:17:36
如果您想对不同的错误代码作出不同的响应(而不只是成功/失败,如链接问题中的那样),则需要运行该命令,然后检查$?以获得其特定的退出状态:
grep -Fx bax txt &>/dev/null
if [ $? -eq 1 ]; then
echo "not found"
fi(在我对链接问题的回答中,我描述了测试$?是否为零作为货类编程;这不适用于检查它是否具有特定的非零值。)
请注意,对运行的每个命令都重新设置了$? --包括测试上一条命令中的$?的命令--因此,如果您想使用它执行不止一件事情,您必须立即将它存储在一个变量中,然后对该变量运行测试:
curl "$url"
curl_status=$?
if [ "$curl_status" -eq 6 ]; then
echo "Couldn't resolve host name"
elif [ "$curl_status" -eq 7 ]; then
echo "Couldn't connect to host"
elif [ "$curl_status" -ne 0 ]; then
echo "Some sort of error occurred; curl status was $curl_status"
fi注意,使用!否定命令的成功/失败实际上会破坏特定的错误代码,因为它会将所有非零代码转换为相同的结果:零。如果您想执行与if ! command ...相当的操作,并且仍然可以访问特定的代码,我最喜欢的成语是使用||和一个支撑组,如下所示:
curl "$url" || {
curl_status=$?
...
# Do error handling/reporting based on $curl_status
...
}https://stackoverflow.com/questions/62033740
复制相似问题