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

