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
然后我将结果复制到它可以工作的外壳上,如果有人可以帮助我,那就太好了!
变量用于数据,而不是代码。定义一个函数。这也简化了您的引用。
#!/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)