You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:00:54