我可以将字符串变量传递给 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' <<< "$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 而不是文件吗?的主要内容,如果未能解决你的问题,请参考以下文章