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

Mat*_*att 17 variables bash json input jq

我想在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
Run Code Online (Sandbox Code Playgroud)

jq1*_*727 37

我建议在这里使用bash 字符串.例如

jq '.key' <<< "$json_data"
Run Code Online (Sandbox Code Playgroud)

  • 我如何使用两个字符串而不是两个文件,以便我可以使用“jq -s”。[0] * .[1]' 文件 1 文件 2` ? (3认同)

pea*_*eak 11

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

有效的JSON

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

--argjson

例如:

 jq -n --argjson data "$json_data" '$data.key'
Run Code Online (Sandbox Code Playgroud)

env

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

json_data="$json_data" jq -n 'env.json_data | fromjson.key'
Run Code Online (Sandbox Code Playgroud)

几乎有效的JSON

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

$ json_data='{key:"value"}'
$ jq -n "$json_data" | jq .key
"value"
Run Code Online (Sandbox Code Playgroud)

  • 对于不需要密钥搜索的其他人:只需“jq -n $json_data”即可。很简单,但是对于这样一个简单的场景,文档和在线示例都非常不清楚。他们似乎都假设你想做一些复杂的事情。 (3认同)

Abi*_*yen 8

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

echo '{"key":"value"}' | jq .key
Run Code Online (Sandbox Code Playgroud)


Jav*_*ier 5

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


Ign*_*ams 5

绝对地。只需告诉 bash给它一个文件

jq '.key' <(echo "$json_data")
Run Code Online (Sandbox Code Playgroud)

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


小智 5

#! /bin/bash
json_data='{"key":"value"}'
echo $json_data | jq --raw-output '.key'
Run Code Online (Sandbox Code Playgroud)