我有一个 json 响应,如下所示:
[
{"id":10,
"list_file":["/var/a.txt",
"/dev/b.txt"]}
]
我需要提取 list_file 的值并将其存储为一个 shell 变量数组。我试着循环读取值。
#!/bin/bash
x=()
while read -r value
do
#echo "$value"
x+=("$value")
done < <(jq -r '.[] | .list_file' input.json)
但数组中提取的值也包含引号、括号和逗号。
[
"/var/a.txt",
"/dev/b.txt"
]
能否请您帮我修改代码,使数组只包含条目/var/a.txt 和/dev/b.txt。此外,我尝试了 readarray 和 map,但它们在 Mac Osx 上不起作用。非常感谢任何帮助。
最佳答案
为了正确处理所有值,您需要使用declare
命令将jq
的输出合并到一个数组赋值中。
这里有一些需要注意的极端情况的输入:空格、换行符和 glob 字符。
$ cat input.json
[
{"id":10,
"list_file":[
"/var/a b.txt",
"/dev/c\nd.txt",
"*"]}
]
jq
命令提取并输出正确引用的字符串以供 shell 使用:
$ $ jq -r '.[] | .list_file[] | @sh' input.json
'/var/a b.txt'
'/dev/c
d.txt'
'*'
还有一个可以使用输出的 shell 命令:
$ declare -a "x=($(jq -r '.[] | .list_file[] | @sh' input.json))"
证明它正常工作:
$ printf '==%s==\n' "${x[@]}"
==/var/a b.txt==
==/dev/c
d.txt==
==*==
关于json - 使用 jq 将 JSON 值提取到 shell 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44981265/