変数名で別の変数を呼び出す

変数名で別の変数を呼び出す

今次の道

langs="EN GE"
dir_EN=/xx
dir_GE=/zz

ご覧のとおり、$langs変数には、単一の配列に可能なすべての言語が含まれています。言語が何であるかを確認してから、そのパスを格納するループを使用して、これらのすべてのパスを複数言語(dir_ML)配列に保存したいと思います。これが私が今まで持っているものです

for i in $(seq 0 1); do #I used seq because I didn't know how to specify the length of the variable $langs
    dir_ML[$i]=dir_${langs[$i]}
done

私が探している結果は次のとおりです。

dir_ML[0]=/xx

dir_ML[1]=/zz

私がやろうとしていることを理解してください!事前にありがとう

ベストアンサー1

langs配列ではなくコードの文字列です。

配列で作成して使用します。

langs=( EN GE )
dir_EN=/xx
dir_GE=/zz

dir_ml=()
for i in "${langs[@]}"; do
    declare -n p="dir_$i"
    dir_ml+=( "$p" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

上記のループでは、$isum値が順次取得されますENGEこれも名前参照変えるp。値にアクセスしたときにp変数が宣言されたときに割り当てられた文字列は、変数名として解釈されます。それ変数の値を返します。

上記の出力は次のとおりです。

dir_ml = "/xx"
dir_ml = "/zz"

で名前参照を使用するには、バージョン4.3以降がbash必要です。bash


別の(興味深いが劣る)可能性:

dir_EN=/xx
dir_GE=/zz

# (can't set dir_ml=() here as its name would be picked up by the loop)
unset dir_ml

for i in "${!dir_@}"; do
    dir_ml+=( "${!i}" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

ここでは、$i次の値を使用します。変数名 dir_ENそしてdir_GE順番に。それから私たちは可変間接${!i}変数の値を取得するには、このバリアントに配列は必要ありませんが、langs次のように仮定します。他の変数は名前付けされていませんdir_(ユーザーがそのような名前を持つ変数をスクリプト環境に簡単に注入できるため、これは少し脆弱であると考えられます。)

このコードの出力は上記のコードと同じです。

おすすめ記事