Bash awk脚本转义随记
来自三线的随记
由于某种奇怪的需求写了个curl版本爬虫
然后踩了个有趣的坑,mark一下,希望以后自己有能力给自己解答
前提说明
& 是 awk 的求余符号
& 是html字符实体编码(对应就是&)
来个简单的玩法
#!/bin/bash set -xv a="test&" echo ` echo $a | awk '{gsub("&","&",$0);print $0}' `
其实预期效果个人感觉应该是抛出异常,然而
a="test&" + a='test&' echo ` echo $a | awk '{gsub("&","&",$0);print $0}' ` echo $a | awk '{gsub("&","&",$0);print $0}' ++ awk '{gsub("&","&",$0);print $0}' ++ echo 'test&' + echo 'test&' test&
真难看,解开一下
#set +x + a='test&' ++ awk '{gsub("&","&",$0);print $0}' ++ echo 'test&' + echo 'test&' test& #set +v a="test&" echo ` echo $a | awk '{gsub("&","&",$0);print $0}' ` echo $a | awk '{gsub("&","&",$0);print $0}' test&
看起来没报错,但是结果不符合预期,估计gsub里面憨憨了(我猜)
对比
#!/bin/bash set -v a="test&" echo ` echo $a | awk '{gsub("&","1",$0);print $0}' `
root@Server:~# bash awk_bash.sh a="test&" echo ` echo $a | awk '{gsub("&","1",$0);print $0}' ` echo $a | awk '{gsub("&","1",$0);print $0}' test1;
转义
#!/bin/bash set -v a="test&" echo ` echo $a | awk '{gsub("&","\\\&",$0);print $0}' `
结果符合预期
a="test&" echo ` echo $a | awk '{gsub("&","\\\&",$0);print $0}' ` echo $a | awk '{gsub("&","\\&",$0);print $0}' test&;
#set -x + a='test&' ++ awk '{gsub("&","\\&",$0);print $0}' ++ echo 'test&' + echo 'test&;' test&;
(三个反斜杠,也是麻烦)