如何高效将AWS CLI字符串数组转换为Bash数组
解决AWS CLI返回JSON数组转Bash可遍历数组的问题
你的核心问题是:AWS CLI返回的是JSON格式的字符串数组,直接用=$(...)赋值只会得到一个普通字符串,不是Bash的数组类型,所以遍历的时候只会输出整个字符串。下面给两种高效的解决方法:
方法一:用AWS CLI自带的输出格式(最简便)
直接让AWS CLI输出纯文本格式,每个ARN单独占一行,再用readarray把内容读进Bash数组:
# 通过--output text参数,让AWS CLI直接输出每行一个ARN readarray -t taskDefs < <(aws ecs list-task-definitions --status="INACTIVE" --query="taskDefinitionArns" --output text) # 遍历数组 for value in "${taskDefs[@]}" do echo "value=\"$value\"" done
执行后就能得到你想要的输出:
value="arn:1" value="arn:2" value="arn:3"
readarray -t的作用是把每行内容存入数组,-t会自动去掉每行末尾的换行符。
方法二:用jq解析JSON(适合复杂场景)
如果需要对返回的JSON做额外过滤或处理,可以用jq工具解析出每个数组元素,再转成Bash数组:
# 先获取原始JSON字符串 taskDefs_json=$(aws ecs list-task-definitions --status="INACTIVE" --query="taskDefinitionArns") # 用jq提取每个数组元素,再读进数组 readarray -t taskDefs < <(echo "$taskDefs_json" | jq -r '.[]') # 遍历输出 for value in "${taskDefs[@]}" do echo "value=\"$value\"" done
jq -r '.[]'的作用是把JSON数组的每个元素以原始字符串形式输出(不带引号),每行一个,刚好适配readarray的读取规则。
为什么原来的方法不行?
你之前的taskDefs=$(...)是把整个JSON字符串["arn:1", "arn:2", "arn:3"]存成了一个普通变量,不是Bash数组。所以${taskDefs[@]}本质上还是这个完整字符串,循环自然只会执行一次。
内容的提问来源于stack exchange,提问作者Inspiraller
相关产品推荐
相关产品推荐

