変数に配列を割り当てる際の欠点は次のとおりです。 array2=("${array1[@]}")

変数に配列を割り当てる際の欠点は次のとおりです。 array2=(

次のように、ある配列を別の配列にコピーできます。

array2=("${array1[@]}")

このアプローチの1つの欠点は、インデックスが保存されないことである。たとえば、合計インデックスを持つ3つの要素がある場合、array1インデックス合計と合計を持つことになります。125array2123

他の欠点がありますか?

ベストアンサー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}"

おすすめ記事