Linux
如何檢查 FQDN 主機名是否只有小寫字母
我們想檢查機器上的主機名,規則應該是這樣的:
每個主機名只能是小寫字母 每個主機名都是 FQDN
我們試試這個
hostname=master01.nassa.com [[ $hostname =~ ^[a-z.a-z.a-z]+$ ]] && hostname is ok
但儘管主機名是有效的,它不是列印“主機名是好的”
什麼是正確的語法,我們錯在哪裡?
您的正則表達式在某種程度上是錯誤的,並且
&&
未命中之後的部分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:為什麼$$ A-Z $$匹配bash中的小寫字母?
解決
/bin/sh
方案:hostname=master01.nassa.com case $hostname in *[A-Z]*) echo 'Not ok' ;; *) echo 'Ok' esac
如果 的值
$hostname
包含任何大寫字元(這可能取決於您的語言環境設置),則採用“Not ok”分支,而如果未採用“Not ok”分支,則採用“Ok”分支。這類似於
bash
-specific (and alsoksh
andzsh
)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.]+$
. 不過,在這種情況下,測試不允許的較小字元集可能會更容易,這就是我在上面所做的。