2016-02-13 116 views
1

我是BASH新手。BASH陣列副本

我有字符串名稱數組,但我需要一套數組作爲數組,而這個數組作爲數組必須包括陣列由\n(新線)分割的字符串,字符串的部分

這是我有:

ARRAY=$'one\ntwo'; 
x=$ARRAY; 
IFS=$'\n' read -rd '' -a y <<<"$x"; 
y=(${x//$'\n'/}); 
IFS=$'\n' y=(${x//$'\n'/ }); 
IFS=$'\n' y=($x); 
unset ARRAY; (i try unset ARRAY) 
ARRAY=$y; (this not works correctrly) 
echo ${ARRAY[1]}; //result ARRAY[0]="one",ARRAY[1]="" 

但如果我嘗試echo ${y[1]}; //一切都是正確的Y [0] = 「一個」 Y [1] = 「兩節」

我的問題是,我不能設置數組作爲y陣列的複製..

+0

請將您想要的結果添加到您的問題。 – Cyrus

+0

ARRAY [0] =「one」 ARRAY [1] =「two」 –

回答

0
ARRAY=$'one one one\ntwo' 
OLD_IFS="$IFS" 
IFS=$'\n' ARRAY=($ARRAY) 
IFS="$OLD_IFS" 
declare -p ARRAY 

輸出:

 
declare -a ARRAY='([0]="one one one" [1]="two")' 
+0

請注意,您正在全局設置IFS,而不僅僅是數組賦值的持續時間。 – chepner

+0

@chepner:謝謝。我已經更新了我的答案。 – Cyrus

+0

請注意,由於路徑名稱擴展,這會中斷。 –

3

你在新行分割字符串的方法是正確的

array=$'one\ntwo' 
IFS=$'\n' read -rd '' -a y <<<"$array" 

現在,你爲什麼給一個不同的名稱,如果最終你想要變量array包含數組?只是這樣做:

IFS=$'\n' read -rd '' -a array <<<"$array" 

如果array在這裏出現兩次都沒有問題。現在


,如果你想副本一個數組,你會做到這一點(假設數組複製被稱爲y在你的例子):

array=("${y[@]}") 

注意,這不會保留數組的稀疏性(但在你的情況下,y不稀疏,所以這沒有問題)。


另一評論:當你做IFS=$'\n' read -rd '' -a y <<<"$array"read將與1返回代碼返回;雖然這不是一個問題,你可能仍然希望通過使return開心:

IFS=$'\n' read -rd '' -a array < <(printf '%s\0' "$array") 

最後一個評論:而不是使用read你可以使用內置mapfile(僅bash≥4.0):

mapfile -t array <<< "$array"