bash开启set -euo pipefail后while循环仅执行1次原因求解
问题原因
核心触发点是set -e规则和bash算术表达式的退出码特性共同作用的结果:
set -e的作用是:脚本中任意命令的退出码非0时,立刻终止脚本执行。- bash中
(( 算术表达式 ))这类算术命令的退出码规则为:如果表达式的求值结果等于0,则返回非0退出码;如果表达式的求值结果不等于0,则返回0退出码。 - 你用的是后缀自增
((x++)),该表达式的求值结果为自增前的x值:第一次循环执行到((x++))时,x初始值为0,表达式求值结果为0,因此返回非0退出码,直接触发set -e的终止规则,脚本在第一次循环结束后就停止运行。
set -u(检查未定义变量)和set -o pipefail(管道链错误传播)和本次问题无关,删除set -euo pipefail后相当于关闭了set -e检查,因此循环可以正常执行完所有迭代。
解决方案
可以任选以下一种方式修复,不需要删除整套安全规则:
- 给算术自增语句添加保底返回值,避免触发非0退出:
((x++)) || true - 改用前缀自增语法,表达式求值结果为自增后的非0值,不会返回非0退出码:
((++x)) - 改用普通算术赋值写法,赋值语句的退出码恒为0:
x=$((x + 1))
内容的提问来源于stack exchange,提问作者Saraha
相关产品推荐
相关产品推荐

