在 bash 中使用单引号在 curl JSON 请求中设置变量

在 bash 中使用单引号在 curl JSON 请求中设置变量

我有以下简单的函数和脚本,我想设置变量 $1 或以下其中的任何其他变量:

curl --request POST \
  --url 'https://api.securitytrails.com/v1/domains/list?include_ips=false&scroll=false' \
  --header 'APIKEY: XXX' \
  --header 'Content-Type: application/json' \
  --data '
{
  "filter": {
    "whois_organization": "$1"
  }
}
'

我在 StackExchange 中尝试了几种解决方案,这些解决方案都与使用双引号 + 转义符在单引号内插入变量有关,但是没有起作用,我知道在单引号内所有内容都会按原样保留,但是 JSON 值内的变量有双引号,我想既然存在双引号,那么它将采用脚本的第一个参数,即函数。

有什么想法可以解决这个问题,以便我可以将脚本中的第一个参数传递给发送的请求?

答案1

请参见参数扩展(变量扩展)和引号内的引号'foo "$1" bar'所有内容都用单引号引起来,包括没有特殊含义的双引号。

你可以连接单独引用或不引用的字符串。例如:

"D quoted"'S quoted'not quoted"D quoted again"

将被 shell 视为两个单词。未加引号(且未转义)的空格将单词分开,并且引号更改的地方不会发生任何事情(我的意思是没有插入空格或任何内容)。结果单词将是:D quotedS quotednot, quotedD quoted again

因此你可以这样做:

var='lorem ipsum'
echo 'the value of $var is '"$var"

其中引号的类型会发生变化,但结果字符串会形成一个单词(即 的一个参数echo)。如果您需要文字双引号,则将其用单引号括起来:

var='lorem ipsum'
echo 'the value of $var is "'"$var"'"'

我想这就是你想要的:

  --data '
{
  "filter": {
    "whois_organization": "'"$1"'"
  }
}
'

片段如下:

--data '… "'"$1"'" …'
#      ^   ^           a pair of single-quotes
#               ^   ^  another pair of single-quotes
#       ^^^      ^^^   single-quoted content
#           ^  ^       a pair of double-quotes
#            ^^        double-quoted parameter

这里只有位置参数是双引号(因此它将被扩展);字符串的其余部分是单引号。

相关内容