如果我执行以下操作,并且网络已关闭,则将执行零情况,但不应该执行。
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连接失败的零行?
答案 0 :(得分: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
来自manual:
pipefail
如果设置,管道的返回值是最后一个的值 (最右边)命令以非零状态退出,如果全部退出则为零 管道中的命令成功退出。此选项被禁用 默认值。
答案 1 :(得分:0)
这个怎么样(ssh 之后的命令不应该在本地执行):
"$(ssh -n $host 'zfs list -t snapshot -o name -H | grep "tank/fs" | wc -l | awk \'{print $1}\')'"
注意我是如何单独引用ssh命令在远程计算机上运行的。还转发'
的{{1}} awk
,如\'
。检查呼叫的返回值,并仅在返回成功时执行。