web-dev-qa-db-ja.com

Bash caseステートメントの正規表現

次のスクリプトを使用しています。このスクリプトは、caseステートメントを使用してサーバーを検索します。

    #!/bin/bash
SERVER=$1;
echo $SERVER | egrep "ws-[0-9]+\.Host\.com";
case $SERVER in
ws-[0-9]+\.Host\.com) echo "Web Server"
;;
db-[0-9]+\.Host\.com) echo "DB server"
;;
bk-[0-9]+\.Host\.com) echo "Backup server"
;;
*)echo "Unknown server"
;;
esac

しかし、それは機能していません。 Regexはegrepで動作しますが、caseでは動作しません。サンプルO/P

./test-back.sh ws-23.Host.com
ws-23.Host.com
Unknown server

何か案が ?

36
Unni

Bash caseは正規表現を使用しませんが、 シェルパターンマッチング のみ。

したがって、正規表現_ws-[0-9]+\.Host\.com_の代わりに、パターン_ws*.Host.com_(またはws-+([0-9]).Host.comを使用する必要がありますが、それは少し高度に見えます。

44
che

caseはグロブのみを使用できます。正規表現のマッチングを行いたい場合は、if-then-else-Elif-fiとともに一連の[[ステートメントを使用する必要があります。

*ws*.Host.comの数字と実際に一致し、caseifElifの代わりにElifを使用することをアサートする場合次のようなものを使用できます。

case $SERVER in
  ws-[0123456789][0123456789][0123456789].Host.com) echo "Web Server" ;;
  db-[0123456789][0123456789][0123456789].Host.com) echo "DB server" ;;
  bk-[0123456789][0123456789][0123456789].Host.com) echo "Backup server" ;;
  *) echo "Unknown server" ;;
esac

ただし、999台を超えるサーバーでは機能しません。

このユースケース用のスクリプトを作成する必要がある場合、おそらくそのようなものを記述します(正規表現とケース構文が大好きなので;))。

srv=`expr "$SERVER" : '^\(db\|bk\|ws\)-[0-9]\+\.Host\.com$'`
echo -n "$SERVER : "
case $srv in
  ws) echo "Web Server" ;;
  db) echo "DB server" ;;
  bk) echo "Backup server" ;;
  *) echo "Unknown server !!!"
esac
9
syjust

Elif 構造の使用方法の例を次に示します。

#!/bin/bash
SERVER=$1;
regex_ws="^ws-[0-9]+\.Host\.com$"
regex_db="^db-[0-9]+\.Host\.com$"
regex_bk="^bk-[0-9]+\.Host\.com$"
if [[ "${SERVER}" =~ $regex_ws ]]; then
  echo "Web Server"
Elif [[ "${SERVER}" =~ $regex_db ]]; then
  echo "DB server"
Elif [[ "${SERVER}" =~ $regex_bk ]]; then
  echo "Backup server"
else
  echo "Unknown server"
fi

正規表現を独自の変数に保存することが最も信頼できると思います。

5
mlowry

exprを使用してマッチングを行うこともできます。このアプリケーションに十分な堅牢性を備えたgrepのような正規表現構文を提供します。

#!/bin/bash

server=$1
if   expr "$server" : 'ws-[0-9]\+\.Host\.com' >/dev/null; then echo "Web server"
Elif expr "$server" : 'db-[0-9]\+\.Host\.com' >/dev/null; then echo "DB server"
Elif expr "$server" : 'bk-[0-9]\+\.Host\.com' >/dev/null; then echo "Backup server"
else echo "Unknown server"
fi
4
tkocmathla

これはかなり古い質問であり、私の解決策は @ syjust がすでに提供しているものとそれほど変わらないことは知っていますが、case/esacステートメント。

$ cat case.sh && echo -e "#################\n" && bash case.sh ws-23.Host.com
#!/bin/bash
SERVER=$1;
echo $SERVER | egrep "ws-[0-9]+\.Host\.com";
case $SERVER in
  $(awk '{a=0}/ws-[0-9]*.Host.com/{a=1}a' <<<${SERVER}))echo "Web Server";;
  $(awk '{a=0}/db-[0-9]*.Host.com/{a=1}a' <<<${SERVER}))echo "DB Server";;
  $(awk '{a=0}/bk-[0-9]*.Host.com/{a=1}a' <<<${SERVER}))echo "Backup Server";;
  *)echo "Unknown server";;
esac

#################

ws-23.Host.com
Web Server

1
AnthonyK