2017-03-08 90 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