2013-07-18 27 views
7

空の要素で配列をコピーしているbash(ver 4.2.25)に問題があります。私が別の変数に配列のコピーを作ると、空の要素はコピーされません。空の要素を持つBash配列をコピーする

#!/bin/bash 

array=('one' '' 'three') 
copy=(${array[*]}) 

IFS=$'\n' 

echo "--- array (${#array[*]}) ---" 
echo "${array[*]}" 

echo 
echo "--- copy (${#copy[*]}) ---" 
echo "${copy[*]}" 

私はこれを行うと、ここで出力されます:

--- array (3) --- 
one 

three 

--- copy (2) --- 
one 
three 

元の配列が空の要素を含む、すべての3つの要素がありますが、コピーはしません。私はここで間違って何をしていますか?

答えて

15

引用問題があり、ではなく、@を使用する必要があります。使用:配列の任意の要素は、${name[subscript]}を使用して参照することができる

bash(1) man pageから

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

。 パス名展開との競合を避けるために、中括弧が必要です。 subscript@または*であれば、言葉はnameのすべてのメンバーに展開されます。これらの の添え字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている 場合、${name[*]}IFS 特殊変数の最初の文字で区切られた各アレイメンバーの 値を有する単一の単語に展開され、そして${name[@]}nameの各要素を拡大します別の言葉に

その変更後の出力例:

--- array (3) --- 
one 

three 

--- copy (3) --- 
one 

three 
+0

を行うことができますちょうどそれを試してみましたが、残念ながら何も変わっていません。 –

+0

私はそれを疑う - あなたは '@'と二重引用符の両方を持っていますか?私はいくつかの出力例を追加しました。 –

+0

ああ、二重引用符!申し訳ありませんが、二重引用符は表示されませんでした。うん、それはうまくいった。だから私を助け、なぜ引用符でこの仕事をするのですか? –

1

Bash 4.3以降では、あなたがこの

$ alpha=(bravo charlie 'delta 3' '' foxtrot) 

$ declare -n golf=alpha 

$ echo "${golf[2]}" 
delta 3 
関連する問題