从shell脚本中的变量逐行读取

问题描述 投票:13回答:2

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

bash shell
2个回答
26
投票

考虑以下多行变量

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 line替换为while 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's excellent Bash FAQ


1
投票

虽然我通常使用“while read”来处理多行变量,但我最近有一个实例,它从文件中的每一行中删除了前导空格。用这个来修复我的问题:

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

代码取自this Unix Stack Exchange answer

© www.soinside.com 2019 - 2024. All rights reserved.