为什么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
相关产品推荐
相关产品推荐

