如何在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'))这种方式赋值时:
- Bash会把jq的输出按空格、制表符、换行符进行单词拆分,所以带空格的标题直接被拆成了多个数组元素
- jq默认输出带双引号的JSON字符串,这些引号会被当成元素的一部分,导致第一个元素变成了
"Developers,第二个是Should,以此类推
这样自然就没法拿到完整的标题了。
最后,按照你的需求,用${titles[i]}访问数组元素或者循环遍历都完全没问题,每个元素都是完整的句子。
备注:内容来源于stack exchange,提问作者Vitalcion
相关产品推荐
相关产品推荐

