当 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 的回答很好。认真考虑他的建议。