curl有效,但不能在BASH脚本中执行

时间:2017-08-07 16:22:26

标签: bash curl

以下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]

2 个答案:

答案 0 :(得分:2)

使用反引号执行仅将命令解释为一系列单词,并且不会特别处理引号。要让shell将引号解释为交互式输入,请改用eval ${login}

顺便说一下,bash有一个-x选项,可以在执行时显示命令(使用bash -x script.sh代替bash script.sh./script.sh运行脚本。这将显示正确引用的命令,并且比使用echo打印它们更有帮助。

答案 1 :(得分:1)

BashcURL可以非常特别地在脚本中使用引号。如果逃脱被抛弃,那么其他一切都很容易失败。通过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}"