たとえば、基本的に繰り返す変数がi
アルファベットの各文字を使用するforループがあります。各値を使用して名前付き(たとえば、、、など)i
配列を作成したり、単に呼び出したい(したがって配列を、、、などで呼び出すことができます)。"$i"array
aarray
barray
carray
darray
"$i"
a
b
c
d
これを達成するためにどの構文を使用できますか?
私は試した:
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
シェルでは変数セットを使用できません。