使用变量执行 curl 命令

Kin*_*ech 1 shell bash shell-script

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

#!/bin/bash


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

commande="curl -X POST -H \"Content-Type: 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:如果我这样做

回声 $commande

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

che*_*ner 9

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

#!/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
}
Run Code Online (Sandbox Code Playgroud)

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

然而,它也是一个坏主意,手工编写JSON这样的,如果你不保证的价值观userName,passWord以及tennatnName正确的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
}
Run Code Online (Sandbox Code Playgroud)