Shell脚本while循环内If Else块执行异常问题排查
问题分析与解决
你的脚本存在两个核心问题,导致出现「仅遍历一行」和「判断总是进入else块」的现象:
- 仅遍历一行:调用
awk时未传入当前循环的行内容,awk会直接读取整个input.json文件的所有内容,一次性输出所有第三列的值,耗尽while循环的输入源,导致循环只执行一次。 - 总是进入else块:由于
awk读取了整个文件,variable1的值是所有第三列的拼接(比如yes\nyes\nyes),和单个字符串yes不匹配,因此条件判断不成立,进入else分支。
修正方案一:给awk传入当前行
通过echo "$line"把当前循环的行传递给awk,让它只处理单行内容:
filename=input.json while IFS= read -r line; do variable1=$(echo "$line" | awk -F',' '{print $3}') if [ "$variable1" = "yes" ]; then echo "Template deployment required" else echo "Template deployment not required" fi done < "$filename"
修正方案二:用shell内置read命令分割列(更高效)
直接在read命令中指定分隔符为逗号,将每行的三列分别赋值给变量,无需调用外部awk命令,性能更优:
filename=input.json while IFS=, read -r col1 col2 col3; do if [ "$col3" = "yes" ]; then echo "Template deployment required" else echo "Template deployment not required" fi done < "$filename"
额外注意事项
- 条件判断中使用
=而非==,=是POSIX标准语法,兼容性更好;==是bash的扩展语法,在部分shell中可能不生效。 - 文件名
"$filename"用双引号包裹,避免文件名包含空格、特殊字符时出现错误。
内容的提问来源于stack exchange,提问作者dream123
相关产品推荐
相关产品推荐

