我正在尝试理解 Bash,我想我已经取得了很大进展。我真正不明白的是错误处理...
我有以下脚本:
set -e
set -u
DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP")
if [[ $? != 0 ]]; then
exit 1
fi
即使 downloadApplication 函数失败(我现在预期的结果),脚本也不会失败。我真的不知道在将输出捕获到变量中时如何检查这一点。如果我不将其放回变量中,它会按预期工作并失败:
downloadApplication "$WEB_GROUP"
if [[ $? != 0 ]]; then
exit 1
fi
我有什么选择?谢谢。
答案1
这样的事情怎么样?
DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP" || echo "SomeErrorString")
if [ $DOWNLOADED_ARTIFACT == "SomeErrorString" ]; then
exit 1
fi
这意味着“如果downloadApplication
不成功,则回显SomeErrorString
”(因此您的DOWNLOADED_ARTIFACT
将被设置为SomeErrorString
。然后您可以与该值进行比较。
答案2
该命令DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP")
总是会成功,因为 重要的$?
是对变量的赋值,无论是赋值0
还是1
赋值给,都(几乎)保证成功DOWNLOADED_ARTIFACT
。
答案3
您的错误处理对我来说很好。事实上,set -e
由于未检查结果,脚本在执行和分配行退出。您确定downloadApplication
以正确的退出代码退出吗?尝试downloadApplication "$WEB_GROUP"; echo $?
直接在命令行上执行。
顺便说一下,您可以检查返回代码并在单个语句中捕获输出:
if ! DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP"); then
echo "Download failed"
exit 1
fi
do_something $DOWNLOADED_ARTIFACT