首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:基于特定退出命令代码的条件

Bash:基于特定退出命令代码的条件
EN

Stack Overflow用户
提问于 2020-05-27 00:49:30
回答 1查看 113关注 0票数 0

这个问题是Bash conditional based on exit code of command的后续问题.

我理解并利用了对这一问题的公认答案:

代码语言:javascript
复制
$ 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“。我如何编写这样的语句?以下几点似乎不起作用(很明显,我在摇晃):

代码语言:javascript
复制
$ # 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
$

注意:我特别避免先运行命令,然后在条件中使用$?,这是因为对第一个注意到的帖子的公认答案指出了原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-27 01:17:36

如果您想对不同的错误代码作出不同的响应(而不只是成功/失败,如链接问题中的那样),则需要运行该命令,然后检查$?以获得其特定的退出状态:

代码语言:javascript
复制
grep -Fx bax txt &>/dev/null
if [ $? -eq 1 ]; then
    echo "not found"
fi

(在我对链接问题的回答中,我描述了测试$?是否为零作为货类编程;这不适用于检查它是否具有特定的非零值。)

请注意,对运行的每个命令都重新设置了$? --包括测试上一条命令中的$?的命令--因此,如果您想使用它执行不止一件事情,您必须立即将它存储在一个变量中,然后对该变量运行测试:

代码语言:javascript
复制
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 ...相当的操作,并且仍然可以访问特定的代码,我最喜欢的成语是使用||和一个支撑组,如下所示:

代码语言:javascript
复制
curl "$url" || {
    curl_status=$?
    ...
    # Do error handling/reporting based on $curl_status
    ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62033740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档