如何在linux中存储json键值对并将其存储在一个变量中

如何在linux中存储json键值对并将其存储在一个变量中,json,bash,shell,centos7,psql,Json,Bash,Shell,Centos7,Psql,我正在调用python命令,该命令将返回JSON键值对数据 我已经将python命令和其他命令放在一个名为-a.sh的shell脚本中 代码(a.sh): 调用此脚本时,我得到的输出为: {'password': 'XYZ', 'name': 'Stguy', 'port': '5412', 'host': 'igtet', 'db_name': 'test3'} 在获得这个输出后,我想将输出值(如password、name)传递给psql命令,以运行postgresql查询 所以,我想要的是

我正在调用python命令,该命令将返回JSON键值对数据

我已经将python命令和其他命令放在一个名为-a.sh的shell脚本中

代码(a.sh):

调用此脚本时,我得到的输出为:

{'password': 'XYZ', 'name': 'Stguy', 'port': '5412', 'host': 'igtet', 'db_name': 'test3'}
在获得这个输出后,我想将输出值(如password、name)传递给psql命令,以运行postgresql查询

所以,我想要的是,我应该能够在一个变量中存储密码值,在一个变量中存储名称,如:

a= xyz
b=Stguy
p= port
因此,我可以使用以下变量在psql查询中传递:

psql -h $a -p $p -U $b -d $db -c "CREATE SCHEMA IF NOT EXISTS  ${sname,,};"
有人能帮我吗

注:Env是linux(Centos 8)


提前谢谢

解决这一问题的一种方法是将
jq
用于值提取和shell内置
read
用于:

JSON='{“name”:“Stguy”,“port”:5412,“host”:“igtet”,“db_name”:“test3”}'

阅读-r a b c您也可以使用
sed
awk

PSQL="$( python3 main.py -z shell -y droub -i 56 | sed "s/^[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'}/psql -h '\4' -p '\1' -U '\2' -d '\5'/")"
[ "${PSQL:0:5}" = "psql " ] && ${PSQL} -c "CREATE SCHEMA IF NOT EXISTS  ${sname,,};"
出于安全考虑,我强烈建议您避免通过环境变量传递帐户数据(用户密码)


如果您的python脚本可以选择使用所需参数直接启动psql,那就更好了。

感谢@dnltinney的回复。我尝试过你的方法,但它给了我这个问题:“解析错误:第1行第12列的数值文本无效”。对于这一行:“read-r h p n@Dragon看起来JSON格式不正确。请确保
jq
可以正确解析。快速测试
echo$A | jq-r”。
可以确认这一点。另外,请注意
jq
示例中使用单引号和双引号的情况。
!双引号用于字符串插值,单引号用于包装整个jq-expression.Thaks@Zilog80对于您的建议,我将尝试一次。
JSON='{"name": "Stguy", "port": 5412, "host": "igtet", "db_name": "test3"}'
read -r a b c <<<$( echo $JSON | jq -r '"\(.host) \(.port) \(.name)"' )
echo "a: $a, b: $b, c: $c"
PSQL="$( python3 main.py -z shell -y droub -i 56 | sed "s/^[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'[^:]*: *'\([^']*\)'}/psql -h '\4' -p '\1' -U '\2' -d '\5'/")"
[ "${PSQL:0:5}" = "psql " ] && ${PSQL} -c "CREATE SCHEMA IF NOT EXISTS  ${sname,,};"