Bash 变量用 2 个引号括起来

Ugr*_*oon 7 bash curl

我想发送这样的请求curl

curl some parameters and headers --data-binary '{"secret":"$1"}'
Run Code Online (Sandbox Code Playgroud)

$1不是可变的。我尝试使用echo这个命令:

echo '{"asd":"$1"}' dhkdgb
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出:

{"asd":"$1"} dhkdgb
Run Code Online (Sandbox Code Playgroud)

但是,我想得到这个输出:

{"asd":"dhkdgb"}
Run Code Online (Sandbox Code Playgroud)

根据curl要求,我想发送以下内容:

curl some parameters and headers --data-binary '{"secret":"argv 0 of script"}'
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

ste*_*ver 11

有几种方法可以做到这一点。给定

$ set -- 'foo bar'
Run Code Online (Sandbox Code Playgroud)

(为 shell 的第一个位置参数赋值foo bar,就像在像这样调用的脚本中一样myscript "foo bar")然后例如

$ echo '{"asd:":"'"$1"'"}'
{"asd:":"foo bar"}
Run Code Online (Sandbox Code Playgroud)

或者

$ echo {\"asd:\":\""$1"\"}
{"asd:":"foo bar"}
Run Code Online (Sandbox Code Playgroud)

但是,您可能会发现使用 shell 的printf内置函数来创建可以分配给新变量的格式化字符串会更清晰:

$ printf -v data '{"asd": "%s"}' "$1"
$ echo "$data"
{"asd": "foo bar"}
Run Code Online (Sandbox Code Playgroud)

然后您可以将其用作

curl some parameters and headers --data-binary "$data"
Run Code Online (Sandbox Code Playgroud)

或者,由于您似乎正在尝试将 JSON 对象传递给curl 命令,因此您可以考虑使用jq代替printf

$ jq -nc --arg x "$1" '{asd: $x}'
{"asd":"foo bar"}
Run Code Online (Sandbox Code Playgroud)

或类似地使用内置$ARGS数组

$ jq -nc --arg asd "$1" '$ARGS.named'
{"asd":"foo bar"}
Run Code Online (Sandbox Code Playgroud)

如果您想将名称和值都传递给构造函数。