web-dev-qa-db-ja.com

bashスクリプト関数で定義された変数でcurl POSTを使用する

エコーするとこれが出ます。これは端末に入力すると実行されます。

curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data '{"account":{"email":"[email protected]","screenName":"akdgdtk","type":"NIKE","passwordSettings":{"password":"Starwars1","passwordConfirm":"Starwars1"}},"firstName":"Test","lastName":"User","middleName":"ObiWan","locale":"en_US","registrationSiteId":"520","receiveEmail":"false","dateOfBirth":"1984-12-25","mobileNumber":"9175555555","gender":"male","fuelActivationDate":"2010-10-22","postalCode":"10022","country":"US","city":"Beverton","state":"OR","bio":"This is a test user","jpFirstNameKana":"unsure","jpLastNameKana":"ofthis","height":"80","weight":"175","distanceUnit":"MILES","weightUnit":"POUNDS","heightUnit":"FT/INCHES"}' https://xxx:[email protected]/xxxxx/xxxx/xxxx

しかしbashスクリプトファイルで実行すると、このエラーになります。

curl: (6) Could not resolve Host: application; nodename nor servname provided, or not known
curl: (6) Could not resolve Host: is; nodename nor servname provided, or not known
curl: (6) Could not resolve Host: a; nodename nor servname provided, or not known
curl: (6) Could not resolve Host: test; nodename nor servname provided, or not known
curl: (3) [globbing] unmatched close brace/bracket at pos 158

これはファイル内のコードです

curl -i \
-H '"'Accept: application/json'"' \
-H '"'Content-Type:application/json'"' \
-X POST --data "'"'{"account":{"email":"'$email'","screenName":"'$screenName'","type":"'$theType'","passwordSettings":{"password":"'$password'","passwordConfirm":"'$password'"}},"firstName":"'$firstName'","lastName":"'$lastName'","middleName":"'$middleName'","locale":"'$locale'","registrationSiteId":"'$registrationSiteId'","receiveEmail":"'$receiveEmail'","dateOfBirth":"'$dob'","mobileNumber":"'$mobileNumber'","gender":"'$gender'","fuelActivationDate":"'$fuelActivationDate'","postalCode":"'$postalCode'","country":"'$country'","city":"'$city'","state":"'$state'","bio":"'$bio'","jpFirstNameKana":"'$jpFirstNameKana'","jpLastNameKana":"'$jpLastNameKana'","height":"'$height'","weight":"'$weight'","distanceUnit":"MILES","weightUnit":"POUNDS","heightUnit":"FT/INCHES"}'"'" "https://xxx:[email protected]/xxxxx/xxxx/xxxx"

私は私の引用符に問題があると思います、しかし私は彼らとたくさん遊んで、そして私は同様のエラーを得ました。実際のスクリプトでは、すべての変数が異なる関数で定義されています

120
AGleasonTU

カスタムヘッダーを囲む引用符をcurlに渡す必要はありません。また、引数dataの途中にある変数も引用符で囲む必要があります。

まず、スクリプトの投稿データを生成する関数を書きます。これはシェルの引用に関するあらゆる頭痛の種からあなたを救い、あなたの試みのようにcurlの呼び出し行にpostデータを与えるよりもスクリプトを維持することを読みやすくします:

generate_post_data()
{
  cat <<EOF
{
  "account": {
    "email": "$email",
    "screenName": "$screenName",
    "type": "$theType",
    "passwordSettings": {
      "password": "$password",
      "passwordConfirm": "$password"
    }
  },
  "firstName": "$firstName",
  "lastName": "$lastName",
  "middleName": "$middleName",
  "locale": "$locale",
  "registrationSiteId": "$registrationSiteId",
  "receiveEmail": "$receiveEmail",
  "dateOfBirth": "$dob",
  "mobileNumber": "$mobileNumber",
  "gender": "$gender",
  "fuelActivationDate": "$fuelActivationDate",
  "postalCode": "$postalCode",
  "country": "$country",
  "city": "$city",
  "state": "$state",
  "bio": "$bio",
  "jpFirstNameKana": "$jpFirstNameKana",
  "jpLastNameKana": "$jpLastNameKana",
  "height": "$height",
  "weight": "$weight",
  "distanceUnit": "MILES",
  "weightUnit": "POUNDS",
  "heightUnit": "FT/INCHES"
}
EOF
}

