首页 > 解决方案 > 是否可以在变量名中替换字符串?

问题描述

我有三个这样的数组:

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

标签: bashsubstitution

解决方案


请您尝试以下-n选项declare

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.


推荐阅读