ユーザーは次のように私のBashスクリプトにmacアドレスを書き込むことができます:
read -p "enter mac-address " mac-address
これで、このMacアドレスが「特定の」形式と一致することを確認するためにifステートメントを確認したいと思います。つまり、FF:FF:FF:FF:FF:FF
ではないことでなければなりませんFFFFFFFFFFFF
。長さも6x2で正確でなければなりません。
答え1
最も怠惰な方法は走ることです
if [[ $mac_address == ??:??:??:??:??:?? ]]; then echo Heureka; fi
ただし、これは16進文字列であることを確認しません。だから重要なことなら
if [[ $mac_address =~ ^[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]$ ]]; then echo Heureka; fi
より良いかもしれません。後者は次のように短縮できます。
if [[ $mac_address =~ ^([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}$ ]]; then
echo Heureka;
fi
パターンが一致すれば、長さが合っていることを確認する必要もないと思います。
答え2
[[ $mac_address: =~ ^([[:xdigit:]]{2}:){6}$ ]]
答え3
有効な文字で構成されるように変数名を変更し、=~
テスト演算子を使用して値を拡張正規表現一致と比較しました。^
文字列の先頭に「2つの16進数とコロン」を5回、次に2回の文字列を終了する16進数$
:
#!/bin/bash
read -p "enter mac-address " mac_address
if [[ $mac_address =~ ^([[:xdigit:]][[:xdigit:]]:){5}[[:xdigit:]][[:xdigit:]]$ ]]
then
echo good
else
echo bad
fi
答え4
標準sh
構文の使用(したがって、bash
他のPOSIX準拠シェルで使用できます):
x='[[:xdigit:]]'
mac_pattern="$x$x:$x$x:$x$x:$x$x:$x$x:$x$x"
printf >&2 'Please enter a MAC address: '; read mac
case $mac in
($mac_pattern) echo OK;;
(*) echo >&2 BAD;;
esac