如何在 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'
我需要执行这样的 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'