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

如何在Bash中正确构建含空格的数组:从jq提取Reddit标题的最佳方案

如何在Bash中正确构建含空格的数组:从jq提取Reddit标题的最佳方案

兄弟我懂你这种踩Bash数组坑的痛苦!你现在的问题核心是Bash的单词拆分机制搞砸了你的数组构建,加上jq默认输出带引号的JSON字符串,导致每个标题被拆成了一堆零散的词。下面给你两种靠谱的解决办法,保证能拿到完整的标题数组:

方法一:用readarray(推荐,Bash 4.0+可用)

这是最简洁的方式,利用readarray按行读取输出,直接把每行内容作为数组的一个元素,完美保留空格:

# 用jq的-r选项输出不带引号的原始标题,每行一个
readarray -t titles < <(echo "${json}" | jq -r '.data.children[].data.title')

关键参数解释:

  • -r:jq的选项,输出原始字符串,去掉JSON自带的双引号
  • readarray -t:-t会去掉每行末尾的换行符,避免数组元素带多余的换行
  • < <(...):进程替换,把jq的输出作为readarray的输入,避免子shell导致数组无法保留

验证一下效果:

echo "${titles[0]}"
# 输出:Developers Should Celebrate Software Development Being Hard

# 循环遍历数组的正确姿势
for title in "${titles[@]}"; do
    echo "处理标题:$title"
done

方法二:兼容旧版Bash的while循环(Bash 3.x也能用)

如果你的系统Bash版本较低(比如Mac默认的Bash 3.2),可以用while循环配合read来构建数组:

titles=()
# 同样用jq -r输出无引号的标题,逐行读取存入数组
while IFS= read -r line; do
    titles+=("$line")
done < <(echo "${json}" | jq -r '.data.children[].data.title')

关键细节:

  • IFS=:避免read命令把开头/结尾的空格吃掉
  • read -r:禁止反斜杠转义,保证标题里的特殊字符(比如\)不会被篡改

为什么你原来的方法会出错?

你用titles=($(echo "${json}" | jq '.data.children[].data.title'))这种方式赋值时:

  1. Bash会把jq的输出按空格、制表符、换行符进行单词拆分,所以带空格的标题直接被拆成了多个数组元素
  2. jq默认输出带双引号的JSON字符串,这些引号会被当成元素的一部分,导致第一个元素变成了"Developers,第二个是Should,以此类推

这样自然就没法拿到完整的标题了。

最后,按照你的需求,用${titles[i]}访问数组元素或者循环遍历都完全没问题,每个元素都是完整的句子。

备注:内容来源于stack exchange,提问作者Vitalcion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:23:21