当 curl 命令本身是一个字符串时,如何在 cURL 命令中包含 JSON 字符串
How to include JSON string in cURL command when curl command itself is a string
我有以下字符串:
barrelRepDoc='{"'"_id"'":"'"push_$systemName"'","'"source"'":"'"$systemName"'","'"target"'":"'"platform2ReplicationTargetBaseURL/$systemName"'","'"create_target"'":true,"'"continuous"'":true,"'"user_ctx"'":{"'"name"'":"'"admin"'","'"roles"'":["'"_admin"'"]},"'"owner"'":"'"admin"'"}'
我将该字符串作为 -d 参数传递给 cURL 字符串,如下所示:
barrelRepcURL="curl -u $username:$password -X POST couchURL/db -H 'Content-Type:application/json' -d '$barrelRepDoc'"
然后我在这一行执行命令:
barrelRepcURLresponse=$($barrelRepcURL)
而且我变得无效 JSON。但是,如果我打印出 $barrelRepcURL,我会得到一个字符串,该字符串在粘贴到终端时会按预期执行。
我想要有关 cURL 命令的反馈,这就是我使用字符串的原因。 (echo $barrelRepcURLresponse
)
如何在 cURL 命令字符串中包含 barrelRepDoc 并保持有效 JSON?
您尝试使用字符串而不是函数有什么原因吗?
这可行:
barrelRepcURL() {
local username=
local password=
local barrelRepDoc=
curl -u "$username":"$password" -X POST couchURL/db -H 'Content-Type:application/json' -d "$barrelRepDoc"
}
然后就像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"
-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"
}')
在此示例中,您将 foo
替换为将用作 $systemName
的值。
这是 BashFaq50 -- 简短的回答是使用数组来保存 curl 命令:
barrelRepDoc='{"_id":"push_'"$systemName"'","source":"'"$systemName"'","target":"platform2ReplicationTargetBaseURL/'"$systemName"'","create_target":true,"continuous":true,"user_ctx":{"name":"admin","roles":["_admin"]},"owner":"admin"}'
barrelRepcURL=(
curl -u "$username:$password"
-X POST
-H 'Content-Type:application/json'
-d "$barrelRepDoc"
couchURL/db
)
barrelRepcURLresponse=$( "${barrelRepcURL[@]}" )
Tom 的回答很好。认真考虑他的建议。
我有以下字符串:
barrelRepDoc='{"'"_id"'":"'"push_$systemName"'","'"source"'":"'"$systemName"'","'"target"'":"'"platform2ReplicationTargetBaseURL/$systemName"'","'"create_target"'":true,"'"continuous"'":true,"'"user_ctx"'":{"'"name"'":"'"admin"'","'"roles"'":["'"_admin"'"]},"'"owner"'":"'"admin"'"}'
我将该字符串作为 -d 参数传递给 cURL 字符串,如下所示:
barrelRepcURL="curl -u $username:$password -X POST couchURL/db -H 'Content-Type:application/json' -d '$barrelRepDoc'"
然后我在这一行执行命令:
barrelRepcURLresponse=$($barrelRepcURL)
而且我变得无效 JSON。但是,如果我打印出 $barrelRepcURL,我会得到一个字符串,该字符串在粘贴到终端时会按预期执行。
我想要有关 cURL 命令的反馈,这就是我使用字符串的原因。 (echo $barrelRepcURLresponse
)
如何在 cURL 命令字符串中包含 barrelRepDoc 并保持有效 JSON?
您尝试使用字符串而不是函数有什么原因吗?
这可行:
barrelRepcURL() {
local username=
local password=
local barrelRepDoc=
curl -u "$username":"$password" -X POST couchURL/db -H 'Content-Type:application/json' -d "$barrelRepDoc"
}
然后就像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"
-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"
}')
在此示例中,您将 foo
替换为将用作 $systemName
的值。
这是 BashFaq50 -- 简短的回答是使用数组来保存 curl 命令:
barrelRepDoc='{"_id":"push_'"$systemName"'","source":"'"$systemName"'","target":"platform2ReplicationTargetBaseURL/'"$systemName"'","create_target":true,"continuous":true,"user_ctx":{"name":"admin","roles":["_admin"]},"owner":"admin"}'
barrelRepcURL=(
curl -u "$username:$password"
-X POST
-H 'Content-Type:application/json'
-d "$barrelRepDoc"
couchURL/db
)
barrelRepcURLresponse=$( "${barrelRepcURL[@]}" )
Tom 的回答很好。认真考虑他的建议。