Bash awk脚本转义随记

来自三线的随记

由于某种奇怪的需求写了个curl版本爬虫

然后踩了个有趣的坑,mark一下,希望以后自己有能力给自己解答


前提说明

& 是 awk 的求余符号

& 是html字符实体编码(对应就是&)


来个简单的玩法

#!/bin/bash
set -xv
a="test&"
echo  ` echo $a | awk '{gsub("&amp","&",$0);print $0}' `

其实预期效果个人感觉应该是抛出异常,然而

a="test&"
+ a='test&'
echo  ` echo $a | awk '{gsub("&amp","&",$0);print $0}' `
 echo $a | awk '{gsub("&amp","&",$0);print $0}' 
++ awk '{gsub("&amp","&",$0);print $0}'
++ echo 'test&'
+ echo 'test&'
test&


真难看,解开一下

#set +x
+ a='test&'
++ awk '{gsub("&amp","&",$0);print $0}'
++ echo 'test&'
+ echo 'test&'
test&


#set +v
a="test&"
echo  ` echo $a | awk '{gsub("&amp","&",$0);print $0}' `
 echo $a | awk '{gsub("&amp","&",$0);print $0}' 
test&

看起来没报错,但是结果不符合预期,估计gsub里面憨憨了(我猜)

对比

#!/bin/bash
set -v
a="test&"
echo  ` echo $a | awk '{gsub("&amp","1",$0);print $0}' `
root@Server:~# bash awk_bash.sh 
a="test&"
echo  ` echo $a | awk '{gsub("&amp","1",$0);print $0}' `
 echo $a | awk '{gsub("&amp","1",$0);print $0}' 
test1; 


转义

#!/bin/bash
set -v
a="test&"
echo  ` echo $a | awk '{gsub("&amp","\\\&",$0);print $0}' `


结果符合预期

a="test&"
echo  ` echo $a | awk '{gsub("&amp","\\\&",$0);print $0}' `
 echo $a | awk '{gsub("&amp","\\&",$0);print $0}' 
test&;
#set -x
+ a='test&'
++ awk '{gsub("&amp","\\&",$0);print $0}'
++ echo 'test&'
+ echo 'test&;'
test&;

(三个反斜杠,也是麻烦)