我有一个简单的bash脚本,它使用api将自己添加到数据库中。但剧本不断添加' '我的变量和破碎的卷曲。
hostname=`hostname`
ip_address=`ip add show eth0 | grep 'inet ' | awk '{ print $2 }' | cut -d '/' -f1`
env=`hostname | cut -d '-' -f1`
os=`cat /etc/issue.net | head -1`
date=`date`
curl -H 'Content-Type: application/json' -PUT "https://10.10.10.10/database" -k -d '{"Environment":"'$env'","Hostname":"'$hostname'","IP_Address":"'$ip_address'","OS":"'$os'","State":"OK","Updated_Time":"'$date'"}'
exit $?
输出是这样的:
curl -H 'Content-Type: application/json' -PUT https://10.10.10.10/database -k -d '{"Environment":"ops","Hostname":"ex-example-host","IP_Address":"10.10.10.10","OS":"Ubuntu' 14.04 'LTS","State":"OK","Updated_Time":"Thu' Aug 14 15:27:55 PDT '2014"}'
$date
和$hostname
都放置了' '在里面打破卷曲的格式。有办法解决这个问题吗?
谢谢,
答案 0 :(得分:1)
问题是你要在bash
中不加引号扩展参数扩展,因此这些值中的空格会分隔传递给curl
的单词。如果JSON允许您使用单引号,那么交换使用双引号和单引号会更简单。不是这样,我会先使用read
将JSON存储在变量中,然后再使用here文档来简化引用。
read -r data <<EOF
{"Environment":"$env","Hostname":"$hostname","IP_Address":"$ip_address","OS":"$os","State":"OK","Updated_Time":"$date"}
EOF
curl ... -d "$data"