次のスクリプトを使用しています。このスクリプトは、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
何か案が ?
Bash caseは正規表現を使用しませんが、 シェルパターンマッチング のみ。
したがって、正規表現_ws-[0-9]+\.Host\.com
_の代わりに、パターン_ws*.Host.com
_(またはws-+([0-9]).Host.com
を使用する必要がありますが、それは少し高度に見えます。
case
はグロブのみを使用できます。正規表現のマッチングを行いたい場合は、if-then-else-Elif-fi
とともに一連の[[
ステートメントを使用する必要があります。
*
がws*.Host.com
の数字と実際に一致し、case
、if
、Elif
の代わりに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
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
正規表現を独自の変数に保存することが最も信頼できると思います。
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
これはかなり古い質問であり、私の解決策は @ 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