1. ホーム

[解決済み】bashスクリプトの関数で定義された変数でcurlのPOSTを使用する。

2022-04-21 15:18:22

質問

echoすると次のようになり、それをターミナルに入力すると実行されます。

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"

私の引用符に問題があるのだと思いますが、何度も弄っているうちに同じようなエラーが出るようになりました。 実際のスクリプトでは、すべての変数が異なる関数で定義されています。

どのように解決するのですか?

カスタムヘッダを囲む引用符は、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' .