如何在ANSI引号字符串中回显变量?附curl命令场景示例
在Bash的ANSI引号字符串中解析变量的解决方案
你遇到的问题很典型:Bash里的$'...'(ANSI-C引号字符串)只会处理转义字符(比如\r\n这种换行符),但单引号类的字符串里变量替换是被禁用的,所以${shopid}和${itemid}会被当作纯文本输出,不会替换成你定义的变量值。
这里有两种简单可靠的解决办法:
方法1:拼接字符串(最直接)
把需要解析变量的部分从ANSI引号里拆出来,用双引号包裹(双引号支持变量替换),再和ANSI引号的部分拼接在一起:
#!/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\n这类转义序列,生成正确的换行格式"${shopid}"和"${itemid}"负责解析变量,替换成实际的值- Bash会自动把相邻的字符串(不管是单引号、双引号还是ANSI引号的)拼接成一个完整的字符串
方法2:用printf构建数据(更清晰)
如果你的表单内容比较复杂,用printf来构建完整的请求数据会更易读,printf既支持转义字符,也支持变量替换:
#!/bin/bash shopid=9932781 itemid=231873991 # 用printf生成带变量和正确换行的请求数据 request_data=$(printf '------WebKitFormBoundary\r\nContent-Disposition: form-data; name="shopid"\r\n\r\n%s\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="itemid"\r\n\r\n%s\r\n------WebKitFormBoundary--' "$shopid" "$itemid") # 把生成好的数据传给curl 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 "$request_data"
这种方式把数据构建和curl调用分开,逻辑更清晰,后续修改表单字段也更方便。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

