如何向此curl 命令添加变量?

如何向此curl 命令添加变量?

我有一个curl 命令将一串文本发送到服务器,并且我一直在尝试弄清楚如何让该文本字符串来自文件或bash 变量。该命令如下所示:

curl -X POST -u "apikey:<apikey>"
--header "Content-Type: application/json"
--data '{"text": "<variable>"}'
"<url>"

我不知道如何在那里获取变量。我尝试用 $variable 和 $(< file) 替换,但我不知道如何让它们在没有回声的情况下吐出文本,而且我无法在卷曲中回声。

答案1

停止单引号字符串,后面进行变量扩展,可能是双引号,然后恢复单引号字符串:

--data '{"text": "'"$variable"'"}'

$variable仍然应该扩展到与周围环境一起形成合法 JSON 的东西,否则另一方可能不会很高兴:)。)

如果"$variable"可以包含 JSON 特殊符号,您需要先转义它们 - 请参阅库萨兰达 更通用的答案为了那个原因。

答案2

只是为了在这里再提出一种解决方案:

curl -X POST -u "apikey:${apikey}"
--header "Content-Type: application/json"
--data "{\"text\": \"${variable}\"}"
"${url}"

基本上,"是一个引号,用于一起处理后面的字符串,\"转义引号,并且${varname}是一个变量。

答案3

我倾向于使用此处文档构建与curl一起使用的JSON时:

curl -s -X POST $URL -d@- <<EOF
[
    {
        "id": 101,
        "text": "$variable"
    }
]
EOF

答案4

假设您要创建一个包含任意字符串的 JSON 文档,则必须正确引用此字符串并对其进行 JSON 编码(JSON 字符串中不允许使用各种字符作为文字,必须对其进行转义或用编码替换)。最简单的方法是使用支持 JSON 的工具,例如jqjo

使用(这将使用在命令行上jq指定的每个键+值对创建一个对象;用于不是字符串的值):--arg key value--argjson key value

jq -nc --arg text "$variable" '$ARGS.named'

使用jo(这会创建一个对象,其键和值=在命令行上以 - 分隔对的形式给出;值的类型将通过以下方式推断jo(请参阅手册)):

jo text="$variable"

使用上面两个命令中的任何一个,可以在管道中发布生成的 JSON 文档,如下所示:

json-generating-command |
curl --silent --show-error \
    --user "apikey:$apikey" \
    --json @- "$url"

相关内容