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

注意用值初始化的变量。我想替换${progs}_MIN_REQ$BASH_MIN_REQ,然后再次替换为初始化时的值 2.05 。在循环内执行此操作for,这样我就可以更轻松地编写代码,因为我只需编写 1 条echo语句而不是 3 条。

实际输出:

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

相关内容