次のように、ある配列を別の配列にコピーできます。
array2=("${array1[@]}")
このアプローチの1つの欠点は、インデックスが保存されないことである。たとえば、合計インデックスを持つ3つの要素がある場合、array1
インデックス合計と合計を持つことになります。1
2
5
array2
1
2
3
他の欠点がありますか?
ベストアンサー1
まあ、"${array[@]}"
それは配列の値を提供し、それがすべてです。私はこれが問題になるとは思わない。
ただし、述べたように、インデックスやその他の属性などの値以外には何も提供しません。 Bash配列は読み取り専用であるか、整数または大文字/小文字のプロパティを持つことができます。もちろん、連想配列の場合も同様です。その割り当ての結果は通常のインデックス配列になりますが、インデックスを失うことはより大きな問題です。プロパティは簡単で、配列にどのプロパティが設定されているかを知ることができます。
このような割り当てはarray2=("${array1[@]}")
元の値をすべて削除するため、array2
残りのデータに問題はありません。ただし、属性はarray2
保持され、整数の配列に設定されている場合、その値はarray2
算術式として扱われます。 (と同様にa="1 + 3"; declare -i b=$a; echo $b
「4」を印刷します。)
インデックスもコピーするにはループを使用し、プロパティを手動で設定する必要があります。
# declare -A arr2 # if it was an associative array
arr2=() # clear the target
for k in "${!arr[@]}" ; do arr2[$k]=${arr[$k]} ; done
あるいは、正確なコピー、属性、およびすべてを取得するには、その出力をシェルへの入力として使用できるため、declare -p
すべてのキーと属性をai1
コピーする必要があります。ai2
declare -Ai ai1=([foo]=123 [$'a tricky key\n']=456)
definition=$(declare -p ai1)
eval "${definition/ ai1/ ai2}"
${var/pat/repl}
文字列操作は、すべての値に対する操作と似ています。私はこれについて他の問題があってはいけないと思います。パターンのアスタリスクが最長の一致で誤って配置されたと思いますが、${var/pat/repl}
値全体が消去されます。${var##pat}
"${var/#prefix*/}"
あなたが望むものはおそらくでしょう"${myArray[@]#unwanted-prefix}"
。