我想发送这样的请求curl
:
curl some parameters and headers --data-binary '{"secret":"$1"}'
但$1
不是变量。我尝试使用echo
以下命令:
echo '{"asd":"$1"}' dhkdgb
我得到了这个输出:
{"asd":"$1"} dhkdgb
但是,我想获得这个输出:
{"asd":"dhkdgb"}
根据curl
要求,我想发送此内容:
curl some parameters and headers --data-binary '{"secret":"argv 0 of script"}'
我该如何解决这个问题?
答案1
有几种方法可以做到这一点,例如
$ set -- 'foo bar'
(为 shell 的第一个位置参数赋值foo bar
,就像在类似这样的脚本中调用一样myscript "foo bar"
)然后例如
$ echo '{"asd:":"'"$1"'"}'
{"asd:":"foo bar"}
或者
$ echo {\"asd:\":\""$1"\"}
{"asd:":"foo bar"}
但是,您可能会发现使用 shell 的printf
内置命令来创建可以分配给新变量的格式化字符串更加简洁:
$ printf -v data '{"asd": "%s"}' "$1"
$ echo "$data"
{"asd": "foo bar"}
然后你可以使用它作为
curl some parameters and headers --data-binary "$data"
或者,由于您似乎试图将 JSON 对象传递给 curl 命令,因此您可以考虑jq
使用printf
:
$ jq -nc --arg x "$1" '{asd: $x}'
{"asd":"foo bar"}
或者类似地使用内置$ARGS
数组
$ jq -nc --arg asd "$1" '$ARGS.named'
{"asd":"foo bar"}
如果您想将名称和值都传递给构造函数。
答案2
我倾向于使用定界符和-d@-
(从 stdin 读取输入数据)用于组成 JSON 请求主体:
cat <<EOF |
{
"secret": "$SECRET"
}
EOF
curl ... \
-X POST \
-H "Content-Type: application/json" \
"${BASE_URL%%/}/the/path" -d@-
是的,语法有点奇怪。