我有一个curl 命令将一串文本发送到服务器,并且我一直在尝试弄清楚如何让该文本字符串来自文件或bash 变量。该命令如下所示:
curl -X POST -u "apikey:<apikey>"
--header "Content-Type: application/json"
--data '{"text": "<variable>"}'
"<url>"
我不知道如何在那里获取变量。我尝试用 $variable 和 $(< file) 替换,但我不知道如何让它们在没有回声的情况下吐出文本,而且我无法在卷曲中回声。
答案1
答案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 的工具,例如jq
或jo
:
使用(这将使用在命令行上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"