![Bash 子域正则表达式验证从不匹配](https://linux22.com/image/132433/Bash%20%E5%AD%90%E5%9F%9F%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E9%AA%8C%E8%AF%81%E4%BB%8E%E4%B8%8D%E5%8C%B9%E9%85%8D.png)
我试图验证用户输入的子域是否有效,但无论我传入什么,它都永远无效。我知道正则表达式没问题,所以问题是我的“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
.否则,您可能会发现接受其他字符,例如 á é ø ß 等。