bash 变量:扩展名称与模式匹配的变量的值

bash 变量:扩展名称与模式匹配的变量的值

假设在 bash 中我有几个变量:POD3_1、POD3_A、POD3_2、POD3_B 等。每个变量名称都以“POD3”开头。假设我想在命令行上扩展所有变量的值,以便可以在脚本中使用这些值:

for H in $POD3_1 $POD3_A ...
do
...
done

除了像上面那样手动写出每个变量名(因为变量名太多了),有没有办法做到这一点,以便扩展任何与“POD3”匹配的变量名?换句话说,变量的“通配符”姓名

答案1

您可以使用 bash 的花括号扩展。{..} 例如,如果您的变量是 POD3_1、POD3_2 直到 9 和 POD3_A、POD3_B 直到 M,您可以执行以下操作 -

  对于 $POD3_{1..9} $POD3_{A..M} 中的 H
     ...
  完毕

如果变量名不是序列,则可以使用逗号分隔符 - $POD3_{1,A,F}

答案2

您可以简单地循环输出env

env | awk -F = '$1 ~ /^POD3_/ { print $1 }' |
while read var; do
    :
    :
done

Awk 脚本检查每个变量名称,并且仅当其与模式匹配时才打印它。

循环内部是变量的名称,而不是变量的值。在 Bash 中,您可以使用${!var}来插入它;在 POSIX 中sh,我想您必须求助于evak,或者修改循环以直接循环遍历值而不是变量名称。

如果你有多行变量,这种情况仍然会有些糟糕,但误报的概率相当低。(如果你切换到循环值,则情况会更糟。)

答案3

如果您使用的是 bash 版本 4,请使用关联数组,而不必管理数十个变量:

declare -A POD3=(
  [1]=value_1
  [2]=value_2
  [A]="value a"
  [B]="value b"
  [C]="value c"
)

echo "${POD3[A]}"

for key in "${!POD3[@]}"; do
  echo "$key => ${POD3[$key]}"
done

相关内容