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

为什么jq输出为字符串而非数组?如何正确遍历其输出结果

问题原因

你当前的问题核心是bash变量存储机制和jq默认输出格式的匹配问题:

  • jq '.categories | keys[]' 的输出是逐行返回所有key,赋值给普通变量category_ids后,变量存储的是带换行符的单个长字符串
  • 直接对$category_ids循环时,如果变量用双引号包裹,bash会将整个字符串识别为单个循环元素,因此只会执行一次echo输出所有值;如果没加引号,bash会按空格、制表符、换行全局拆分,一旦你的key值中包含空格就会出现拆分错误。

你写的转数组逻辑可以解决问题,但有更简洁的实现方式。

最优实现方案

方案1:直接读取为bash数组(推荐,适用于需要多次使用key列表的场景)

使用readarray(bash 4.0及以上版本支持)直接将jq的逐行输出读入数组,无需额外处理分隔符:

# 加-r参数让jq输出不带引号的原始值,避免key值被多余的双引号包裹
readarray -t category_ids < <(jq -r '.categories | keys[]' "$dictionary_location")

# 直接遍历数组即可
for key in "${category_ids[@]}"; do
  echo "key: $key"
done

方案2:直接管道遍历(适用于只需要遍历一次的场景)

不需要额外存储变量,直接把jq输出管道给循环逻辑,代码更精简:

jq -r '.categories | keys[]' "$dictionary_location" | while read -r key; do
  echo "key: $key"
done

额外注意点

  • 所有路径类变量引用时建议加双引号,比如"$dictionary_location",避免路径包含空格时执行报错
  • jq加-r参数输出原始字符串,否则输出的key会自带JSON格式的双引号包裹

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 15:36:05