如何解析值并将其分配给Windows bash中的本地变量?

时间:2019-01-10 14:13:12

标签: windows bash

我有一个json文件

  input= {
    "credentials": {
        "accessKeyId": "123456789",
        "secretAccessKey": "654321",
        "sessionToken": "valuedummy",
        "expiration": "201925"
    }
}

我正在尝试使用Windows bash解析值并将其分配给局部变量。

我想要实现的是:

将值分配给我的局部变量a,b,c,d

a=123456789
b=654321
c=valuedummy
d=201925

我该怎么做?

3 个答案:

答案 0 :(得分:0)

jq是一种合理的方法:

a=$( jq -r  .credentials.accessKeyId   input ) 

此文件的输入位置:

{
    "credentials": {
        "accessKeyId": "123456789",
        "secretAccessKey": "654321",
        "sessionToken": "valuedummy",
        "expiration": "201925"
    }
}

答案 1 :(得分:0)

您绝对应该使用用于解析JSON的工具,例如jq。您将无法使用sedawk等可靠地做到这一点:

$ cat file
{
    "credentials": {
        "accessKeyId": "123456789",
        "secretAccessKey": "654321",
        "sessionToken": "valuedummy",
        "expiration": "201925"
    }
}

$ cat script
#!/usr/bin/env bash

i=0 var=(a b c d)
while IFS= read -rd '' line; do
    printf -v "${var[i++]:-tmp}" "$line"
done < <(jq -j '.credentials | to_entries[] | (.value + "\u0000")' file)

declare -p a b c d

$ ./script
declare -- a="123456789"
declare -- b="654321"
declare -- c="valuedummy"
declare -- d="201925"

答案 2 :(得分:0)

非jq答案,但需要json包和python(通常与标准发行版一起安装):

a=$( python -c 'import sys, json; print(json.load(sys.stdin)["credentials"]["accessKeyId"])' <input ) 

编辑:这是一个稍微笼统的答案(IMHO):

$ cat input
{
    "credentials": {
        "accessKeyId": "123456789",
        "secretAccessKey": "654321",
        "sessionToken": "valuedummy",
        "expiration": "201925"
    }
}


$ cat json2env 
eval $( 
python -c '
import sys, json

for (k,v) in (json.load(sys.stdin)["'$1'"]).items(): 
    print(k + "=" + v)
' < $2  
)

$ . json2env credentials input
$ echo $accessKeyId 
123456789
$ echo $secretAccessKey 
654321

它稍微通用一点,因为它将接受任何类似格式的json(包含字典的字典)。我只是简单地参数化了字典属性。

python脚本基本上在指定的属性(在您的情况下为“ credentials”)中打印所有名称/值对。该名称用作变量名称。这很方便,但是我怀疑其中存在一些可能在键名中可接受但在变量名中不可接受的符号的问题。