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

Shell脚本为何在字符串中间拆分JSON对象?

解决Shell脚本中jq解析JSON含空格时的数组拆分问题

你遇到的问题根源是Shell默认以空格、制表符、换行符作为字段分隔符(IFS),当用entries=($(jq ...))这种命令替换方式给数组赋值时,jq输出的完整JSON对象会被空格拆分成多个数组元素,导致内容截断。

下面是两种可靠的解决方法:

方法1:使用mapfile(推荐,Bash 4.0及以上版本支持)

mapfile可以直接将命令输出按行读取到数组,每行作为一个独立元素,不会因空格拆分:

mapfile -t entries < <(jq -c '.[]' ../ext/js/language/languages.json)
echo "[1] ${entries[1]}"
echo "[2] ${entries[2]}"
  • -t 参数会移除每行末尾的换行符
  • < <(command) 是进程替换,将jq的输出作为mapfile的输入源

方法2:用while循环逐行读取(兼容低版本Bash)

如果你的Bash版本低于4.0,可通过while循环配合read命令实现:

entries=()
while IFS= read -r line; do
    entries+=("$line")
done < <(jq -c '.[]' ../ext/js/language/languages.json)
echo "[1] ${entries[1]}"
echo "[2] ${entries[2]}"
  • IFS= 确保read不会忽略行首的空格
  • -r 参数禁止反斜杠转义,保证JSON内容的完整性

原方法失效的原因

entries=($(jq -c '.[]' ...)) 会先执行jq命令并将所有输出合并为单个字符串,随后Shell根据默认IFS(包含空格)拆分这个字符串,导致带空格的JSON字段(比如"don't read")被拆成两个数组元素,最终输出截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:45:58