是否可以将数组值用作变量? 例如,我有这个脚本:
#!/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版本
在皮带上它对我有用。
答案 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
(我可能错过了将布尔值转换为整数的简单方法。)
快速解释:
,
- 分隔的字符串各自成为单独的输出行。-r
选项输出原始字符串,而不是JSON字符串值。--arg
选项传递数据库字段的名称。\(...)
是jq
的插值运算符;将内容计算为JSON表达式,并将结果插入到字符串中。