You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:13:10