exprにハマる

仕事でシェルスクリプトを書いていて、exprの使い方でハマった。
yyyymmdd形式の引数をチェックするのに、

/usr/bin/expr $hoge : [12][0-9][0-9][0-9][01][0-9][0-3][0-9]

として戻り値が「8」かどうかをチェックしていたんだけど、それが環境によって「0」が返る。
調べてみたら、exprを実行するカレントディレクトリに、[12][0-9][0-9][0-9][01][0-9][0-3][0-9]の正規表現にマッチするディレクトリやファイルがあると、そのディレクトリ/ファイル名が正規表現と置き換えられてしまうことが原因だった。
例えば

% ls
200700123
%
% /usr/bin/expr 20070809 : [12][0-9][0-9][0-9][01][0-9][0-3][0-9]
0
%
%rm 200700101
%
% /usr/bin/expr 20070809 : [12][0-9][0-9][0-9][01][0-9][0-3][0-9]
8
%

となる。
なので、正規表現の箇所はダブルクォーテーションでくくって

/usr/bin/expr $hoge : "[12][0-9][0-9][0-9][01][0-9][0-3][0-9]"

とするのが正しい。
こんなこと基本かもしれないけど、知らなかったよ。