如何在 ANSI 引号字符串中回显变量

How to echo variables inside an ANSI quoted string

我需要执行这样的 curl 命令:

#!/bin/bash

shopid=9932781
itemid=231873991
curl -sSb /tmp/cookies 'https://website.com' -H 'cookie: csrftoken=mytoken' -H 'x-csrftoken: mytoken' -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary' -H 'referer: https://website.com' \
  --data-binary $'------WebKitFormBoundary\r\nContent-Disposition: form-data; name="shopid"\r\n\r\n${shopid}\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="itemid"\r\n\r\n${itemid}\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="quantity"\r\n\r\n1\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="donot_add_quantity"\r\n\r\nfalse\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="update_checkout_only"\r\n\r\nfalse\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="source"\r\n\r\n\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="checkout"\r\n\r\ntrue\r\n------WebKitFormBoundary--\r\n'

$'' 引号是必需的,否则(即在双引号的情况下)\r\n 将不起作用——但使用这种形式,$shopid$item 没有替换为它们的值。

如何获得这两种行为?

变量在'single quotes'中扩展。

了解引用的工作原理很重要:

"Double quote" every literal that contains spaces/metacharacters and every expansion: "$var", "$(command "$var")", "${array[@]}", "a & b". Use 'single quotes' for code or literal $'s: 'Costs US', ssh host 'echo "$HOSTNAME"'. See http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words


所以,试试这个:

data="------WebKitFormBoundary
Content-Disposition: form-data; name='shopid'

${shopid}
------WebKitFormBoundary
Content-Disposition: form-data; name='itemid'

${itemid}
------WebKitFormBoundary
Content-Disposition: form-data; name='quantity'

1
------WebKitFormBoundary
Content-Disposition: form-data; name='donot_add_quantity'

false
------WebKitFormBoundary
Content-Disposition: form-data; name='update_checkout_only'

false
------WebKitFormBoundary
Content-Disposition: form-data; name='source'


------WebKitFormBoundary
Content-Disposition: form-data; name='checkout'

true
------WebKitFormBoundary--"

data="$(sed 's/$/\r/' <<< "$data")"

curl -sSb /tmp/cookies \
    -H 'cookie: csrftoken=mytoken' \
    -H 'x-csrftoken: mytoken' \
    -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary' \
    -H 'referer: https://website.com' \
    --data-binary "$data" \
    'https://website.com' 

您可以在单个字符串中使用多种引号样式。因此:

$'Constant\r\n\n\r\n'"$bar"

...使用 $'...' 规则解析 \r\n,但使用 double-quoting 规则扩展 $bar(这样扩展也会发生)。

您需要使该代码易于维护

binary_data=$( cat <<END_DATA | sed 's/$/\r/'
------WebKitFormBoundary
Content-Disposition: form-data; name="shopid"

${shopid}
------WebKitFormBoundary
Content-Disposition: form-data; name="itemid"

${itemid}
------WebKitFormBoundary
Content-Disposition: form-data; name="quantity"

1
------WebKitFormBoundary
Content-Disposition: form-data; name="donot_add_quantity"

false
------WebKitFormBoundary
Content-Disposition: form-data; name="update_checkout_only"

false
------WebKitFormBoundary
Content-Disposition: form-data; name="source"


------WebKitFormBoundary
Content-Disposition: form-data; name="checkout"

true
------WebKitFormBoundary--
END_DATA
)

curl_opts=( 
    -sSb /tmp/cookies 
    -H 'cookie: csrftoken=mytoken' 
    -H 'x-csrftoken: mytoken' 
    -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary' 
    -H 'referer: https://website.com' 
    --data-binary "$binary_data"
)

curl "${curl_opts[@]}" 'https://website.com'