假设在 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