次の質問があります。いくつかの値を含む配列がありますarr
。各値を異なる宣言された配列のセット、earr$j
つまりarr[0]
into earr1
、arr[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]}
省略したくありません)。
なぜ二次元配列が不適切だと言われるのか、まだ理解されていません。ksh93
(bash
ksh93の構文のほとんどをコピーしましたが、多次元配列はコピーしません)から、次のことができます。
for i in "${!arr[@]}"; do
earr[i]+=( "${arr[i]}" )
done
とにかくシェルを使用する特別な理由がない場合は、@casの言葉に同意しますperl
。python
。