Python 如何在bash脚本中以JSON字符串传递变量
我有下面的脚本,同时从主机获取一些命令输出,并将其保存到一个文件Python 如何在bash脚本中以JSON字符串传递变量,python,json,bash,Python,Json,Bash,我有下面的脚本,同时从主机获取一些命令输出,并将其保存到一个文件/tmp/${stcl}\u aggr.txt,进一步将该文件放置到一个变量body=$(cat/tmp/${stcl}\u aggr.txt) 将此变量body作为“description”调用到Jason数组中时:“$body”其值未展开,导致错误为KeyError:“result',以及类似事件号的变量,curloutput也不工作,如果我删除说明的正文,则脚本将运行,但我需要上传说明:值 #!/bin/bash # DATE
/tmp/${stcl}\u aggr.txt
,进一步将该文件放置到一个变量body=$(cat/tmp/${stcl}\u aggr.txt)
将此变量body
作为“description”调用到Jason数组中时:“$body”
其值未展开,导致错误为KeyError:“result'
,以及类似事件号的变量,curloutput
也不工作,如果我删除说明的正文
,
则脚本将运行,但我需要上传说明:
值
#!/bin/bash
#
DATE=$(date +"%m_%d_%Y_%H_%M")
mailto="udc@example.com"
cwd="/myenv/filer-mgt/bin"
output="/my_env/filer-mgt/rpt/$DATE"
clusters="udcl301 "
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:$PATH
incident=$1
sysid=UNKNOWN
checkvaultenv=`echo $vaultenv | tr '[:upper:]' '[:lower:]'`
if [[ "$checkvaultenv" == "" ]]
then
vaultenv=prod
else
if [[ "$checkvaultenv" != "dev" && "$checkvaultenv" != "test" && "$checkvaultenv" != "acc" && "$checkvaultenv" != "prod" ]]
then
echo unknown vault environment specified: $vaultenv
exit 1
fi
fi
vaultenvlc=`echo $vaultenv | tr '[:upper:]' '[:lower:]'`
vaultenvuc=`echo $vaultenv | tr '[:lower:]' '[:upper:]'`
SNOW_USERNAME=`export EDITOR=cat ; ansible-vault edit --vault-password-file=~/.ssh/vpf.iss.${vaultenvlc} ~/iss/vaults/vault-${vaultenvuc}.yml | grep vault_servicenow_username | grep -v -E "^\s*#" | awk '{print $2}' FS=\"`
SNOW_PASSWORD=`export EDITOR=cat ; ansible-vault edit --vault-password-file=~/.ssh/vpf.iss.${vaultenvlc} ~/iss/vaults/vault-${vaultenvuc}.yml | grep vault_servicenow_password | grep -v -E "^\s*#" | awk '{print $2}' FS=\"`
case $vaultenvlc in
ram)
SNOW_INSTANCE=udc2dev.service-now.com
;;
iqa)
SNOW_INSTANCE=udc2dev.service-now.com
;;
dev)
SNOW_INSTANCE=udc2dev.service-now.com
;;
test)
SNOW_INSTANCE=udc2trn.service-now.com
;;
acc)
SNOW_INSTANCE=udc2qa.service-now.com
;;
*)
SNOW_INSTANCE=udc2.service-now.com
;;
esac
SNOW_AUTH=`echo -n $SNOW_USERNAME:$SNOW_PASSWORD`
create_incident()
{
url="https://${SNOW_INSTANCE}/api/now/table/incident"
curloutput=`curl -sslv1 -u $SNOW_AUTH -X POST -s -H "Accept:application/json" -H "Content-Type:application/json" $url -d "$variables" 2>/dev/null`
RETURNCODE=$?
if [ "$RETURNCODE" == "0" ]
then
incident_number=`echo $curloutput | python -c $'import sys, json\nprint json.load(sys.stdin)["result"]["number"]'`
sysid=`echo $curloutput | python -c $'import sys, json\nprint json.load(sys.stdin)["result"]["sys_id"]'`
echo "OK: created incident $incident_number with sysid $sysid"
else
echo "ERROR creating incident:"
echo "======================================="
echo $curloutput
echo "======================================="
fi
}
#create_incident
for udcl in `echo $clusters`
do
ssh $udcl aggr show -root false | grep -i "9[2-9]%\|100%" > /tmp/${udcl}_aggr.txt
snshort_description="aggr utilization above limit"
sncmdb_ci=$udcl
body="`cat /tmp/${udcl}_aggr.txt`"
read -r -d '' variables <<- EOM
{
"short_description": "$snshort_description",
"assignment_group": "RD-DI-Infra-Storage",
"contact_type": "interface",
"state": "New",
"urgency": "3 - Low",
"impact": "3 - Low",
"cmdb_ci": "$sncmdb_ci",
"u_sec_env": "Normal Secure",
"description": "$body"
}
EOM
echo $variables
create_incident
ssh $udcl "ro 0;vol show -state offline -fields aggregate"|grep stv > /tmp/${udcl}_validate_offline_volume.txt
done
如果我删除$body
,那么整个脚本将运行得很好,因此它是关于变量$body
的,它没有变得勇敢。我可以复制类似于我的实验室,因此,根据我下面的理解,应该适合您
ssh $udcl aggr show -root false | grep -i "9[2-9]%\|100%" | sed 's/\(.*\)\r/"\1"/g' > /tmp/${udcl}_aggr.txt
说明:
ssh $udcl aggr show -root false | grep -i "9[2-9]%\|100%" > /tmp/${udcl}_aggr.txt
body="`cat /tmp/${udcl}_aggr.txt`"
read -r -d '' variables <<- EOM
{
"description": "$body"
}
EOM
您的输入文件在行尾有回车符,所以为了删除相同的回车符,我们可以在“grep”后面使用sed,如上所述然后,您不需要双引号引用body
变量,因为变量中的数据行已经被引用,json喜欢这样做。您可以将代码片段缩减到产生问题的最小示例吗?为什么不用python替换bash脚本?我看到您已经在某些部分使用python。Bash对一些简单的任务很有帮助,但当复杂性增加时,它可能不是正确的工具。@HernánAlarcón,我不擅长python,may bei稍后会考虑这个问题。@MrR,我已经编辑了代码,还保留了一小部分出错的代码。@Kulfi您可以添加来自ssh$udcl aggr show-root false | grep-i的输出吗“9[2-9]\\\124; 100%”
?谢谢Karn Kumar,或者您可以尝试|tr-d'\r'
,而不是通过。
ssh $udcl aggr show -root false | grep -i "9[2-9]%\|100%" > /tmp/${udcl}_aggr.txt
body="`cat /tmp/${udcl}_aggr.txt`"
read -r -d '' variables <<- EOM
{
"description": "$body"
}
EOM
ssh $udcl aggr show -root false | grep -i "9[2-9]%\|100%" | sed 's/\(.*\)\r/"\1"/g' > /tmp/${udcl}_aggr.txt