変数を配列名の一部として使用しますか?

変数を配列名の一部として使用しますか?

たとえば、基本的に繰り返す変数がiアルファベットの各文字を使用するforループがあります。各値を使用して名前付き(たとえば、、、など)i配列を作成したり、単に呼び出したい(したがって配列を、、、などで呼び出すことができます)。"$i"arrayaarraybarraycarraydarray"$i"abcd

これを達成するためにどの構文を使用できますか?

私は試した:

for i in ${alphabet[@]}; do
    "$i"array[0]=0
done

配列グループがある場合は、次の操作を繰り返すことができますか?

for i in ${alphabet[@]}; do
    "$i"array[0]=1
done

答え1

あなたのタスクを実行するための別の方法(連想配列を介して)を提案できますか?よりスマートでより許容できるようです。

declare -A array
for i in ${alphabet[@]}; do
  array[$i]=0
  # or array[${i}0]=0 if you need 
done

for i in ${!array[@]}したがって、またはを介して同じ方法で繰り返すことができます。for i in ${alphabet[@]}

答え2

eval組み込み関数を使用して変数名を計算できます。たとえば、次のようになります。

i="a"
eval ${i}lphabet="abcde"
echo $alphabet

しかし、ここから値を取得するには${i}lphabet別のトリックが必要です。使用する必要があります変数名としての変数(本質的にポインタ)。構文は次のとおりです。

#declare a variable that names the other variable:
pointer=${i}lphabet
#dereference the name with the ! syntax:
echo ${!pointer}

あなたのケースに適用されます:

for i in ${alphabet[@]}; do
    pointer="$i"array
    eval ${pointer}[0]=0
done

しかし、これは悪いデザインです。この問題を処理するより伝統的な方法を見つける必要があります。

答え3

eval変数の内容を変数名として使用する必要があります。

for i in ${alphabet[@]}; do
    eval "$i[0]=1"
done

eval引数を取得してシェルのコンテキストで評価すると(たとえば、別のシェルではない)、これを試すと別のシェルが開始されるため、最初のevalシェルでは変数セットを使用できません。

関連情報