私のbashの例は次のとおりです。
var
最初のケースでは、「alias」を使用して実行したい操作は次のとおりですmyvarA
。
myvarA="variableA"
varname="A"
eval varAlias=\$"myvar"$varname
echo $varAlias
配列変数の2番目のケースとそのメンバーの反復は簡単です。
myvarA=( "variableA1" "variableA2" )
for varItem in ${myvarA[@]}
do
echo $varItem
done
今、私は例1のような「エイリアス」技術を使用する必要がありますが、今回は配列変数について次のようになります。
eval varAlias=\$"myvar"$varname
for varItem in ${varAlias[@]}
do
echo $varItem
done
myvarA
ただし、最後のケースでは、最初のメンバーのみが印刷されます。つまり、eval
変数の値が評価されます。 var配列変数を次eval
のように評価するにはどうすればよいですか?配列変数の名前いいえ変数値。
答え1
パラメータ拡張の最も簡単な形式は次のとおりです${parameter}
。
混乱した状況では、中括弧を使用する方が良い方法です。
「myvarA」配列にスペースが含まれる可能性を考えると、これが答えだと思います。
#!/bin/bash -x
myvarA=( "variable A1" "variable A2" )
varname="A"
eval varAlias=( '"${myvar'${varname}'[@]}"' )
eval varAlias=( \"\${myvar${varname}[@]}\" ) # both works
for varItem in "${varAlias[@]}" # double quote and `@' is needed
do
echo "$varItem"
done
答え2
あなたの答えは配列ではないので、トークン化を行うvarAlias
だけです。for varItem in $varAlias
したがって、元の配列要素にスペースが含まれている場合は、別の単語として扱われます。
次のようにスカラー間接参照を実行できますa=42; b=a; echo ${!b}
。
次のように、スカラー配列に間接的にアクセスできます。
$ j=42; k=55; m=99
$ a=(j k m)
$ echo ${!a[1]}
55
残念ながら、実行したい配列間接参照を実行する満足のいく方法はありません。間接参照を必要としないようにコードを書き換えることができる必要があります。
また、見ることができますバッシュFAQ/006。
答え3
問題を解決しました。最後の例は次のとおりです。
eval varAlias=\${"myvar"$varname[@]}
for varItem in ${varAlias[@]}
do
echo $varItem
done
答え4
上記の許可された答えは完全ではありません。実際の配列割り当てを実行するには、元の配列の周りに括弧がありません。それ以外の場合は、サイズ1の新しい配列が得られます。
私の言葉は:
eval varAlias=\${"myvar"$varname[@]}
次のように変更する必要があります。
eval varAlias=(\${"myvar"$varname[@]})
2つのシナリオを取り、次を実行してこれを確認できます。
echo ${#varAlias[@]}
元の場合、角かっこ内に1が表示され、元の配列に実際の数値または要素が表示されます。どちらの場合も、デフォルトで新しい配列を作成します。