今次の道
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[@]}"
上記のループでは、$i
sum値が順次取得されますEN
。GE
これも名前参照変える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_
。(ユーザーがそのような名前を持つ変数をスクリプト環境に簡単に注入できるため、これは少し脆弱であると考えられます。)
このコードの出力は上記のコードと同じです。
答え2
これは次の方法で行うことができます。
#!/bin/bash
langs=(EN GE)
dir_EN=/xx
dir_GE=/zz
for i in ${!langs[@]}; do
temp="dir_${langs[i]}"
dir_ML[i]=${!temp}
done
まずこれが配列でなければならないのでlangs="EN GE"
に変更しました。langs=(EN GE)
$(seq 0 1)
また、配列内の各項目に拡張される${!langs[@]}
インデックス(または関連配列の場合は名前)を変更しました。したがって、この例では0 1
。
その後、一時変数をdir_${langs[i]}
(dir_EN
およびdir_GE
)に設定しました。
次に、!
パラメータ拡張を使用してその名前の変数を拡張して要素を設定します。dir_ML