从shell脚本中的变量中逐行读取
答
考虑以下的多行可变
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'
答
虽然我通常使用“while read”来处理多行变量,但我最近有一个实例,它从文件的每一行中删除了前导空格。使用此代替固定我的问题:
printf %s "$var" | while IFS= read -r line
do
echo "$line"
done
这是一个完美的解决方案,只是好奇,为什么不只是x =“a \ nb \ nc d e”? – 2012-08-10 13:13:56
@SenthilKumar,该字符串包含10个字符:'a','\','n','b'等。“\ n”在双引号内不是特殊的。在bash中,可以写'$“a \ nb \ nc d e”'来在字符串中嵌入真正的换行符。 “-e”标志告诉'echo'处理“\ n”作为新行,而不是两个单独的字符。 – chepner 2012-08-10 13:23:32
@chepner:thx,'$'对我来说是新的,但它可以用单引号'$'a \ nb \ nc d e'' – 2012-08-10 14:02:41