入力文字列が特定の形式に準拠しているかどうかを確認するには?

入力文字列が特定の形式に準拠しているかどうかを確認するには?

ユーザーは次のように私の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

関連情報