マシンのホスト名を確認したいと思います。ルールは次のとおりです。
各ホスト名には小文字のみを使用できます。各ホスト名はFQDNでなければなりません。
これを試してみましょう
hostname=master01.nassa.com
[[ $hostname =~ ^[a-z.a-z.a-z]+$ ]] && hostname is ok
ただし、ホスト名が有効であっても「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
また、複雑さを避けるために、ロケールをCまたはposixとして定義することをお勧めします。[AZ]がbashの小文字と一致するのはなぜですか?
答え2
/bin/sh
ソリューションの場合:
hostname=master01.nassa.com
case $hostname in
*[A-Z]*)
echo 'Not ok' ;;
*)
echo 'Ok'
esac
値に$hostname
大文字が含まれている場合(ロケールによって異なる場合があります)、「いいえ」分岐が選択され、そうでない場合は「OK」分岐が選択されます。
これは-specic(および)bash
に似ています。ksh
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/完全修飾ドメイン名の解決