Linux

如何檢查 FQDN 主機名是否只有小寫字母

  • November 25, 2018

我們想檢查機器上的主機名,規則應該是這樣的:

每個主機名只能是小寫字母 每個主機名都是 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 also 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.]+$. 不過,在這種情況下,測試不允許的較小字元集可能會更容易,這就是我在上面所做的。

引用自:https://unix.stackexchange.com/questions/484016