2017-06-12 114 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输入)。