使用变量执行curl命令

使用变量执行curl命令

我在 Linux 脚本上使用curl 时遇到问题:

#!/bin/bash


用户名=“用户”;
密码=“密码”;
租户名称=“租户”;

commande="curl -X POST -H \"内容类型:application/json\" -H
\“缓存控制:无缓存\”-H
 \“邮递员令牌:111131da-8254-21b3-1b95-9c12954152c9\”
-d '{\"auth\":{\"tenantName\":\"$tenantName\",\"passwordCredentials\":
{\"用户名\":\"$userName\",\"密码\":\"$passWord\"}}}'
 \“http://controller:5000/v2.0/tokens\””

当变量 commande 的输出复制粘贴到 shell 中时,它可以工作,但是当我使用时:

res= $(eval $commande)
#或者
res=`$commande`

这些命令都不起作用,这是我通常得到的输出错误:

第 11 行:{“access”:: 未找到命令

PS:如果我这样做

回显$命令

然后我将结果复制到 shell 上,它可以工作,如果有人可以帮助我,那就太好了!

答案1

变量用于数据,而不是代码。定义一个函数。这也简化了您的报价。

#!/bin/bash

userName="user"
passWord="password"
tenantName="tenant"

commande () {
    curl -X POST \
         -H "Content-Type: application/json" \
         -H "Cache-Control: no-cache" \
         -H "Postman-Token: ..." \
         -d@- \
         http://controller:5000/v2.0/tokens <<EOF
    {
      "auth": {
        "tenantName": "$tenantName",
        "passwordCredentials": {
          "username": "$userName",
          "password": "$password"
        }
      }
    }
EOF
}

上面还从此处文档读取 JSON(从标准输入@-读取选项的参数-d),而不是将其嵌入到字符串中以进一步简化引用。

userName但是,如果您不能确保、passWord和的值tennatnName正确进行 JSON 编码,那么像这样手动编码 JSON 也是一个坏主意。更好的解决方案是使用类似的方法jq为您生成正确的 JSON。

commande () {
  json_template='{
    auth: {
      tenantName: $tn,
      passwordCredentials: {
        username: $un,
        password: $pw
      }
    }
  }'
  jq -n --arg un "$userName" \
        --arg pw "$passWord" \
        --arg tn "$tenantName" "$json_template" |
    curl -X POST
         -H "Content-Type: application/json" \
         -H "Cache-Control: no-cache" \
         -H "Postman-Token: ..." \
         -d@- \
         http://controller:5000/v2.0/tokens
}

相关内容