Bashの二重変数の置換

Bashの二重変数の置換

プログラムの断片:

BASH_MIN_REQ="2.05"
BINUTILS_MIN_REQ="2.12"
BISON_MIN_REQ="1.875"

BASH_CURR=$(bash --version | head -n1 | cut -d"(" -f1 | cut -d" " -f4)
BINUTILS_CURR=$(ld --version | head -n1 | cut -d" " -f7)
BISON_CURR=$(bison --version | head -n1 | cut -d" " -f4)

list=(BASH BINUTILS BISON)

for progs in ${list[@]}; do
    echo "$progs: ${${progs}_MIN_REQ}:${${progs}_CURR}"
done

予想出力:

BASH: 2.05:4.3.11
BINUTILS: 2.12:2.24
BISON: 1.875:3.0.2

値で初期化された変数に注意してください。初期化された時の値である 2.05 に変えて、また変えたいと${progs}_MIN_REQ思います。$BASH_MIN_REQループ内でこれを行うと、3つではなく1つのステートメントしかfor作成できないため、コーディングが簡単になります。echo

実際の出力:

bad substitution

echo私は私が何について書いているのか知っていますwrong。しかし、変数を二重に置き換える方法はありますか?それ以外の場合は、多くのechoステートメントを作成する必要があります。

答え1

これにより、間接的にこれを行うことができます。

for progs in ${list[@]}; do
     a="${progs}_MIN_REQ"
     b="${progs}_CURR"
     echo "$progs: ${!a}:${!b}"
done

答え2

for progs in "${list[@]}"; do
  eval 'echo "$progs: ${'"${progs}"'_MIN_REQ}:${'"${progs}"'_CURR}"'
done

関連情報