以下curl命令可以从命令行运行。我从服务器得到了有效的回复。
curl -X POST https://somebaseurl/api/v1/auth/login -H "Content-Type:application/json" -d '{"email": "foo@bar,com", "password": "foo"}'
但是我正在尝试编写像这样的BASH脚本
baseUrl=https://somebaseurl
contentTypeJson="\"Content-Type:application/json\""
credentials="'{\"email\": \"foo@bar.com",\"password\": \"foo\"}'"
login="curl -X POST $baseUrl/api/v1/auth/login -H $contentTypeJson -d $credentials"
echo ${login}
response=`${login}`
echo ${response}
我从服务器收到错误的请求响应。但是,如果我将echoed curl命令直接复制到我的终端,它就可以工作。我做错了什么?
编辑:
按要求我得到 错误请求请求' POST api / v1 / auth / login' [预期申请/ json]
答案 0 :(得分:2)
使用反引号执行仅将命令解释为一系列单词,并且不会特别处理引号。要让shell将引号解释为交互式输入,请改用eval ${login}
。
顺便说一下,bash有一个-x
选项,可以在执行时显示命令(使用bash -x script.sh
代替bash script.sh
或./script.sh
运行脚本。这将显示正确引用的命令,并且比使用echo打印它们更有帮助。
答案 1 :(得分:1)
Bash
和cURL
可以非常特别地在脚本中使用引号。如果逃脱被抛弃,那么其他一切都很容易失败。通过shellcheck.net运行脚本通常非常有助于识别此类问题。以下是根据建议修改后脚本的修订版本:
#!/bin/bash
baseUrl="https://somebaseurl/api/v1/auth/login"
contentTypeJson="Content-Type:application/json"
credentials="{\"email\": \"foo@bar.com\", \"password\": \"foo\"}"
login="$(curl -X POST "$baseUrl" -H "$contentTypeJson" -d "$credentials")"
echo "${login}"
response="${login}"
echo "${response}"