如何将JSON数组转为保留空格的Bash数组,解决拆分异常
解决Bash中JSON转数组时被空格拆分的问题
你遇到的问题确实是Bash的**分词(word splitting)**行为导致的:默认情况下,Bash会把空格、制表符、换行符作为数组元素的分隔符。当你用test_cases=($(jq -c '.[]' data.json))赋值时,每个JSON对象里的日期空格(比如"31/01/2020 17:52")会把单个JSON字符串拆成两半,所以原本2个JSON对象就变成了4个数组元素。
推荐解决方案:用readarray(或mapfile)按行读取
readarray是Bash 4.0+支持的命令,它会将输入的每一行作为数组的一个元素,完美避免空格拆分的问题:
# 读取jq输出的每一行到数组,-t参数会去掉每行末尾的换行符 readarray -t test_cases < <(jq -c '.[]' data.json)
现在测试数组元素:
echo "${test_cases[0]}" echo "${test_cases[1]}"
输出会是两个完整的JSON对象:
{"USERID":"TMCCP","CREATED_DATE":"31/01/2020 17:52"}
{"USERID":"TMCCP","CREATED_DATE":"31/01/2020 17:52"}
兼容旧版Bash的方案:while循环逐行添加
如果你的Bash版本低于4.0(不支持readarray),可以用while循环配合read命令来构建数组:
# 初始化空数组 test_cases=() # 逐行读取jq的输出,IFS=防止行首/尾空格被截断,-r禁止转义字符解析 while IFS= read -r line; do test_cases+=("$line") done < <(jq -c '.[]' data.json)
为什么原来的方法不行?
$(jq ...)会把命令输出展开成一个字符串,Bash随后会根据IFS(默认包含空格)对这个字符串进行分词,把每个空格分隔的部分当成独立的数组元素。所以每个带空格的JSON对象被拆成了两个元素,最终数组长度变成4。
内容的提问来源于stack exchange,提问作者Pan Wolodyjowsky
相关产品推荐
相关产品推荐

