Bash循环中子命令出错仍返回0 如何正确返回非0退出码
解决方案
你可以通过新增一个全局状态标记位记录循环过程中是否出现过错误,既不会打断后续迭代执行,也能保证最终退出码符合预期,修改后的代码如下:
#!/bin/bash file_list=("file1 file2 file_nonexistant file3") # 初始化状态标记,0代表无错误,1代表出现过错误 exit_status=0 for file in $file_list do cat $file # 命令执行失败则更新状态标记 if [ $? -ne 0 ]; then exit_status=1 fi done # 脚本最终返回全局状态标记 exit $exit_status
也可以简化为更精简的写法,效果完全一致:
#!/bin/bash file_list=("file1 file2 file_nonexistant file3") exit_status=0 for file in $file_list do cat $file || exit_status=1 done exit $exit_status
原有方案失效原因说明
set -e:bash内置的该参数会在任意命令返回非0退出码时直接终止整个脚本运行,不符合你需要跑完所有迭代的需求done || exit 1:for循环本身的退出码默认等于最后一次迭代的退出码,该写法仅能判断最后一次迭代是否成功,无法覆盖之前的错误cat $file || continue:仅会跳过当前迭代的剩余逻辑,既不会记录错误状态,也不会修改整个脚本的最终退出码
内容的提问来源于stack exchange,提问作者Jack Pettersson
相关产品推荐
相关产品推荐

