Bash中带IFS的while read循环仅打印第一行的原因
问题:Shell脚本读取配置文件仅输出第一行值的原因?
要读取的source.conf配置文件内容如下:
confFileName:"desktop.conf" region:"us-ashburn-1"
对应的Shell脚本:
#!/bin/bash file="config/source.conf" while IFS=: read -r key value unused; do echo "$value" done <$file
运行脚本后仅能打印第一行的"desktop.conf",原因及解决办法如下:
核心原因
最可能的情况是配置文件的最后一行没有以换行符结尾。
在Unix/Linux环境中,read命令依赖换行符识别行结束。当读取到无换行的最后一行时,read能获取到内容,但会返回非零状态码,导致while循环直接终止,不会执行该行的echo操作,因此只能看到第一行输出。
额外注意:脚本中定义的unused变量属于冗余设置——配置每行仅含一个冒号,分割后unused始终为空,这个设置本身不影响当前问题,但如果后续配置行出现多个冒号,value只会取第一个冒号后的第一段内容,剩余部分会被归入unused,需留意这个逻辑。
解决办法
办法1:修正配置文件格式
直接编辑source.conf,在最后一行region:"us-ashburn-1"末尾添加换行符,符合Unix文件的规范格式。
办法2:修改脚本兼容无换行的最后一行
调整循环逻辑,让read返回非零但读取到内容时仍执行处理:
#!/bin/bash file="config/source.conf" while IFS=: read -r key value unused || [ -n "$key" ]; do echo "$value" done < "$file"
这里的|| [ -n "$key" ]会在read返回失败但key不为空时,继续执行循环体,处理无换行的最后一行。
办法3:简化变量读取逻辑
既然配置每行仅含一个冒号,可去掉冗余的unused变量,简化脚本:
#!/bin/bash file="config/source.conf" while IFS=: read -r key value; do echo "$value" done < "$file"
内容的提问来源于stack exchange,提问作者Shagufta Oliveyu Methwani
相关产品推荐
相关产品推荐

