如何在不终止Bash脚本的情况下停止执行某组指令?
Bash脚本分组执行:组内出错即停组,脚本继续运行
要实现组内任意命令执行失败时立刻终止当前组(不执行组内后续命令),但整个脚本继续执行其他组的需求,不用函数或单独脚本,最直接的方式是用单次循环模拟组的执行逻辑,利用循环的break特性实现组内退出。
修正后的示例代码
#!/bin/bash # 第一组:用单次while循环实现出错即停 while :; do echo "first group" # 开启严格错误检查,仅在当前循环内生效 set -eo pipefail ls non_existing_directory # 这条命令执行失败,触发提前退出循环 echo "unreachable line" # 永远不会执行到这里 break # 所有命令成功时正常退出循环 done # 关闭严格错误检查,避免影响后续组 set +e # 第二组:不受第一组失败影响,正常执行 { echo "second group" }
为什么原来的代码不行?
原来的{...}是命令组,属于当前shell进程的一部分,set -eo pipefail会全局生效,一旦组内命令失败,整个脚本会直接终止,无法继续执行后续组。而while循环的作用域可以把set -e的影响限制在组内,失败时仅跳出循环,不会终止整个脚本。
简化写法(无需手动管理set状态)
如果不想修改全局的错误检查设置,可以用&&串联命令,只要某条命令失败,后续命令就不会执行,直接退出循环:
#!/bin/bash while :; do echo "first group" && ls non_existing_directory && echo "unreachable line" && break done { echo "second group" }
扩展:组内命令成功时停止执行
如果你的需求是组内某条命令返回0(执行成功)时停止组执行,只需在成功时手动调用break:
while :; do echo "first group" ls existing_directory && break # 命令成功时立刻跳出循环 echo "这条只有在ls失败时才会执行" break done
内容的提问来源于stack exchange,提问作者mouse_00
相关产品推荐
相关产品推荐

