2012-08-10 62 views

回答

21

考虑以下的多行可变

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

+0

这是一个完美的解决方案,只是好奇,为什么不只是x =“a \ nb \ nc d e”? – 2012-08-10 13:13:56

+0

@SenthilKumar,该字符串包含10个字符:'a','\','n','b'等。“\ n”在双引号内不是特殊的。在bash中,可以写'$“a \ nb \ nc d e”'来在字符串中嵌入真正的换行符。 “-e”标志告诉'echo'处理“\ n”作为新行,而不是两个单独的字符。 – chepner 2012-08-10 13:23:32

+0

@chepner:thx,'$'对我来说是新的,但它可以用单引号'$'a \ nb \ nc d e'' – 2012-08-10 14:02:41

1

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

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

代码取自this Unix Stack Exchange answer

相关问题