json - 使用 jq 将 JSON 值提取到 shell 变量

标签 json bash shell jq

我有一个 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/

相关文章:

java - 如何使用 java 访问 android 中的嵌套 JSON 数据?

javascript - JSON stringify 有问题吗?

javascript - 使用基于 Div 的 JSON 值之一的 JS 选择框隐藏 div

linux - 将 Git Push 保存到输出文件

regex - 在多个日志文件中查找模式?

linux - 从 bash 切换到 csh 提示符

json - 以 application/octet-stream 形式发送数据是否比以 JSON 编码字节数组形式发送数据更有效?

linux - 解析 bash 脚本中的文本

perl - 从 shell 脚本运行 perl 脚本

bash - 如何在 Bash 中隐藏命令输出