シェルプログラミングTips

柔軟な変数指定を可能にする方法

OSのシェルスクリプトではユーザの設定ファイルの記述に従ってOSサービスのオンオフを指定できるようになっているものがある。典型的には次のような設定を特定のファイルに記述することで、対象となるサービスを有効にしたり無効にしたりできるといったものだ。

zfs_enable="YES"
ntpdate_enable="YES"

こうした変数の判定処理をシェルスクリプトで記述する場合、基本的には次のような比較コードを書くことになる。

if [ "_${zfs_enable}" = "_YES" ]
then
処理
fi

指定できるキーワードをYES以外にもyesやYes、Y、yなども許可しようとすれば、次のように記述することになる。

if [ "_${zfs_enable}" = "_YES" -o      "_${zfs_enable}" = "_Yes" -o      "_${zfs_enable}" = "_yes" -o      "_${zfs_enable}" = "_Y" -o      "_${zfs_enable}" = "_y" ]
then
処理
fi

この記述方法でも処理はできるが、通常こうしたケースではtest(1)コマンドは利用せずに([はtest(1)コマンドの別の記述形式)、case構文を利用することが多い。case構文にはパターンを指定できるため、より柔軟な指定ができるためだ。たとえば上記の処理をcase構文を使って書き換えると次のようになる。この記述で大文字小文字を問わずYESとYを判定するようになる。

case "${zfs_enable}" in
[Yy][Ee][Ss]|[Yy])
	処理
	;;
case

case構文で指定できるパターンは|で複数指定することができる。変数展開、コマンド置換、算術展開も使用でき、クォートも機能する。?が任意の1文字に対応し、*が任意の複数文字列に対応する。複数の文字から任意の1文字に一致させる場合には[]を使用する。[Yy]と書いたのであれば、Yまたはyに一致することになる。たとえば大文字小文字を問わず、YES、ON、TRUE、NO、OFF、FALSEなどを指定できるようにするには、次のようにcase構文を使用すればよい。

case "${zfs_enable}" in
[Yy][Ee][Ss]|[Oo][Nn]|[Tt][Rr][Uu][Ee])
	処理
	;;
[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee])
	処理
	;;
case

こうしたシェルスクリプトのように、[]を使ってある程度自由度を確保した変数指定ができるようにする方法は、OSのシェルスクリプトではよく使われている。覚えておくとなにかと便利な書き方のひとつだ。

なお、読みにくくなるので、変数展開やコマンド置換、算術展開が利用できるからといってむげに機能を使えばよいというものではない。シェルスクリプトはあまり複雑にせず、すっきりと読みやすい状態に保っておいた方がよい。

last modified: 2014-01-13 16:01:13