2017-03-08 66 views
1

是否可以使用数组值作为变量? 例如,我有这个脚本: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 

如果需要,可以多解释一下。

编辑: 没有任何打印格式等卷曲输出:

{ 
    "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 

我想是前文所述。例如使用数据库varible $ DATABASE,并以某种方式获取的值 “1”

编辑:

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

最后输出:从uconn.edu

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

另一个

随机JSON开始于:

name nan 
version 2.4.0 

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

在leats它适用于我。

+0

为什么不能使用正确的'JSON'解析器来处理'cURL'的json输出?而不是'sed'?它使你的任务变得更简单。 – Inian

+1

请发布你的'curl'输出和你正在寻找的确切输出 – Inian

+1

请更新它作为问题的一部分,并从评论中删除 – Inian

回答

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. , -separated字符串每个都成为一个单独的输出行。
  2. -r选项输出原始字符串,而不是JSON字符串值。
  3. 使用--arg选项传递数据库字段的名称。
  4. \(...)jq的插值算子;将内容评估为JSON表达式,并将结果插入到字符串中。
+0

奇怪的是,您不知道,但是将空间放在那里是一个好主意。 – chepner

+1

很好的答案。只是一个方面说明:你不需要在最后使用'[]'然后'join(“\ n”)'建立一个列表。用','分隔各个过滤器。 'jq'将默认在单独的行上打印它们的结果。 – hek2mgl

+0

所以输出是一样的。好,但我需要以某种方式将DATABASE作为变量进行分类。或者任何其他第一次刺激输出。 P.S在我的URL后面可能会更长的json。目前我正在测试我的脚本再次是另一个JSON,更长,不同的输出行等。输出基本上是相同的格式:“SOMESTING somevalue” – Jaur