如何修复Bash中执行AWS CLI命令最多重试5次直到成功的报错脚本
错误原因
报错[0: command not found的根源是AWS CLI命令中--query参数的内容没有用引号包裹,Shell会将参数中的Connections[0]里的方括号识别为通配符进行解析,异常场景下会把[误判为test命令的开头,触发语法错误。
修复后完整脚本
#!/bin/bash retry_times=5 counter=0 # 注意提前替换为你实际的 replication instance ARN,原脚本未赋值该变量会导致查询异常 ri_arn="your-replication-instance-arn" # 首次查询状态,加--output text直接返回纯文本,避免JSON返回自带双引号的干扰 ri_status=$(aws dms describe-connections \ --filter "Name=replication-instance-arn,Values=$ri_arn" \ --query='Connections[0].Status' \ --region us-east-1 \ --output text) until [[ $ri_status == "successful" ]] do ((counter++)) if (( counter > retry_times )); then echo "Failed! 已达到最大重试次数${retry_times}次" exit 1 fi echo "状态未同步,正在进行第${counter}次重试..." sleep 5 # 重试查询 ri_status=$(aws dms describe-connections \ --filter "Name=replication-instance-arn,Values=$ri_arn" \ --query='Connections[0].Status' \ --region us-east-1 \ --output text) done echo "连接状态已变为successful,查询成功"
关键修改说明
- 给
--query参数的内容用单引号包裹,避免Shell解析方括号语法,从根源解决[0: command not found报错 - 新增
--output text参数,让AWS CLI直接返回纯文本状态值,不需要额外处理JSON返回自带的双引号 - 调整重试计数逻辑,首次查询失败后才开始计数,最多重试5次符合需求
- 把老旧的反引号
``替换为$()捕获命令输出,嵌套场景下兼容性更好 - 给filter参数加双引号,避免ARN包含特殊字符时解析异常
- 调整判断顺序:先计数再判断是否达到最大重试次数,避免多执行一次无效查询
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

