Bash 子域正则表达式验证从不匹配

Bash 子域正则表达式验证从不匹配

我试图验证用户输入的子域是否有效,但无论我传入什么,它都永远无效。我知道正则表达式没问题,所以问题是我的“if”逻辑,但是我是 shell/bash 的新手

#!/bin/bash
#

echo Enter the subdomain\'s name to configure.
read SUBDOMAIN

if [[ ! $SUBDOMAIN =~ [A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])? ]]; then
    echo "$SUBDOMAIN is not a valid domain"
fi

例子:
会被接受(常规子域名): test
不会被接受(无效子域名): -
不会被接受(无效子域名):(空)
不会被接受(无效子域名):#$??&@ #&?$##$

我更喜欢使用 shell,但正则表达式中的括号会使脚本抛出错误。

我不确定是否可以用 grep 来完成,但我从来不明白如何使用 grep,它总是让我感到困惑。

答案1

如果您尝试匹配“字母数字”后跟“字母数字或破折号”,并确保末尾没有破折号,这样总共有 1..62 个字符,则此 RE 将适合您

^[[:alnum:]](([[:alnum:]]|-){0,61}[[:alnum:]])?$

这绑定到字符串的开头和结尾,因此 RE 必须与整个字符串匹配。

  • 行首^
  • 单个字母数字,任何大小写[[:alnum:]]
  • 可选块(用括号括起来(...)并以 结尾?
    • [[:alnum:]]或破折号-,重复 0..60 次
    • [[:alnum:]]
  • 行结束$

正如此答案下的评论中所建议的那样,我应该指出该[[:alnum:]]范围受当前区域设置的影响。如果您想确保它仅匹配“ASCII”AZ、az 和 0-9,您需要确保它以LANG=C.否则,您可能会发现接受其他字符,例如 á é ø ß 等。

相关内容