一些研究揭示了一些有用的stackexchange帖子,即expanding variable in CURL,但给定答案似乎没有正确处理其中包含空格的bash变量。
我正在为awk的输出设置一个变量,为子字符串解析字符串(实际上截断为150个字符)。我试图通过curl POST的字符串中有空格。
当我使用以下curl参数时,POST变量Body
被设置为第一个空格之前的字符串部分。
curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/GUID/SMS/Messages.xml' -d 'From=DIDfrom' -d 'To=DIDto' -d 'Body="'$smsbody'" -u SECGUID
smsbody
设为:
smsbody="$(echo $HOSTNAME$ $SERVICEDESC$ in $SERVICESTATE$\: $SERVICEOUTPUT$ | awk '{print substr($0,0,150)}')"
因此,POST smsbody
的唯一部分是$HOSTNAME$
(恰好是没有任何空格字符的字符串)。
我应该使用什么curl语法来正确嵌套bash变量以进行扩展,但是可以将其作为单个数据字段?
看起来很琐碎,但是如果没有运气,我就会引用一段时间。我认为有更好的CLI-fu的人可以在一秒钟内处理它。
谢谢!
答案 0 :(得分:3)
看起来你在 Body 之前有一个额外的单引号。您还需要双引号或$ smsbody不会被评估。
试试这个:
curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/GUID/SMS/Messages.xml' \
-d 'From=DIDfrom' -d 'To=DIDto' -d "Body=$smsbody" -u SECGUID
如果$
仍然存在问题(我认为不是空格),请尝试将\
添加到其中:
smsbody2=`echo $smsbody | sed 's/\\$/\\\\$/g'`
curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/GUID/SMS/Messages.xml' \
-d 'From=DIDfrom' -d 'To=DIDto' -d "Body=$smsbody2" -u SECGUID
如果我运行nc -l 5000
并将twilio地址更改为localhost:5000,我会看到smsbody变量正确进入。
matt@goliath:~$ nc -l 5000POST / HTTP/1.1
Authorization: Basic U0VDR1VJRDphc2Q=
User-Agent: curl/7.21.6 (x86_64-apple-darwin10.7.0) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.5 libidn/1.20
Host: localhost:5000
Accept: */*
Content-Length: 45
Content-Type: application/x-www-form-urlencoded
From=DIDfrom&To=DIDto&Body=goliath$ $ in $: