通过SSH检查通过命令输出的零线

如果我做了以下事情,并且networkingclosures,那么将执行零个案例,而不应该这样做。

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 ,但今天我发现这个问题,在我的networking检查后失败。

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

我如何确保我实际上计数了zfs输出的零线,而不是从失败的SSH连接中零线?

说:

 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

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

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

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

注意我如何单引号命令ssh在远程机器上运行。 也逃脱了'awk一样\' 。 检查呼叫的返回值,并仅在返回成功时执行。