Cygwin Bash脚本中带OR条件的egrep无法正确匹配指定开头行
Cygwin Bash脚本中带OR条件的egrep无法正确匹配指定开头行
嘿,我来帮你搞定这个问题!你遇到的情况确实挺让人困惑的——命令行里单独跑egrep能正常匹配到Domain Name和Name Server开头的行,放到脚本里就只出Name Server的结果,对吧?
其实问题就出在正则表达式的引号写法上!你现在脚本里写的egrep -e ^'Name Server|^Domain Name',把第一个^放在了单引号外面,Cygwin的bash在解析脚本时,会把这个写法的参数给拆乱,导致传给egrep的正则表达式并不是你预期的那样。
咱们来修正一下:把整个正则表达式用单引号完整括起来,把两个^都放在单引号里面,这样bash就不会破坏正则的结构了。修正后的命令应该是这样的:
egrep -e '^Name Server|^Domain Name'
或者你也可以用更简洁的分组写法,效果完全一致:
egrep -e '^(Name Server|Domain Name)'
把你的脚本里的每一行egrep命令都改成这样,再跑一遍试试!比如修正后的完整脚本:
#!/bin/bash whois customerdomain.com | egrep -e '^Name Server|^Domain Name' whois contoso.com | egrep -e '^Name Server|^Domain Name' whois google.com | egrep -e '^Name Server|^Domain Name' whois microsoft.com | egrep -e '^Name Server|^Domain Name'
为什么原来的写法在命令行里能用?其实那只是碰巧生效了——命令行的即时解析环境和脚本的批量解析环境有细微差异,这种不规范的引号写法在命令行里没出问题,但到了脚本里就暴露了漏洞。把整个正则用单引号完整包裹,才是稳妥的写法,能保证egrep拿到的是你真正想要的匹配规则:精准匹配以Name Server开头,或者以Domain Name开头的行。
你还可以自己做个小测试:在脚本里加一行echo ^'Name Server|^Domain Name',看看bash把这个参数解析成什么内容,就能直观明白原来的写法哪里出问题啦。
备注:内容来源于stack exchange,提问作者Ashmatash
相关产品推荐
相关产品推荐

