シェル・プログラミング:1. メタ文字とその処理

 UNIX入門「4. 正規表現」において,コマンド echo * が,現在作業中のディレクトリのファイル一覧を表示することをみました。

% cd ~/My_Programs
% echo *
hello.c hello.out hello.pl hello.sh sample.sh
%

これに対し,次はどうなるでしょうか?

% echo Hello!

結果は...

% echo Hello!
Hello!
%

何故なのでしょうか?UNIX入門「4. 正規表現」では,正規表現を表わす *, [ ], ? があり,今回の場合はありません。実は,シェルは,そのような特殊文字を最初に解釈するという特性を持ちます。そのような特殊文字を見つけると,それらの意味を解釈し,処理するのです。例えば, * を見つけると,カレント・ディレクトリを読み込み,文字検索を開始する訳です。実際,次を実行してみましょう。

% echo *Hello!
echo: No match
%

あくまでも,文字列検索をしていますね。標準入力の "*Hello!" すら,返しません。

 このような特性,すなわち,先ず処理上特別な意味をもつ文字を解釈するという特性は,入出力におけるパイプ "|" やリダイレクト "<" や ">" にも適用されます。このような処理上特別な意味をもつ文字を「メタ文字」といいます。この特性を理解した上で,UNIX の操作,およびプログラミングをすることになります。

■メタ文字 (Meta Characters)
 処理上,特別の意味をもつ文字。シェルでのメタ文字の例。

     /  \  "  `  '  *  |  !  ?  ~  $  <  >  &  [  ]  #

     注) [ と ] はペアのとき,シェルはそれらを特別な意味に解釈する。
         ] と [ ならば,文字検索とは解釈しない。