我们要检查机器上的主机名,规则应该是这样的:
每个主机名只能使用小写字母 每个主机名都是 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
(以及ksh
and 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/完全限定域名验证