使用Bash批量查询多域名可用性 排查脚本运行报错问题
报错核心原因
出现这个问题的本质是脚本把需要作为参数传递的正则字符串,直接当成独立执行命令写在了脚本执行流里。bash解析到第9行的那串正则字符串时,会尝试在系统PATH路径下查找和这串字符串完全同名的可执行程序,找不到自然会抛出“无法识别该命令”的报错,完全不是正则语法本身的问题。
典型错误书写场景参考:
# 错误示例:正则被裸写在执行流中 #!/bin/bash prefix_list=("apple" "banana" "cherry") for p in ${prefix_list[@]}; do domain="${p}.com" result=$(whois $domain) # 第9行就是直接把正则写在这里,没有挂在任何工具调用后面 "^No match|^NOT FOUND|^Not fo|AVAILABLE|^No Data Fou|has not been regi|No entri" done
正确实现步骤
- 把匹配规则的正则单独定义为脚本常量,统一维护。定义的时候不要让这行单独执行——直接把正则字符串赋值给变量,bash就不会把它当命令处理。
- 调用grep工具传入正则作为匹配参数,完成状态判断。匹配时需要开启grep的扩展正则模式(加
-E参数),不然正则里的|逻辑或语法会失效。 - 补充基础容错逻辑,避免脚本因环境问题直接崩溃:
- 前置检查系统是否安装whois命令
- 每次查询间隔加延迟,避免因为请求频率过高被域名注册局限流
完整可运行脚本
#!/bin/bash # 批量.com域名可用性查询脚本 DOMAIN_PREFIX=("test123" "demo456" "personal789") # 定义可注册状态匹配正则(赋值操作不会触发bash把字符串当命令) AVAIL_PATTERN='^No match|^NOT FOUND|^Not fo|AVAILABLE|^No Data Fou|has not been regi|No entri' # 前置环境校验 if ! command -v whois &>/dev/null; then echo "运行失败:系统未安装whois工具,请先安装后重试" exit 1 fi for prefix in "${DOMAIN_PREFIX[@]}"; do target_domain="${prefix}.com" echo "正在查询:${target_domain}" # 获取whois查询结果,合并错误输出避免异常内容被漏掉 query_output=$(whois "$target_domain" 2>&1) # 把定义好的正则作为grep的匹配参数传入做判断 if echo "$query_output" | grep -qE "$AVAIL_PATTERN"; then echo "结果:${target_domain} 当前可注册" else echo "结果:${target_domain} 已被注册" fi # 间隔1秒避免高频请求被限流 sleep 1 done
易踩坑提醒
- 所有正则类的字符串,必须要么作为变量赋值给某个值,要么作为grep/sed/awk等工具的入参,要么放在
[[ ]]条件判断的模式位置,绝对不能没有任何上下文直接单独占一行写在脚本里,一定会被bash识别成待执行命令。 - 不要漏掉grep的
-E参数,否则扩展正则里的|会被当成普通文本字符匹配,最终判断结果会完全失准。 - 脚本写完后需要加可执行权限才能运行:
chmod +x batch_domain_check.sh
内容的提问来源于stack exchange,提问作者Mhmd Admn
相关产品推荐
相关产品推荐

