1

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

另外,当事情发生如此可怕的错误时,我如何输出这个节点命令的标准错误?

最后,当 sh deployserver 失败时我退出的方式是正确的,还是应该以不同的方式完成?

4

4 回答 4

2

要查看最后一个命令是否成功,您可以这样做:

if [ "$?" != "0" ]
    then
        //do something
    fi

stderr 应该可以找到您自己运行脚本的控制台的方法。

于 2012-05-16T16:55:28.497 回答
2

看起来有点奇怪,但这样做是合法的:

sshservers=$( node ... ) || exit 1

请注意,您不需要发出错误消息,因为 node 命令应该在退出之前打印出有用的错误诊断信息。您也可以简单地set -e在脚本开头添加,如果此表单的任何分配终止,这将导致您的脚本中止。赋值的返回值是“inner”命令的返回值,所以通常的技术都适用。

于 2012-05-16T17:19:48.100 回答
1

使用$?,其中包含上次运行命令的退出代码。所以你可以这样做:

sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers`
[[ "$?" == "0" ]] || exit 1

你退出sh deployserver的方式就是我会做的方式。您可以$?根据需要使用,但恕我直言,您拥有它的方式更短更清洁。

于 2012-05-16T16:56:22.117 回答
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 ...
于 2012-05-16T17:22:20.217 回答