是否可以替换变量名中的字符串?

Is it possible to substitute a string inside a variable name?

我有三个这样的数组:

bp_hl_test=("HL05" "HL10" "HL15")
bp_lr_test=("LR001" "LR010" "LR100")
bp_mr_test=("MR001" "MR010" "MR100")

例如,我想删除上述数组是子目录的目录:

- results
-- bp
--- hl
---- HL05
---- HL10
---- HL15
---- HL20
--- lr
---- LR001
---- LR010
---- LR100
--- mr
---- MR001
---- MR010
---- MR100

我正在使用的一些代码如下:

for i in "${bp_hl_test[@]}"; do
  rm -rf ../results/bp/hl/${i}
done
for i in "${bp_lr_test[@]}"; do
  rm -rf ../results/bp/lr/${i}
done
for i in "${bp_mr_test[@]}"; do
  rm -rf ../results/bp/mr/${i}
done

这就是我想要的,但我想知道我是否可以缩短它并多次重复使用一位代码。

bp_test={"hl" "lr" "mr")
bp_hl_test=("HL05" "HL10" "HL15")
bp_lr_test=("LR001" "LR010" "LR100")
bp_mr_test=("MR001" "MR010" "MR100")

for j in "${bp_test[@]}"; do
  for i in "${bp_${j}_test[@]}"; do
    rm -rf ../results/bp/${j}/${i}
  done
done

这行不通,因为据我所知,我不能在这样的变量名中进行替换。有没有办法做到这一点?

我查看了标记的问题,它给我 bad substitution 错误:

for j in "${bp_test[@]}"; do
  for i in "${bp_${!j}_test[@]}"; do
    rm -rf ../results/bp/${j}/${i}
  done
done

您可以破解临时数组中的数组。

for j in "${bp_test[@]}"; do
   a=( $(set | sed -rn '/^bp_'"${j}"'_test=/ s/[^"]*"([^"]*")/" /gp'| sed 's/)$//') )
   for i in "${a[@]}"; do
       echo rm -rf ../results/bp/${j}/${i}
   done
done

请您尝试使用 declare-n 选项进行以下操作:

bp_test=("hl" "lr" "mr")
bp_hl_test=("HL05" "HL10" "HL15")
bp_lr_test=("LR001" "LR010" "LR100")
bp_mr_test=("MR001" "MR010" "MR100")

for j in "${bp_test[@]}"; do
    declare -n ary="bp_${j}_test"
    for i in "${ary[@]}"; do
        echo rm -rf -- ../results/bp/"${j}/${i}"
    done
done

如果看起来不错,请删除 echo