この関数をcurlの呼び出しに使用するのは簡単です。

curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data "$(generate_post_data)" "https://xxx:[email protected]/xxxxx/xxxx/xxxx"

これは、シェルの引用ルールに関するいくつかの明確化です。

-Hのように)-H "foo bar"引数内の二重引用符は、(空白を含んでいても)単一の引数として内部を保持するようにbashに指示します。

--data引数内の一重引用符(--data 'foo bar'の場合と同様)は、すべてのテキストを逐語的に渡すこと(二重引用符とドル記号を含む)を除いて同じです。

一重引用符で囲まれたテキストの途中に変数を挿入するには、一重引用符を終了してから二重引用符で囲まれた変数と連結し、一重引用符を再度開いてテキストを継続します:'foo bar'"$variable"'more foo'

208
Sir Athos

https://httpbin.org/ およびインラインbashスクリプトでテスト済みのソリューション
1。スペースを含まない変数、つまり1の場合:
目的の文字列を置き換えるときは、単に'の前後に$variableを追加する

for i in {1..3}; do \
  curl -X POST -H "Content-Type: application/json" -d \
    '{"number":"'$i'"}' "https://httpbin.org/post"; \
done

2。スペースを含む入力の場合:
追加の"、すなわち"el a"でvariableをラップします。

declare -a arr=("el a" "el b" "el c"); for i in "${arr[@]}"; do \
  curl -X POST -H "Content-Type: application/json" -d \
    '{"elem":"'"$i"'"}' "https://httpbin.org/post"; \
done

うわー、:)

59
pbaranski

Curlはファイルからバイナリデータをポストすることができるので、curlで厄介なものをポストする必要があるときにプロセス置換を使用し、ファイル記述子を利用しながら、現在のシェルのvarにアクセスしたいと考えています。何かのようなもの:

curl "http://localhost:8080" \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
--data @<(cat <<EOF
{
  "me": "$USER",
  "something": $(date +%s)
  }
EOF
)

これは--data @/dev/fd/<some number>のようになり、通常のファイルのように処理されます。とにかく、ローカルで動くのを見たいのなら、最初にnc -l 8080を実行し、別のシェルで上記のコマンドを実行してください。あなたは次のように見えるでしょう:

POST / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.43.0
Accept: application/json
Content-Type:application/json
Content-Length: 43

{  "me": "username",  "something": 1465057519  }

お分かりのように、あなたはサブシェルとwhatnotを呼び出すことができ、またheredocのvarを参照することもできます。ハッピーハッキングはこれが'"'"'""""'''""''に役立つことを願っています。

25

数年遅れていますが、evalまたはバックティック置換を使用している場合、これは誰かに役立つかもしれません。

postDataJson="{\"guid\":\"$guid\",\"auth_token\":\"$token\"}"

応答の最初と最後から引用符を削除するためのsedの使用

$(curl --silent -H "Content-Type: application/json" https://${target_Host}/runs/get-work -d ${postDataJson} | sed -e 's/^"//' -e 's/"$//')
6
glyph
  • アトス卿からの情報は完璧に機能しました!

これが、couchDBのcurlスクリプトで使用しなければならない方法です。それは本当に大いに役立ちました。ありがとうございます。

bin/curl -X PUT "db_domain_name_:5984/_config/vhosts/$1.couchdb" -d '"/'"$1"'/"' --user "admin:*****"
4
user3416297