[解決済み】bashスクリプトの関数で定義された変数でcurlのPOSTを使用する。
質問
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'
.
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで変数で定義された数値の範囲を反復処理するにはどうすればよいですか?
-
[解決済み] cURL呼び出しによるHTTPリクエストを使用してヘッダーを送信する方法は?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] bashシェルスクリプトの全引数を伝搬させる
-
[解決済み】bashで1つのコマンドでシェル変数にデフォルト値を割り当てる。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AttributeError: 'list' オブジェクトに 'get' 属性がない?
-
[解決済み] Angular: 'Cannot find a differ supporting object '[object Object]' of type 'object'. NgForはArrayのようなIterableへのバインディングのみをサポートしています'。
-
[解決済み] JSONPathで文字列によるフィルタリングを行うには?
-
[解決済み] PandasのDataFrameをJSON形式に変換する
-
[解決済み] BSONとは何ですか?JSONとどう違うのですか?
-
[解決済み] JSON文字列をjqを使用してテーブルとしてフォーマットする方法は?
-
[解決済み] Bashスクリプトでファイルへのheredocを書き込むには?
-
[解決済み】Goを使ってJSONをpretty-printするにはどうすればいいですか?
-
[解決済み】構造体からフィールドを削除したり、JSONレスポンスでフィールドを隠したりする方法
-
[解決済み】application/jsonとapplication/x-www-form-urlencodedの違いは何ですか?