14

我有一个多行的脚本变量。我如何遍历这个变量来逐行读取它并按照我想要的方式处理每一行?

4

2 回答 2

34

考虑以下多行变量

x=$(echo -e "a\nb\nc d e")

每行都有一个简单的过程:只是echo它带有前缀 =LINE:并在行周围带有单引号。以下任一代码都将满足该要求:

while read line; do echo "LINE: '${line}'"; done <<< "$x"

或者

while read line; do echo "LINE: '${line}'"; done < <(echo "$x")

两者都不创建子shell(因此您可以,例如,在循环中设置变量并在循环之外访问它们),并且都输出

LINE: 'a'
LINE: 'b'
LINE: 'c d e'

但是假设你有

x=$(echo -e "a \n b\nc d e")
# note--------^--^

并且前导和尾随空格对您的应用程序很重要(例如,解析 Git 瓷器)。上述两个代码都将为后一个变量/数据提供与前一个完全相同的输出,这不是您想要的。要保留前导和尾随空格,请替换while read linewhile IFS= read -r line. 即以下任一代码

while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x"

或者

while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x")

会产生

LINE: 'a '
LINE: ' b'
LINE: 'c d e'

有关详细信息,请参阅Greg Wooledge 出色的 Bash 常见问题解答

于 2012-08-10T13:02:26.460 回答
4

尽管我通常使用“读取时”来处理多行变量,但我最近有一个实例,它从文件中的每一行中删除了前导空格。使用它来解决我的问题:

printf '%s\n' "$var" | while IFS= read -r line
do
   echo "$line"
done

取自此 Unix Stack Exchange 答案的代码。

编辑:更新以修复 Nicolae Iotu 建议的最后一行问题

于 2014-03-20T22:36:27.973 回答