我有以下简单的函数和脚本,我想设置变量 $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
这里只有位置参数是双引号(因此它将被扩展);字符串的其余部分是单引号。