Bash 評価配列変数名

Bash 評価配列変数名

私の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が表示され、元の配列に実際の数値または要素が表示されます。どちらの場合も、デフォルトで新しい配列を作成します。

関連情報