2017-06-12 168 views
0

我有一個BASH陣列如下:轉換BASH陣列以JSON陣列

TEMPARRAY=("1 A" "2 B") 

我想這個數組轉換成JSON陣列(或鍵值對?),就像這樣:

{ 
    "Comment": "MX Record for XYZ", 
    "Changes": [ 
    { 
     "Action": "CREATE", 
     "ResourceRecordSet": { 
     "Name": "XYZ", 
     "Type": "MX", 
     "TTL": 300, 
     "ResourceRecords": [ 
     { 
      "Value": "1 A" 
     }, 
     { 
      "Value": "2 B" 
     } 
     ] 
     } 
    } 
    ] 
} 

USE CASE:我正在創建一個shell腳本來添加AWS Route53 DNS記錄,並且我堅持爲MX記錄指定多個值。如果我更新MX記錄,它將被更新的記錄替換。從我的腳本

示例代碼:

 if [[ "$MXCOUNT" -gt "1" ]]; then 
     TEMPARRAY=("$(grep -i MX "$DNSFILE" | cut -d, -f3)") 
     for i in "${TEMPARRAY[@]}"; do 
     # POSSIBLE CODE HERE 
     done 
     else 
     addMXrecord "$DNSNAME" "$DNSVALUE" 
     fi 

功能addMXrecord將包含JSON

DNSFILE在格式(雖然它是一個單一的MX記錄。):

DOMAIN,MX,1 A 
DOMAIN,MX,2 B 

樂意提供任何信息。

+1

建議輸出文件中的內容比輸入文件中的要多。一個人無法很好地從無到有製造數據。 –

+1

......說,這種操作的通用工具(在shell中用於JSON操作的可接受工具包,就像awk用於處理面向行和字段的文件一樣)是[jq](https:/ /stedolan.github.io/jq/manual/)。 –

+1

順便說一句,標題中的字面問題的答案(在進入具有問題具體細節的雜草之前)如下所示:'jq -cRn'[inputs]'<<((($ {#array [@]}) ))&& printf'%s \ n'「$ {array [@]}」)' –

回答

1

這聽起來不像是你想在Bash中實現的東西,說實話!無論哪種方式,如果您已經在Bash中實現了大部分腳本,則可以使用像jq這樣的工具,或者如果您不需要額外的依賴關係,則可以將其「釋放」爲Python,例如Python :

python -c 'import json, sys; print(json.dumps([{"Value": v} for v in sys.argv[1:]]))' foo bar 

將輸出

[{"Value": "foo"}, {"Value": "bar"}] 

,你可以在其他地方嵌入。

+0

這是我正在尋找的輸出,並且可以在腳本中替換它。不過,我嘗試了jq,目前還沒有運氣(甚至在搜索語法方面)。任何幫助這在bash? – kintuparantu

+0

你的python命令有效,直到我在BASH中找到一些東西時,都必須使用這個命令。謝謝。 – kintuparantu

0

jq濾波器此會是什麼樣

TEMPARRAY=("1 A" "2 B") 
printf '%s\n' "${TEMPARRAY[@]}" | 
    jq --slurp -R ' 
    split("\n")[:-1] | map({Value: .}) | 
    { 
     Comment: "MX Record for XYZ", 
     Changes: [ 
     { 
      Action: "CREATE", 
      ResourceRecordSet: { 
      Name: "XYZ", 
      Type: "MX", 
      TTL: 300, 
      ResourceRecords: . 
      } 
     } 
     ] 
    } 
    ' 

split需要輸入線,並創建一個數組["1 A", "2 B", ""](所述[:-1]擺脫了最終空元素的由於從輸入尾隨換行)。 map產生對應的對象陣列[{"Value": "1 A"}, {"Value": "2 B"}]。剩下的只是插入該數組的模板,作爲與密鑰ResourceRecords相關聯的值(由.表示,從map輸入)。