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

Bash中迭代jq输出的JSON数组失败,问题出在哪?

问题分析与解决方案

错误原因

你当前的赋值方式只是把jq输出的整个JSON字符串赋值给了secret_list变量,它本质是一个普通字符串,并非Bash数组。所以在后续操作中,${#secrets_list[@]}会把整个字符串当作数组的唯一元素,遍历也只会输出完整的JSON字符串。

解决方案

以下是几种可行的正确实现方式:

方法1:直接生成Bash数组格式赋值

利用jq的@sh过滤器将每个元素转换为符合Bash语法的安全字符串,再将结果转为数组:

# 正确赋值为Bash数组
secret_list=($(mycli | jq -r '.[] | @sh'))

# 验证并遍历
echo "secrets_list: ${secret_list[@]}"
echo "Number of secrets ${#secret_list[@]}"

for secret in "${secret_list[@]}"
do
      echo "$secret"
      # 在这里执行你的目标CLI命令,例如:
      # your_command "$secret"
done
  • jq -r '.[] | @sh':将JSON数组的每个元素转为带引号的安全格式,避免特殊字符解析错误;-r输出原始字符串而非JSON转义格式。
  • ()包裹结果:让Bash将输出解析为数组元素。

方法2:用readarray读取(Bash 4.0+适用)

如果你的Bash版本在4.0及以上,可使用readarray直接将jq输出的每行元素存入数组:

# 读取每行元素到数组,-t 移除换行符
readarray -t secret_list < <(mycli | jq -r '.[]')

# 遍历数组
for secret in "${secret_list[@]}"
do
      echo "$secret"
done
  • < <(...):进程替换,将jq的输出作为readarray的输入源。

方法3:逐行读取处理(兼容低版本Bash)

无需数组,直接通过while循环逐行处理每个元素,兼容性最好:

# 直接遍历jq输出的每行元素
mycli | jq -r '.[]' | while read -r secret
do
      echo "$secret"
      # 执行你的CLI命令
      # your_command "$secret"
done
  • read -r:避免反斜杠被解析为转义字符,保证元素内容完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:35:12