用 2 个引号括起来的 Bash 变量

用 2 个引号括起来的 Bash 变量

我想发送这样的请求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@-

是的,语法有点奇怪。

相关内容