如何在 shell 中获取测试命令返回码?

Posted

技术标签:

【中文标题】如何在 shell 中获取测试命令返回码?【英文标题】:How to get test command return code in the shell? 【发布时间】:2016-05-03 11:39:09 【问题描述】:

有没有更好的方法在一行中从命令中获取返回码。例如:

$ test $(ls -l) ||echo 'ok'
-bash: test: too many arguments
ok

上面的脚本在测试命令中有错误,因为它似乎解析输出“ls - l”而不是返回代码。

我知道使用“if”语法可以正常工作,但需要多于一行。

ls -l
if [ $? -eq 0 ];then
   echo 'ok'
fi

【问题讨论】:

很不清楚你在问什么。请注意edit 并说明您面临的确切问题是什么? 您误解了test 命令。无需使用它来简单地检查返回码。第二段代码的单行代码是ls -l && echo 'ok' 【参考方案1】:

您可以使用&&|| 使这些东西成为一条线。例如,在下面:

ls -l && echo ok

只有在&& (ls -l) 之前的命令返回0 时,echo ok 才会运行。

另一方面,在以下方面:

ls -l || echo 'not ok'

echo 'not ok' 将仅在|| 之前的命令返回非零时运行。

另外,您可以使用; 使您的if..else 阻止单行:

if ls -l;then echo ok;else echo 'not ok';fi

但这可能会使您的代码难以阅读,因此不推荐。

【讨论】:

【参考方案2】:

if 语句正在捕获命令的返回值,例如 ls

if ls -l; then
    echo 'ok'
fi

【讨论】:

【参考方案3】:

这里的另一个问题是如何在下面的示例中工作。

ls -l xxx || (echo "file xxx not exist" ;  exit 1);echo "OK"

作为示例。如果文件 xxx 不存在。第二个 echo OK 即使之前退出 1 仍然有效。

如果文件 xxx 不存在,我希望退出返回码 1

【讨论】:

【参考方案4】:

而不是使用

test $(ls -l) ||echo 'ok'

你应该使用

[[ $(ls -l) ]] && echo "ok"

[[ ]] 是测试,如果命令成功返回(返回代码为零)然后它在&& 之后执行命令。

[[ ]]测试 $( )执行命令 ls -l 命令运行 && 测试成功则运行

希望这会有所帮助!

【讨论】:

命令执行$(...) 会检查输出文本,而不是返回码。例如检查这个:[[ $(echo abc && false) ]] && echo ok || echo no - 它会打印出“ok” @viraptor,感谢 cmets。上面的答案检查返回值而不是命令的返回文本。您可以通过输入[[ $(ls -l dirDoesNotExist ) ]] && echo "ok" || echo "not ok" 来查看此内容,您将收到“not ok”响应。您包含的命令 [[ $(echo abc && false) ]] 成功执行,因此它按预期返回零返回码。如果您仍然不同意,请告诉我,我们将继续努力。谢谢! 我只想在这里添加一些东西,简写为 if 语句使用 && 和 ||不直接等同于 if , else。如果 && 之后的命令失败,||子句也将运行。示例:[[ true ]] && echo "true";错误的; ||回声“假” @Martin,你是对的。谢谢你的澄清。 @jgshawkey 这不是它在 dirDoesNotExist 的情况下失败的原因。在这种情况下,错误消息会打印到 stderr,因此没有标准输出,这就是检查失败的原因。可以看到[[ $(ls -l dirDoesNotExist 2>&1 ) ]] && echo "ok" || echo "not ok" 成功了。没有重定向,这相当于[[ "" ]] && echo ...

以上是关于如何在 shell 中获取测试命令返回码?的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本:监控HTTP服务的状态(测试返回码)

怎么判断curl调用接口返回成功:响应码

shell脚本:监控HTTP服务的状态(测试返回码)

如何在shell脚本中,判断一个基本命令执行是不是成功

Linux Shell 之 until循环语句

22shell编程-测试