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