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

sas*_*har 14 bash shell

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

Kar*_*ath 30

考虑以下多行变量

x=$(echo -e "a\nb\nc d e")
Run Code Online (Sandbox Code Playgroud)

并为每一行提供一个简单的过程:只需echo使用前缀= LINE:并在行周围加上单引号.以下任一代码都将满足该要求:

while read line; do echo "LINE: '${line}'"; done <<< "$x"
Run Code Online (Sandbox Code Playgroud)

要么

while read line; do echo "LINE: '${line}'"; done < <(echo "$x")
Run Code Online (Sandbox Code Playgroud)

既不会创建子shell(因此您可以,例如,在循环中设置变量并在其外部访问它们),以及两个输出

LINE: 'a'
LINE: 'b'
LINE: 'c d e'
Run Code Online (Sandbox Code Playgroud)

但是假设你有

x=$(echo -e "a \n b\nc d e")
# note--------^--^
Run Code Online (Sandbox Code Playgroud)

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

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

要么

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

会产生

LINE: 'a '
LINE: ' b'
LINE: 'c d e'
Run Code Online (Sandbox Code Playgroud)

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

  • @Karoly:我的错误,我使用了错误的引号.双引号用于`gettext`翻译; 单引号用于反斜杠扩展. (2认同)

Set*_*ley 5

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

printf '%s\n' "$var" | while IFS= read -r line
do
   echo "$line"
done
Run Code Online (Sandbox Code Playgroud)

代码取自Unix Stack Exchange 答案

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