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&;
(三个反斜杠,也是麻烦)