我在 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
}