我有以下简单的shell脚本:
# get all servers from config
sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers`
#for each server
for server in sshservers
do
#run deployserver with server (server:port format) argument
if ! sh deployserver --server $server
then
exit 1 #failure
fi
done
现在,获取sshservers的node命令可能会返回非零的退出代码。当发生这种情况时,事情发生了可怕的错误,因此我想退出并显示错误消息。
我该怎么做?这会是最合适的方式吗?
sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers`
if ! $?
then
echo "Error: node readconfig tool failed."
exit 1
fi
另外,当出现如此可怕的错误时,如何输出此节点命令的stderr?
最后,当部署服务器失败时我退出的方式是不正确的,还是应该以不同的方式完成?
答案 0 :(得分:2)
要查看最后一个命令是否成功,您可以执行此操作:
if [ "$?" != "0" ]
then
//do something
fi
stderr应该找到它自己运行脚本的控制台。
答案 1 :(得分:2)
看起来有点奇怪,但这样做是合法的:
sshservers=$( node ... ) || exit 1
请注意,您不需要发出错误消息,因为node命令在退出之前应该打印出有用的错误诊断信息。您也可以在脚本的开头添加set -e
,这将导致您的脚本在此表单的任何分配终止时中止。赋值的返回值是“内部”命令的返回值,因此正常的技术都适用。
答案 2 :(得分:1)
使用$?
,其中包含上次运行命令的退出代码。所以你可以这样做:
sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers`
[[ "$?" == "0" ]] || exit 1
退出sh deployserver
的方式就是我这样做的方式。如果你愿意,你可以使用$?
,但你拥有它的方式更短更清洁恕我直言。
答案 3 :(得分:1)
您还可以将作业分配到if
语句中:
if ! sshservers=$(node $scriptDir/readconfig.js --command cluster.sshservers)
then
echo "oops, node command returned non-zero"
exit 1
fi
for server in $sshservers; do ...