我可以将字符串变量传递给 jq 而不是文件吗?

Posted

技术标签:

【中文标题】我可以将字符串变量传递给 jq 而不是文件吗?【英文标题】:Can I pass a string variable to jq not the file? 【发布时间】:2018-04-16 18:13:27 【问题描述】:

我想在 bash 中将 JSON 字符串转换为数组。 JSON 字符串作为参数传递给 bash 脚本(文件中不存在)。

有没有办法在不使用一些临时文件的情况下实现它?

与此类似:

script.sh

#! /bin/bash
json_data='"key":"value"'
jq '.key' $json_data

jq: error: Could not open file key:value: No such file or directory

【问题讨论】:

【参考方案1】:

我建议使用 bash here string。例如

jq '.key' <<< "$json_data"

【讨论】:

如何使用两个字符串而不是两个文件,这样我才能使用jq -s '.[0] * .[1]' file1 file2 @KatieS:使用新的 bash 变量连接两个字符串,然后传递它。 你如何将结果传递给其他东西? 或许jq '.key' &lt;&lt;&lt; "$json_data" | something else【参考方案2】:

原始问题中给出的变量“json_data”的值不是有效的 JSON,因此此响应仍然涵盖两种情况(几乎有效和有效的 JSON)。

有效的 JSON

如果“$json_data”确实包含一个有效的 JSON 值,那么这里有两个本页其他地方没有提到的替代方案。

--argjson

例如:

 jq -n --argjson data "$json_data" '$data.key'

env

如果 shell 变量不是环境变量:

json_data="$json_data" jq -n 'env.json_data | fromjson.key'

几乎有效的 JSON

如果 $json_data 确实 invalid 作为 JSON 但作为 jq 表达式有效,那么您可以采用以下脚本所示的策略:

$ json_data='key:"value"'
$ jq -n "$json_data" | jq .key
"value"

【讨论】:

我的意思是“键”是字符串类型。可能应该使用“名称”这个词。 无论如何,这两个示例都对我有用(mac 上的 bash),即使使用引用的“key”并产生与 jq170727 解决方案中的 here 字符串类似的结果。 对于其他不需要密钥搜索的人:只需jq -n $json_data。如此简单,但是对于这样一个简单的场景,文档和在线示例都非常不清楚。他们似乎都认为你想做一些复杂的事情。【参考方案3】:

使用 bash:echo "$json_data" | jq '.key'

【讨论】:

【参考方案4】:

当然。只需将 bash 告诉 give it a file instead。

jq '.key' <(echo "$json_data")

并确保你在 bash 中运行它,而不是 sh。

【讨论】:

【参考方案5】:

如果你想使用内联命令,我在我的 Mac 上发现了这项工作:

echo '"key":"value"' | jq .key

【讨论】:

将结果存储在一个变量中以供以后阶段使用。假设您的 json 已经在一个变量中,并且您需要另一个变量中的结果。 jsonData=""key":"value"" result=$(echo $jsonData | jq -r '.key') echo $result 将产生价值作为结果。【参考方案6】:
#! /bin/bash
json_data='"key":"value"'
echo $json_data | jq --raw-output '.key'

【讨论】:

【参考方案7】:

如果您尝试在 .sh 文件中执行此操作,这对我有用:

local json_data $(getJiraIssue "$1")               # store JSON in var
echo `jq -n "$json_data" | jq '.fields.summary'`   # pass that JSON var to jq

【讨论】:

以上是关于我可以将字符串变量传递给 jq 而不是文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过命令行将变量传递给powershell脚本

私有子可以将新创建​​的变量传递给 main() 吗?

我可以将 asm 函数与 c - 字符串变量而不是字符串文字作为参数一起使用吗? [复制]

气流 - 如何将 xcom 变量传递给 Python 函数

将 bash 变量传递给 jq

将数组元素传递给消息框仅打印元素的第一个字符而不是整个字符串