是否有一种六重用方法来测试Bash中一组命令的退出状态



我有一个简单的脚本,可以从远程服务器中提取数据,因为进程使用 rsync生成它:

while :
do
    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
    rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
    rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
    rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
    sleep 900 #wait 15 minutes, try again
done

如果没有文件,rsync返回退出状态12(显然是)。如果上述 rsync找到任何数据,我想从循环中折断(生成数据可能已退出的过程)。为了减轻任何混乱,我做不是是否想从循环中脱颖而出,即使rsync的1个过程成功。

有没有一种简洁的方法可以在狂欢中做到这一点?

您可以通过添加返回值来做到这一点,因此,如果它们都返回12,则总和为48:

while :
do
    rc=0
    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
    let rc+=$?
    rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
    let rc+=$?
    rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
    let rc+=$?
    rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
    let rc+=$?
    if [[ $rc == 48 ]]; then  # 48 = 4 * 12
         break;
    fi
    sleep 900 #wait 15 minutes, try again
done

请注意,如果您获得了返回代码的另一组合总和为48,即0 0 0 12 36

,这可能会受到影响。

受其他答案的启发,我认为这是我到目前为止可以做到的最清洁的方法...

while :
do
    do_continue=0
    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./ && do_continue=1
    rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./ && do_continue=1
    rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./ && do_continue=1
    rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./ && do_continue=1
    if [[ $do_continue == 0 ]]; then 
       break
    fi
    sleep 900 #wait 15 minutes, try again
done

可以进行更多重构以删除断裂语句和相关的条件测试:

do_continue=1
while [ do_continue -eq 1 ]; do
    do_continue=0
    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./ && do_continue=1
    #...
    sleep 900
done

这样的方式计算由于没有文件而导致的失败数。

while :
do
    nofile=0
    rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
    (( $? == 12 )) && let nofile++
    rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
    (( $? == 12 )) && let nofile++
    rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
    (( $? == 12 )) && let nofile++
    rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
    (( $? == 12 )) && let nofile++
    # if all failed due to "no files", break the loop
    if (( $nofile == 4 )); then break; fi
    sleep 900 #wait 15 minutes, try again
done

相关内容

  • 没有找到相关文章

最新更新