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 line为while 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常见问题解答.
虽然我通常使用“while read”来处理多行变量,但我最近有一个实例,它删除了文件中每行的前导空格。使用它解决了我的问题:
printf '%s\n' "$var" | while IFS= read -r line
do
echo "$line"
done
Run Code Online (Sandbox Code Playgroud)
编辑:按照 Nicolae Iotu 的建议更新以修复最后一行问题
| 归档时间: |
|
| 查看次数: |
34978 次 |
| 最近记录: |