Ali Rana
Ali Rana

Reputation: 23

select specific values from json & convert into bash variables

I'm new to jq, I have the following JSON & I need to extract FOUR values i.e. SAUCE_KEY, sauceKey, SAUCE_VALUE, sauceValue etc. And I need to covert these bash variables as i.e.

SAUCE_KEY=sauceKey
SAUCE_VALUE=sauceValue

If I will echo it, it should print it's value ie. echo $SAUCE_KEY

I have used the code as:

jq -r '.env_vars[] | with_entries(select([.key] | inside([".env_vars[].name", ".env_vars[].value"])))' | jq -r "to_entries|map(\"\(.value)=\(.value|tostring)\")|.[]"

By doing so, i was able to get values as name=SAUCE_KEY, value=sauceKey and so on.

{
  "@type": "env_vars",
  "env_vars": [
    {
      "@type": "env_var",
      "@href": "/repo/xxxxx/env_var/xxxxx",
      "@representation": "standard",
      "@permissions": {
        "read": true,
        "write": true
      },
      "name": "SAUCE_KEY",
      "value": "sauceKey"
    },
    {
      "@type": "env_var",
      "@href": "/repo/xxxxx/env_var/xxxxx",
      "@representation": "standard",
      "@permissions": {
        "read": true,
        "write": true
      },
      "name": "SAUCE_VALUE",
      "value": "sauceValue"
    }
  ]
}

Upvotes: 0

Views: 155

Answers (1)

Shawn
Shawn

Reputation: 52336

If instead of trying to extract variable names from the JSON, you populate an associate array with the names as keys, it's pretty straightforward.

#!/usr/bin/env bash

declare -A sauces
while IFS=$'\001' read -r name value; do
    sauces[$name]=$value
done < <(jq -r '.env_vars[] | "\(.name)\u0001\(.value)"' saucy.json)

for name in "${!sauces[@]}"; do
    echo "$name is ${sauces[$name]}"
done

prints out

SAUCE_VALUE is sauceValue
SAUCE_KEY is sauceKey

Upvotes: 2

Related Questions