将数组值Bash作为变量

时间:2017-03-08 14:12:55

标签: arrays bash

是否可以将数组值用作变量? 例如,我有这个脚本:

#!/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

编辑:

我刚刚添加了:grep $2 | awk -F' ' '{ print $2,$3,$4 }'

用法:

./json.sh URL

示例(非常短)输出:

DATABASE 1
STATUS 1

我不想回显所有的行,我想使用DATABASE STATUS作为变量$ DATABASE并回显出来。 我只需要命令行中的DATABASE(或任何其他)值。 是否有可能使用这样的东西?

./json.sh URL $DATABASE

如果需要,很高兴解释更多。

编辑: curl输出没有任何格式等:

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

使用脚本输出:

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

之前描述的是我想要的。例如,使用DATABASE作为varible $ DATABASE并以某种方式得到值&#34; 1&#34;

编辑:

来自uconn.edu的随机json

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

另:

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

上次输出以:

开头
name nan
version 2.4.0

从命令行:./ json.sh URL版本

在皮带上它对我有用。

1 个答案:

答案 0 :(得分:5)

我想你想使用jq这样的东西:

$ 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

(我可能错过了将布尔值转换为整数的简单方法。)

快速解释:

  1. , - 分隔的字符串各自成为单独的输出行。
  2. -r选项输出原始字符串,而不是JSON字符串值。
  3. 使用--arg选项传递数据库字段的名称。
  4. \(...)jq的插值运算符;将内容计算为JSON表达式,并将结果插入到字符串中。