2016-09-28 82 views
0

这一个适用于单行字符串:如何扩展的bash变量中的字符串,并保留换行符

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[*]}" 

如何保存换行符?

+3

您的输入和预期输出是什么? – Inian

+1

这可能是帮助; http://unix.stackexchange.com/questions/27423/how-to-discover-a-new-line-using-a-for-loop –

+0

您的初始前提是,参数为模板系统奠定了良好的基础,现在故障。 – chepner

回答

1

即使我没有完全明白你的目标是什么,
正确引用将保留新的行。

更改此两行:

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

它的工作原理。我正在尝试修改https://github.com/lucaswerkmeister/cheats上的作弊软件包,我的版本(https://gist.github.com/QiangF/565102ba3b6123942b9bf6b897c05f87)将允许多行命令。但是,我仍然需要获取变量的默认值才能工作。 – godblessfq

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变量。

+0

您的方法不保留换行符。 – godblessfq

相关问题