Использование curl POST с переменными, определенными в функциях скрипта bash
когда я Эхо я получаю это, который работает, когда я ввожу его в терминал
curl -i
-H "Accept: application/json"
-H "Content-Type:application/json"
-X POST --data '{"account":{"email":"akdgdtk@test.com","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:xxxxx@xxxx-www.xxxxx.com/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:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx"
Я предполагаю, что есть проблема с моими кавычками, но я играл с ними много, и я получил подобные ошибки. Все переменные определяются с различными функциями в фактическом скрипте
5 ответов:
вам не нужно передавать кавычки, заключающие пользовательские заголовки в curl. Кроме того, ваши переменные в середине
data
аргумент должен быть заключен в кавычки.во-первых, напишите функцию, которая генерирует данные post вашего скрипта. Это избавляет вас от всевозможных головных болей, связанных с цитированием оболочки, и облегчает чтение сценария поддержания, чем подача данных post на строку вызова curl, как в вашей попытке:
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:xxxxx@xxxx-www.xxxxx.com/xxxxx/xxxx/xxxx"
это говорит, Вот несколько разъяснений о правилах цитирования оболочки:
двойные кавычки в
-H
аргументов (как в-H "foo bar"
) скажите bash, чтобы сохранить то, что внутри, как один аргумент (даже если он содержит пробелы).одинарные кавычки в
решение испытанное с 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"
: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
Ух ты, работает :)
Curl может публиковать двоичные данные из файла, поэтому я использую подстановку процессов и использую файловые дескрипторы всякий раз, когда мне нужно опубликовать что-то неприятное с curl и все еще хочу получить доступ к vars в текущей оболочке. Что-то вроде:
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 }
как вы можете видеть, вы можете называть подоболочки и еще много чего, а также ссылаться на vars в heredoc. Счастливый взлом надеюсь, что это поможет с
'"'"'""""'''""''
.
- информация от Сэра Атоса работала отлично !!
вот как я должен был использовать его в моем скрипте curl для couchDB. Это действительно помогло много. Спасибо!
bin/curl -X PUT "db_domain_name_:5984/_config/vhosts/.couchdb" -d '"/'""'/"' --user "admin:*****"
несколько лет спустя, но это может помочь кому-то, если вы используете eval или backtick замену:
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/"$//')