我的脚本调用了一个外部命令(例如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具有更好的机制。
答案 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这样的变量赋值的“退出代码”。变量赋值发生 ,并且无论成功与否,退出状态都会传播。