如何检查 FQDN 主机名是否仅包含小写字母

如何检查 FQDN 主机名是否仅包含小写字母

我们要检查机器上的主机名,规则应该是这样的:

每个主机名只能使用小写字母 每个主机名都是 FQDN

我们试试这个

hostname=master01.nassa.com
[[ $hostname  =~ ^[a-z.a-z.a-z]+$ ]] && hostname is ok

但尽管主机名有效,它不会打印“主机名正常”

什么是正确的语法,哪里错了?

答案1

&&您的正则表达式在某种程度上是错误的,并且错过了之后的部分echo。您可以考虑执行相反的操作,而不是编写复杂的正则表达式来验证主机名:

hostname=master01.naSsa.com
[[ $hostname  =~ [A-Z] ]] && echo "hostname is not ok"
hostname is not ok

或者

hostname=master01.nassa.com
[[ $hostname  =~ [A-Z] ]] || echo "hostname is ok"
hostname is ok

此外,为了避免复杂的情况,您最好使用LC_ALL=C
See 将语言环境定义为 C 或 posix :为什么[AZ]在bash中匹配小写字母?

答案2

对于/bin/sh解决方案:

hostname=master01.nassa.com

case $hostname in
    *[A-Z]*)
        echo 'Not ok' ;;
    *)
        echo 'Ok'
esac

如果 的值$hostname包含任何大写字符(这可能取决于您的区域设置),则采用“Not ok”分支,而如果不采用“Not ok”分支,则采用“Ok”分支。

这类似于 -specic bash(以及kshand zsh)

if [[ "$hostname" == *[A-Z]* ]]; then
    echo 'Not ok'
else
    echo 'Ok'
fi

使用正则表达式的测试^[a-z.a-z.a-z]+$与使用 的测试相同^[a-z.]+$(因为[...]字符类匹配单个字符并且a-z在其中重复不会产生差异)。这实际上会做你想做的事确实如此,即仅允许使用小写字母(和点)的主机名。问题是您的主机名也包含数字。为了也考虑到这些,您必须使用^[a-z0-9.]+$.但在这种情况下,测试较小的字符集可能会更容易不是允许,这就是我上面所做的。

答案3

hostname=master01.nassa.com
[[ "$hostname"  =~ ^[a-z]+\.[a-z]+\.[a-z]+$ ]] && echo hostname is ok

您的示例是否修复了一些错误,但为了更准确的验证,请查看https://stackoverflow.com/questions/11809631/完全限定域名验证

相关内容