2016-09-28 33 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

相關問題