如果命令失败,则从标准输出*或*后备设置shell变量

时间:2018-11-30 20:30:29

标签: bash sh

我的脚本调用了一个外部命令(例如readlink),该命令可以:

  • 在成功时将有用的字符串写入其标准输出,或者…
  • 失败时返回非零退出状态

我知道每个人如何做,例如捕获我可以使用的标准输出

MY_VAR=$(readlink /)

或者检查我可以使用的结果:

if readlink /tmp; then
   echo "Success"
fi

但是,有没有一种既清晰又清晰的方式可以同时进行这两项工作?我不确定以下方法是否可以工作:

if MY_VAL=`readlink "$MY_ARG"`; then
    echo "Value is ${MY_VAL}"
else
    echo "Not found"
fi

更新:所以我尝试了,并且没有起作用。但这仅仅是一个巧合,例如碰巧是因为readlink的输出在错误的同时为空?

作为一个特殊的约束,我需要在指定set -e的环境中执行此操作,即,如果其他命令返回错误,则整个脚本将失败。首选通用shell,除非bash具有更好的机制。

3 个答案:

答案 0 :(得分:4)

只是:

if MY_VAR=$(readlink /); then
   echo "Success"
fi

命令替换返回状态是最后执行的命令的返回状态(或在内部执行的子shell的返回状态)。因此$(true; false;)返回非零状态。使用命令替换的行的返回状态等于最后执行的命令。所以:

 a=$(true)$(false)

将始终返回非零返回状态。但是:

 a=$(false)$(true)

将返回零返回状态,因为最后执行的命令替换命令是true,它返回零状态。

在脚本中执行if var=$(...); then是正常的,它可以在保存标准输出的同时检查命令的返回状态。

请勿使用反引号`。它们与$( .. )相同,但可读性较低,不能嵌套且为deprecated

答案 1 :(得分:0)

您可以检查使用$?执行的最后一条命令的退出状态。在shell中,查看它是否包含0表示成功或1表示失败

答案 2 :(得分:0)

所以我的“希望它像本示例一样工作” 正确!

if MY_VAL=$(readlink "$MY_ARG"); then
    echo "Value is ${MY_VAL}"
else
    echo "Not found"
fi

原因是像这样的is the exit code of the command inside这样的变量赋值的“退出代码”。变量赋值发生 ,并且无论成功与否,退出状态都会传播。