使用外部字符串访问变量。[SHELL 脚本]

Access variables using an external string.[SHELL script]

我目前的代码为

if [[ "$FIRSTFLAG" == 1 ]] ; then
   all_comp+=("FIRST")
fi
if [[ "$SECONDFLAG" == 1 ]] ; then
   all_comp+=("SECOND")
fi
if [[ "$THIRDFLAG" == 1 ]] ; then
    all_comp+=("THIRD")
fi

all_comp 只是一个数组

所以,我正在研究减少重复代码的解决方案
我知道我们可以在这里使用 case
我想知道是否有可以使用数组和 for 循环完成的解决方案 \
例如(我知道它在语法上是错误的)

names=("FIRST" "SECOND" "THIRD")
for i in $names[@]; do
   if [[ ${i}FLAG == 1 ]]; then     <- This line is the issue
      all_comp+=("$i")
   fi
done

所以请告诉我是否有针对此类代码示例的解决方案

需要间接扩展保存构造的变量名,例如iflag=${i}FLAG,那么就可以使用间接扩展${!iflag},例如

FIRSTFLAG=1
SECONDFLAG=0
THIRDFLAG=1
all_comp=()
names=("FIRST" "SECOND" "THIRD")
for i in ${names[@]}; do
   iflag=${i}FLAG
   if [[ ${!iflag} == 1 ]]; then
      all_comp+=("$i")
   fi
done
echo ${all_comp[@]} # Outputs: FIRST THIRD

哦另一个答案,你可以使用算术扩展运算符 (( ))

FIRSTFLAG=1
SECONDFLAG=0
THIRDFLAG=1
all_comp=()
names=("FIRST" "SECOND" "THIRD")
for i in ${names[@]}; do
   if (( ${i}FLAG == 1 )); then
      all_comp+=("$i")
      (( ${i}FLAG = 99 ))
   fi
done
echo ${all_comp[@]} # FIRST THIRD
echo $FIRSTFLAG # 99
echo $SECONDFLAG # 0
echo $THIRDFLAG # 99

参考: