Расширение переменной с пробелами в переменную curl POST - PullRequest
4 голосов
/ 03 октября 2011

Некоторые исследования выявили несколько полезных сообщений об обмене стеками, а именно: раскрывающая переменная в CURL , но этот ответ, похоже, неправильно обрабатывает переменные bash, в которых есть пробелы.

IЯ устанавливаю переменную для вывода awk, анализирую строку для подстроки (фактически сокращая до 150 символов).Строка, которую я пытаюсь POST с помощью curl, содержит пробелы.

Когда я использую следующие аргументы 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)}')"

Таким образом, единственная часть smsbody, которая POSTed это $HOSTNAME$ (которая является строкой без пробелов).

Какой синтаксис curl следует использовать для правильного вложения переменной bash для расширения, но при этом ее следует рассматривать как одно поле данных?

Кажется, довольно тривиально, но я какое-то время безуспешно смешивался с цитатами.Я полагаю, что кто-то с лучшим CLI-фу может справиться с этим за секунду.

Спасибо!

1 Ответ

3 голосов
/ 03 октября 2011

Похоже, у вас есть лишняя одинарная кавычка перед 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

Если $ s все еще проблема (я не думаю, что пробелыare), попробуйте это, добавив к ним \:

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 $: 
...