Bash脚本while循环内调用的函数无法用break/continue?求解决方案
Bash脚本函数如何控制外层while循环的continue/break?
问题根源
continue和break是当前执行上下文的循环控制指令,你的函数在独立的执行环境中运行,它内部没有循环,所以调用continue会直接报错,而且这些指令无法跨上下文影响外层的while循环。
解决方案:用函数返回值传递状态
通过让函数返回不同的退出码,在主循环中根据返回码决定执行continue、break还是继续执行后续逻辑,无需给函数添加额外循环。
1. 修改函数,用返回码代替continue
将函数中原来的continue替换为return 1(非0值表示需要跳过当前循环),符合条件时返回0:
check_approval () { allowed_approvers="abc,def,ghi" if [[ ! ",$allowed_approvers," =~ ",$approver," ]]; then echo "@$approver is not in $team_of_approvers team. Approval not enough for merge. " return 1 fi if [[ $repo_fullname == "sfdc" ]]; then if [[ ! "$approved_id" == "1111"* ]]; then echo "@$approver's approval is not valid." return 1 else echo "@$approver's approval is valid." return 0 fi fi return 0 }
2. 在主循环中根据返回值执行控制逻辑
调用函数后,通过判断返回码来执行外层循环的continue:
# 注意:建议用$(...)代替反引号,避免嵌套解析问题 cat pr_approvals.txt | while read -r approval; do if [ "$approval" == "" ]; then echo "No approval found." else approved_id=$(echo "$approval" | cut -d ' ' -f1) approver=$(echo "$approval" | cut -d ' ' -f2) # 调用函数,若返回非0则跳过当前循环 if ! check_approval; then continue fi echo "Last code commit in $3 PR #$1 is approved by @$approver. Proceed. " fi done
扩展:如果需要终止整个循环(break)
可以让函数返回不同的退出码区分“跳过当前”和“终止全部”,比如:
- 函数中需要终止循环时返回
2 - 主循环中判断:
check_approval case $? in 1) continue ;; # 跳过当前 2) break ;; # 终止整个循环 *) ;; # 正常执行后续逻辑 esac
内容的提问来源于stack exchange,提问作者Vic
相关产品推荐
相关产品推荐

