Bourne Shell:当内壳命令返回非零退出代码时如何终止?

时间:2012-05-16 16:44:07

标签: shell exit-code sh

我有以下简单的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?

最后,当部署服务器失败时我退出的方式是不正确的,还是应该以不同的方式完成?

4 个答案:

答案 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 ...