2

如果我执行以下操作,并且网络已关闭,那么将执行零案例,这是不应该的。

case "$(ssh -n $host zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk '{print $1}')" in
    0)  # do something
        ;;
    1)  # do something else
        ;;
    *)  # fail
esac

在脚本的前面,我检查了我是否可以通过 SSH 访问$host,但今天我发现了这个问题,在我检查后网络立即出现故障。

如果我检查 SSH 命令的返回值,那么我将始终从awk最后执行时获取返回值。

问题

如何确保我实际计算zfs输出的零行,而不是失败的 SSH 连接的零行?

4

2 回答 2

1

说:

set -o pipefail

在脚本的开头(或case语句之前)。

此外,在执行case语句之前检查命令的返回码:

set -o pipefail
$value=$(ssh -n $host zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk '{print $1}')
if [ $? == 0 ]; then
   case $value in
     ...
   esac
fi

手册

pipefail

如果设置,则管道的返回值是以非零状态退出的最后一个(最右边)命令的值,如果管道中的所有命令成功退出,则返回零。默认情况下禁用此选项。

于 2013-09-26T11:38:44.310 回答
0

这个怎么样(ssh 之后的命令不应该在本地执行):

"$(ssh -n $host 'zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk \'{print $1}\')'"

请注意我如何单引号 ssh 在远程机器上运行的命令。也逃过'awkforlike \'。检查调用的返回值,只有在返回成功时才动作。

于 2013-09-26T11:43:05.107 回答