Zac*_*ith 1 bash curl string-interpolation
我有以下字符串:
barrelRepDoc='{"'"_id"'":"'"push_$systemName"'","'"source"'":"'"$systemName"'","'"target"'":"'"platform2ReplicationTargetBaseURL/$systemName"'","'"create_target"'":true,"'"continuous"'":true,"'"user_ctx"'":{"'"name"'":"'"admin"'","'"roles"'":["'"_admin"'"]},"'"owner"'":"'"admin"'"}'
Run Code Online (Sandbox Code Playgroud)
我将该字符串作为-d参数传递给cURL字符串,如下所示:
barrelRepcURL="curl -u $username:$password -X POST couchURL/db -H 'Content-Type:application/json' -d '$barrelRepDoc'"
Run Code Online (Sandbox Code Playgroud)
然后我在这一行执行命令:
barrelRepcURLresponse=$($barrelRepcURL)
Run Code Online (Sandbox Code Playgroud)
我收到了无效的JSON.但是,如果我打印出$ barrelRepcURL,我会得到一个字符串,该字符串在粘贴到终端时应该执行.
我想要反馈cURL命令,这就是我使用字符串的原因.(echo $barrelRepcURLresponse)
如何在cURL命令字符串中包含barrelRepDoc并保留有效的JSON?
您是否有任何理由尝试使用字符串而不是函数?
这可行:
barrelRepcURL() {
local username=$1
local password=$2
local barrelRepDoc=$3
curl -u "$username":"$password" -X POST couchURL/db -H 'Content-Type:application/json' -d "$barrelRepDoc"
}
Run Code Online (Sandbox Code Playgroud)
然后就像打电话一样barrelRepcURL user pass "$barrelRepDoc".显然你可以跳过局部变量的创建,如果你愿意,可以直接使用位置参数.
curl命令的响应已经打印到屏幕上,因此不需要将其存储到变量中.但是,response=$(barrelRepcURL ...)如果你愿意,它仍然可以使用.
您可能想要考虑使用printf来构建您的JSON变量:
printf -v barrelRepDoc '{"_id":"push_%s","source":"%s","target":"platform2ReplicationTargetBaseURL/%s","create_target":true,"continuous":true,"user_ctx":{"name":"admin","roles":["_admin"]},"owner":"admin"}' "$systemName" "$systemName" "$systemName"
Run Code Online (Sandbox Code Playgroud)
该-v开关可用于写入变量.它仍然是一个很长的路线,但意味着你不必打扰尽可能多的报价.
或者,正如chepner在评论中所建议的那样(感谢),您可以使用诸如jq生成JSON 的工具:
barrelRepDoc=$(jq -n --arg systemName foo '{
_id: ("push_" + $systemName),
source: $systemName,
target: ("platform2ReplicationTargetBaseURL/" + $systemName),
create_target: true,
continuous: true,
user_ctxa: { name: "admin", roles: ["_admin"] },
owner: "admin"
}')
Run Code Online (Sandbox Code Playgroud)
在此示例中,您将替换foo为将用作的值$systemName.