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

如何高效将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:20:07