如何让Bash中`for i in $(...)`按行分隔遍历变量?
如何让
for i in $(...)中的变量i按行填充? 问题原因
默认情况下,$(...)捕获的命令输出会被Shell按照**IFS(内部字段分隔符)**拆分,默认IFS包含空格、制表符和换行符。所以get_data输出的"bar baz"会被拆成两个独立元素,导致循环分三次执行。
解决方案
方法1:临时修改IFS,仅以换行符作为分隔符
通过修改IFS为换行符,让Shell只按行拆分输出。注意要保存原IFS,避免影响脚本后续逻辑:
#!/bin/bash get_data() { echo foo echo "bar baz" } OLD_IFS="$IFS" # 保存原始IFS IFS=$'\n' # 设置仅按换行符拆分 for i in $(get_data); do echo "got: $i" done IFS="$OLD_IFS" # 恢复原始IFS
方法2:使用while read循环(推荐)
这是处理按行读取的更稳妥方式,无需修改IFS,还能更好处理包含特殊字符的行:
#!/bin/bash get_data() { echo foo echo "bar baz" } get_data | while read -r i; do echo "got: $i" done
这里的-r选项用于禁止read将反斜杠视为转义字符,保证行内容的原始性。
补充说明
for i in $(...)这种写法会触发Shell的分词和路径扩展,不仅空格会拆分内容,如果输出里有通配符(比如*)还会被展开成文件名,而while read则不会有这些问题,更适合处理按行读取的场景。
内容的提问来源于stack exchange,提问作者spraff
相关产品推荐
相关产品推荐

