You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本:如何在单个for循环中正确遍历profile与region数组?

Bash脚本遍历AWS Profile和Region的问题修复

问题分析

  1. 变量定义错误:你当前把pfl和rgn定义为多行字符串,而非Bash数组。使用${pfl[@]}这种数组语法调用时,Bash会把整个多行字符串当作单个参数传递,导致AWS CLI把profile名称当成了未知命令选项,从而抛出Unknown options错误。
  2. 循环中Region调用错误:${rgn[$@]}是完全错误的写法,$@代表脚本的位置参数,不是循环的索引或遍历变量,这会导致Region参数无法正确传递。

解决方案1:每个Profile遍历所有Region

如果需要对每个AWS Profile,遍历所有Region执行命令,使用嵌套循环:

#!/bin/bash

# 正确定义为Bash数组
pfl=(
dev
qa
seoul
emea
apac
amec
mde
deploy
getprodkey
phx
)

rgn=(
eu-north-1
ap-south-1
eu-west-3
eu-west-2
eu-west-1
ap-northeast-3
ap-northeast-2
ap-northeast-1
sa-east-1
ca-central-1
ap-southeast-1
ap-southeast-2
eu-central-1
us-east-1
us-east-2
us-west-1
us-west-2
)

# 嵌套循环:每个profile对应所有region
for profile in "${pfl[@]}"; do
    for region in "${rgn[@]}"; do
        echo "=== 正在处理Profile: $profile, Region: $region ==="
        aws ec2 describe-vpcs \
            --region "$region" \
            --profile "$profile" \
            --query "Vpcs[*].{CIDR: CidrBlock, STATE: State}" \
            --output text
    done
done

解决方案2:Profile与Region一一对应执行

如果你的Profile和Region是一一对应的(需保证两个数组长度相同),使用索引循环:

#!/bin/bash

pfl=(
dev
qa
seoul
emea
apac
amec
mde
deploy
getprodkey
phx
)

rgn=(
eu-north-1
ap-south-1
eu-west-3
eu-west-2
eu-west-1
ap-northeast-3
ap-northeast-2
ap-northeast-1
sa-east-1
ca-central-1
)

# 索引循环,一一对应profile和region
for i in "${!pfl[@]}"; do
    profile="${pfl[$i]}"
    region="${rgn[$i]}"
    echo "=== 正在处理Profile: $profile, Region: $region ==="
    aws ec2 describe-vpcs \
        --region "$region" \
        --profile "$profile" \
        --query "Vpcs[*].{CIDR: CidrBlock, STATE: State}" \
        --output text
done

关键修改说明

  • 数组定义:用()包裹元素,每行一个元素,Bash会自动识别为数组元素,避免字符串解析错误。
  • 变量引用:用双引号包裹"$profile"和"$region",防止元素中包含特殊字符时出现解析问题。
  • 循环逻辑:根据实际需求选择嵌套循环(全量遍历)或索引循环(一一对应)。

内容的提问来源于stack exchange,提问作者user2023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:55:18