如何用Bash for循环遍历AWS CLI describe-images结果实现AMI跨区域复制
问题原因
你当前获取的AMI_LIST是ID和名称按空格交替拼接的单串文本,直接用for ami in $AMI_LIST遍历时,每次循环只会拿到单个ID或者单个名称,并非成对的ID+名称组,所以${ami[0]} ${ami[1]}无法取到对应的值。
解决方案
推荐两种可直接运行的实现方式:
方案1:逐行读取(兼容性最优,支持镜像名称带空格的场景)
直接通过管道将查询结果逐行传给read命令,自动拆分每行的ID和名称:
aws ec2 describe-images --filters "Name=tag:Name,Values=*one*,*two*,*three*,*four*" \ "Name=state,Values=available" "Name=tag:Name,Values=${CUSTOMER_NAME}*" \ --query 'Images[*].{ID:ImageId,NAME:Name}' --output text | while read -r ami_id ami_name; do aws ec2 copy-image --source-image-id "$ami_id" --source-region us-east-1 --region us-west-2 --name "$ami_name" # 可选添加sleep 1避免触发AWS API调用频率限制 done
方案2:数组步长遍历
先把所有查询结果存入bash数组,再按步长为2遍历,每次取一组ID和名称:
# 将查询结果存入数组 ami_array=($(aws ec2 describe-images --filters "Name=tag:Name,Values=*one*,*two*,*three*,*four*" \ "Name=state,Values=available" "Name=tag:Name,Values=${CUSTOMER_NAME}*" \ --query 'Images[*].{ID:ImageId,NAME:Name}' --output text)) # 步长为2遍历数组 for ((i=0; i<${#ami_array[@]}; i+=2)); do aws ec2 copy-image --source-image-id "${ami_array[i]}" --source-region us-east-1 --region us-west-2 --name "${ami_array[i+1]}" done
内容的提问来源于stack exchange,提问作者itsme
相关产品推荐
相关产品推荐

