Forループ - 配列名にイテレータを使用して配列に追加する

Forループ - 配列名にイテレータを使用して配列に追加する

次の質問があります。いくつかの値を含む配列がありますarr。各値を異なる宣言された配列のセット、earr$jつまりarr[0]into earr1arr[1]into、earr2および通常はarr[j-1]intoでソートしたいと思いますearr$j。 (後でsと同じ要素をtarget sの次の要素arrとして追加します)。earr$j私は次のコードスニペット(より大きなコードスニペットの一部)を使用してこれを実行しようとしています。

for j in $(seq 1 $number_of_elements); do earr$j+=(${arr[j-1]}); done

私が作るようだと言われました(私の記事「https://unix.stackexchange.com/questions/675454/for-loop-and-appending-over-list-of-arrays」を参照)。 2次元配列(Bashではサポートされていません)私は、Bash構文を不適切に使用した結果に関係なく、これが私の意図ではないことを強調します。以前の投稿でこの問題を正しく説明していないため、再公開します。

ベストアンサー1

質問に文字通り答えるには、通常、次のように機能しますeval

for i in "${!arr[@]}"; do
  eval '
    earr'"$i"'+=( "${arr[i]}" )
  '
done

eval危険ですが、正しく使用すると安全です。エラーのリスクを制限する良い方法は、確実に拡張が必要な​​部分を除いて、すべてを一重引用符で囲み、一重引用符の内側にない部分を確認すること$iです。変数のi)は完全にあなたの制御下にあります。この場合、$i数字のみが含まれることがわかっているため、これはevalシェルコードで評価される任意のデータではありません(逆に一重引用符を${arr[i]}省略したくありません)。

なぜ二次元配列が不適切だと言われるのか、まだ理解されていません。ksh93bashksh93の構文のほとんどをコピーしましたが、多次元配列はコピーしません)から、次のことができます。

for i in "${!arr[@]}"; do
  earr[i]+=( "${arr[i]}" )
done

とにかくシェルを使用する特別な理由がない場合は、@casの言葉に同意しますperlpython

おすすめ記事