是否可以替换变量名中的字符串?
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
。
我有三个这样的数组:
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
。