4

一部の調査では、いくつかの便利な stackexchange の投稿、つまり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$(たまたま空白文字のない文字列) です。

bash変数を適切にネストして展開するために使用する必要があるcurl構文は何ですか?ただし、単一のデータフィールドとして取得されますか?

かなり些細なことのように思えますが、運が悪かったので、しばらく引用符をいじりました。より優れた CLI-fu を持つ人なら、すぐに処理できると思います。

ありがとう!

4

1 に答える 1

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

sがまだ問題である場合$(スペースは問題ではないと思います)、これを試して、\それらの前にaを追加します。

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 $: 
于 2011-10-03T15:45:50.843 に答える