Jaur
Jaur

Reputation: 85

Bash array values as variables

Is it possible to use array values as variables? For example, i have this script:

#!/bin/bash
SOURCE=$(curl -k -s $1 | sed 's/{//g;s/}//g;s/,/"\n"/g;s/:/=/g;s/"//g' | awk -F"=" '{ print $1 }')
JSON=$(curl -k -s $1 | sed 's/{//g;s/}//g;s/,/"\n"/g;s/:/=/g;s/"//g' | awk -F"=" '{ print $NF }')
data=$2
readarray -t prot_array <<< "$SOURCE"
readarray -t pos_array <<< "$JSON"

for ((i=0; i<${#prot_array[@]}; i++)); do
echo  "${prot_array[i]}" "${pos_array[i]}" | sed 's/NOK/0/g;s/OK/1/g' | grep $2 | awk -F' ' '{ print $2,$3,$4 }'
done

EDIT:

I just added: grep $2 | awk -F' ' '{ print $2,$3,$4 }'

Usage:

./json.sh URL

Sample (very short) output:

DATABASE 1
STATUS 1

I don't want to echo out all the lines, i would like to use DATABASE STATUS as variable $DATABASE and echo that out. I just need DATABASE (or any other) value from command line. Is it somehow possible to use something like this?

./json.sh URL $DATABASE

Happy to explain more if needed.

EDIT: curl output without any formattings etc:

{  
   "VERSION":"R3.1",
   "STATUS":"OK",
   "DATABASES":{  
      "READING":"OK"
   },
   "TIMESTAMP":"2017-03-08-16-20-35"
} 

Output using script:

VERSION R3.1 
STATUS 1 
DATABASES 1 
TIMESTAMP 2017-03-08-16-21-54 

What i want is described before. For example use DATABASE as varible $DATABASE and somehow get the value "1"

EDIT:

Random json from uconn.edu

./json.sh https://github.uconn.edu/raw/nam12023/novaLauncher/master/manifest.json

Another:

./json.sh https://gitlab.uwe.ac.uk/dc2-roskilly/angular-qs/raw/master/.npm/nan/2.4.0/package/package.json

Last output begins with:

name nan
version 2.4.0

From command line: ./json.sh URL version

At leats it works for me.

Upvotes: 1

Views: 95

Answers (1)

chepner
chepner

Reputation: 530940

I think you want to use jq something like this:

$ curl -k -s "$1" | jq --arg d DATABASES -r '
    "VERSION \(.VERSION)",
    "STATUS \(if .STATUS == "OK" then 1 else 0 end)",
    "DATABASES \(if .[$d].READING == "OK" then 1 else 0 end)", 
    "TIMESTAMP \(.TIMESTAMP)"
'
VERSION R3.1
STATUS 1
DATABASES 1
TIMESTAMP 2017-03-08-16-20-35

(I'm probably missing a simpler way to convert a boolean value to an integer.)

Quick explanation:

  1. The ,-separated strings each become a separate output line.
  2. The -r option outputs a raw string, rather than a JSON string value.
  3. The name of the database field is passed using the --arg option.
  4. \(...) is jq's interpolation operator; the contents are evaluated as a JSON expression and the result is inserted into the string.

Upvotes: 5

Related Questions