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]"
とするのが正しい。
こんなこと基本かもしれないけど、知らなかったよ。