【问题标题】:curl works, but won't execute in BASH scriptcurl 有效,但不会在 BASH 脚本中执行
【发布时间】:2017-08-07 16:22:26
【问题描述】:

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

我从服务器收到错误的请求响应。但是,如果我将回显的 curl 命令直接复制到我的终端中,它就可以工作。我做错了什么?

编辑:

根据要求,我得到 错误请求请求'POST api/v1/auth/login' [预期的应用程序/json]

【问题讨论】:

  • “我收到了错误的请求响应”您得到的响应是什么?请编辑您的问题以包含错误
  • @sircapsalot 完成,谢谢
  • 在“登录”中,将-v 选项添加到 curl 命令以启用详细输出。也许您的命令没有按预期进行插值
  • 您不应该将直引号放在双引号内,然后尝试将其用作引用此类论点的一种方式。使用 \"$credentials\" 并删除赋值语句中的单引号。内容类型也是如此。 (这个修复是否解决了问题,我猜不出来,但它让代码变得混乱。)

标签: bash curl


【解决方案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}"

【讨论】:

  • 谢谢,明白了!
【解决方案2】:

使用反引号执行只会将命令解释为单词序列,不会特别对待引号。要让 shell 将引号解释为好像它们是交互式输入的,请改用 eval ${login}

顺便说一句,bash 有一个-x 选项,它将在执行命令时向您显示命令(使用bash -x script.sh 而不是bash script.sh./script.sh 运行您的脚本)。这将显示正确引用的命令,并且比使用 echo 打印出来更有帮助。

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 2016-07-29
    • 2017-03-26
    • 2018-11-22
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多