【问题标题】:How to get test command return code in the shell?如何在 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'

标签: shell exit-code


【解决方案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 ...
        猜你喜欢
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-05
        • 2021-07-07
        • 1970-01-01
        • 2021-05-29
        相关资源
        最近更新 更多