Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash store json response in another variable

I'm curling an endpoint:

#!/bin/bash
instance_info=$(curl -sk https://internal.admin.com/app/instance)

which gives a json response:

{
"basePath": "/install", 
"metadata": {
    "deployed_artifact": "app01", 
    "docker": "True",  
    "http_port": "7471",
    "url": "www.google.com"
}, 
"name": "app-01", 
"server": "webserver1"
}

I'm trying to avoid curling more than once to get the variables I need from the json using JQ.

Using bash I'd really appreciate if someone can show me how to store the response as another var and then use this to variablize name: server: url: http_port:

The following seems to run the curl twice:

#!/bin/bash
instance_info=$(curl -sk https://internal.admin.com/app/instance)

server_name=$(echo instance_info | /usr/bin/jq --raw-output '.server')
url=$(echo instance_info | /usr/bin/jq --raw-output '.url')
like image 858
Narrabit10 Avatar asked Oct 18 '25 01:10

Narrabit10


2 Answers

You are calling curl once and this suffices. Then you have the content in a variable, so you can access it without calling curl again.

Regarding your code, your approach is fine but you are missing $ when you are echoing the variable:

server_name=$(echo $instance_info | /usr/bin/jq --raw-output '.server')
#                  ^

See a sample. Here I hardcode the JSON:

your_json='
{
"basePath": "/install", 
"metadata": {
    "deployed_artifact": "app01", 
    "docker": "True",  
    "http_port": "7471",
    "url": "www.google.com"
}, 
"name": "app-01", 
"server": "webserver1"
}'

for the server:

$ echo "$your_json" | jq --raw-output '.server'
webserver1

For the url you need to indicate the block where it lies on. That is, metadata:

$ echo "$your_json" | jq --raw-output '.metadata.url'
www.google.com

To store into a variable, say:

your_field=$(echo "$your_json" | jq --raw-output 'XXXX')
#                                                 ^^^^
like image 182
fedorqui 'SO stop harming' Avatar answered Oct 19 '25 18:10

fedorqui 'SO stop harming'


Here is a script which demonstrates how to use jq's @sh formatting directive along with bash eval to set bash variables using the output of a filter. In this case we hardcode the json which presumably would have come from curl.

#!/bin/bash
instance_info='
{
"basePath": "/install", 
"metadata": {
    "deployed_artifact": "app01", 
    "docker": "True",  
    "http_port": "7471",
    "url": "www.google.com"
}, 
"name": "app-01", 
"server": "webserver1"
}'

eval "$(jq -M -r '@sh "server_name=\(.server) url=\(.metadata.url)"' <<< "$instance_info")"

echo $server_name
echo $url

When run this produces the output

webserver1
www.google.com

The Extract data and set shell variables section of the JQ Cookbook has more examples of @sh.

like image 45
jq170727 Avatar answered Oct 19 '25 20:10

jq170727



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!