如何在字符串中扩展bash变量并保留换行符

时间:2016-09-28 06:34:06

标签: bash sh

这个适用于单行字符串:

var2="2018"
str="${var1:-hello} world! 
Happy $var2 new year $var2"

newstr=()
for cnt in "$str" ;do
    echo "$cnt"
    [ "${cnt:0:1}" == '$' ] && cnt=${cnt:1} && cnt=${!cnt}
    newstr+=($cnt)
done
newstr="${newstr[*]}"

如何保留换行符?

2 个答案:

答案 0 :(得分:1)

即使我未能完全理解你的目标是什么, 正确引用将保留新行。

更改这两行:

[ "${cnt:0:1}" == '$' ] && cnt="${cnt:1}" && cnt="${!cnt}"
newstr+=("$cnt")

答案 1 :(得分:0)

脚本的目的对我来说是模糊的,但这是我写它的方式逐行阅读:

var2="2018"
str="${var1:-hello} world! 
Happy $var2 new year $var2"

newstr=()
while read cnt; do
    echo "$cnt"
    [ "${cnt:0:1}" == '$' ] && cnt=${cnt:1} && cnt=${!cnt}
    newstr+=($cnt)
done < <(echo "$str")
newstr="${newstr[*]}"

read命令会在另一行之后读取一行。编写它的自然方式是使用管道:

var2="2018"
str="${var1:-hello} world! 
Happy $var2 new year $var2"

newstr=()
echo "$str" | while read cnt; do
    echo "$cnt"
    [ "${cnt:0:1}" == '$' ] && cnt=${cnt:1} && cnt=${!cnt}
    newstr+=($cnt)
done
newstr="${newstr[*]}"

然而,管道创建了一个子shell,并且在while循环中修改的变量一旦退出就会被丢弃,尤其是newstr变量。