メタキャラクタとは?
メタキャラクタは特殊な意味を持つ記号のことです。メタキャラクタは文字検索(パターンマッチ)に使ったりします。メタキャラクタを使った文字列表現は正規表現と呼ばれ、簡潔で効率的なプログラムを書く上で重要な基礎知識といえます。Bash等を使用したシェルスクリプトにおいては正規表現の重要性はより高いものとなっています。
メタキャラクタにはどんなものがあるのか下に例を示しました。これらはキーボード上にあるよくある記号です。この記号にプログラムが解釈する特殊な意味が付加されています。
! ” # $ % & ’ ()- ^ | *?{}[] / \ .
例えば「これはペンですか?」という文章は人間が見れば疑問文だと思いますが、しかし、プログラムから見ると「?」は任意の一文字を表すメタキャラクタなので、「これはぺんですな」とか「これはペンですわ」「これはぺんです1」などのような意味と解釈されてしまいます。なのでプログラミングでも同様ですが、不必要に記号を記述しないようがよいでしょう。メタキャラクタとして扱われてしまう可能性があるからです。
メタキャラクタの使い方・使用例 ワイルドカード
「*」の意味
アスタリスク(スター)「*」は任意の文字0~1文字以上を表すメタキャラクタです。
このメタキャラクタは、例えばとある拡張子のファイルのみを検索するのに有用です。
*.mp3 → 「ahoge.mp3」「 k.mp3」「12.mp3」などを意味します。0文字でもいいので「.mp3」もヒットします。
「?」の意味
「?」は任意の一文字を表すメタキャラクタです。特定の部分だけ異なる文字列を指定するのに便利です。
埼玉県にある浦和という地区の名前が付いた駅はたくさんあります。
- 浦和駅
- 北浦和駅
- 南浦和駅
- 武蔵浦和駅
- 浦和美園駅
- 東浦和駅
- 西浦和駅
- 中浦和駅
これをメタキャラクタを使って指定してみましょう。
「?浦和駅」とするとヒットするのは
- 北浦和駅
- 南浦和駅
- 東浦和駅
- 西浦和駅
- 中浦和駅
です。?は任意の一文字ですからね。
ちなみに「*浦和駅」とすると上のものに加えて
- 武蔵浦和駅
- 浦和駅
がヒットします。*は0文字でもOKでさらに0,1,2~文字を意味するからです。
「[ ]」の意味
[]はカッコの中の任意の1文字を表すメタキャラクタです。また浦和駅で表現してみましょう
- 浦和駅
- 北浦和駅
- 南浦和駅
- 武蔵浦和駅
- 浦和美園駅
- 東浦和駅
- 西浦和駅
- 中浦和駅
[東西南北]浦和駅
とすると
- 北浦和駅
- 南浦和駅
- 東浦和駅
- 西浦和駅
がヒットします。任意の一文字を選んで文字列を作るからです。
範囲指定
[]のかっこの中では文字の範囲を指定できます。
[a-z]bcdとなっていた場合、半角小文字英語を1文字という意味になります。大文字はだめです。大文字は別に [A-Z]と指定するからです。数字[0-9]という指定も可能です。[a-zA-Z0-9]など組み合わせて指定することもできます
除外指定
[ ]内に!を入れると除外指定ができます。例えば[!abc]de とすると先頭がa, b, c以外の文字から始まる文字となります。
{ }の意味
{ }はカンマ区切りされた文字列を指定するメタキャラクタです。
{soft, base}ball→softball, baseballという意味です。
エスケープ「\」
「\」バックスラッシュはメタキャラクタの意味を剥奪する意味を持っているメタキャラクタです。
例えば「*」は0文字以上の任意の文字という意味を持つメタキャラクタです。
*浦和駅というのは浦和駅、南浦和駅、武蔵浦和駅でもマッチします。
ここで、バックスラッシュを*の前に付けると意味が変わります。
\*浦和駅と入力すれば *のメタキャラクタとしての意味をはく奪して、ただの文字として認識させます。
つまり「*浦和駅」という文字になります。
改行を無視するのにも使える「\」
バックスラッシュはメタキャラクタの意味をはく奪できるといいました。これは改行にも使えます。改行や空白は目には見えませんがコンピュータから見ると文字列が入力されています。シェルは一行ずつコマンドが実行されていきますが、シェルが一行と認識できるのも改行文字列を認識しているからです。そのため一行の終わりに「\」を入れると改行コードが無視され、次の行にわたってコマンドが入力できるようになります。
# cat /home/komeyan/text\
/hogehoge.txt
これは# cat /home/komeyan/text/hogehoge.txt
と入力しているのと同じです。
”と’ メタキャラクタの意味をはく奪
ダブルクォーテーションとシングルクオーテーションは同じような意味で使われますが範囲が異なります。どちらもクォーテーションで挟むことによって間の文字列のメタキャラクタの意味をはく奪します。シングルクオーテーションのほうが強力です。「” ”」ダブルクォーテーションで囲った場合は「$、’、\」の意味ははく奪できません。シングルクオーテーションは全てをはく奪できます。ダブルクォーテーションは$を使いたいときに使います。つまり$は変数を表す記号であり、変数を使いたいけど他のメタキャラクタの意味ははく奪したいときにダブルクォーテーションを使います。
メタキャラクタ 制御
「>」 出力リダイレクション
>は出力先を変更するのに利用される記号です。標準出力先を画面からファイルに変更したりできます。
date
→ 画面に日付が表示
date > file.txt
とするとfile.txtにdate書き込まれます。このように「>」は出力先を画面からファイルに変更するのに使われます
詳しくはこちらの記事を参照してください。
「<」入力リダイレクション
入力リダイレクションはキーボードからの入力ではなくコマンドやファイルから入力を行うのに使います。
ls /etc/passwd
というようにlsコマンドの引数(/etc/passwd)がキーボードで打ち込まれます。
次に /etc/passwdを書き込んだfile.txtの内容をlsコマンドに渡してみます。そのために入力リダイレクションを使います。
ls < file.txt と実行するとlsの引数にfile.txtの中身 /etc/passwdが入力されて、passwdファイルの情報が表示されます。
「<<」ヒアドキュメント
ヒアドキュメントは複数行にわたってコマンドなどを記述するのに使うものです。
cat << EOD
command 1
command2
EOD
というように入力します。EODの文字はなんでもよいですが同じ文字列を使って開始/終了を表現します。ヒアドキュメントの文字列は標準入力の扱いです。ヒアドキュメントの詳細についてはこちら
「|」パイプ
パイプは非常によく使われるメタキャラクタです。コマンドの出力結果をパイプを介した次のコマンドの入力に入れます。
よく「 ps aux | grep httpd」 というようにつかいます。ps auxの結果→grep httpdの入力に入れる。というような意味になります。
ps aux で出てきたプロセス一覧の中からhttpdという文字列を持つ行を抽出します。
&&と||
&&と||はコマンドとコマンドの間に挟んで使います。
command 1 && command 2はcommand1 が正常に実行された時のみcommand2が実行されます。
command 1 || command 2はcommand1 が実行されなかった時のみcommand2が実行されます。
& バックグラウンド実行
&はコマンドの後方に置くことによって「バックグラウンドで実行」という意味に変化します。通常はフォアグラウンドで実行され、コマンドが実行されている間は他の作業はできません(とはいえたいていのコマンドは瞬間的に終了しますが)。例えばOSのソースファイルをビルドする時などは時間がかかりますが、バックグラウンド実行すればその間に別の作業が実行できます(ブラウザであればタブ機能のようなものですね。今見ているタブがフォアグラウンド実行、裏で開いているタブがバックグラウンド実行です。)
( )子シェル内で実行
( )でコマンドを囲うとそのコマンドは現在開いているシェル(カレントシェル)ではなく新たに開いた子プロセスのシェル上で実行されます。わかりやすく言えば、現在/etc/ディレクトリにいるとします。# cd /home/komeyan; mkdir testと実行したら、当然 /home/komeyanに移動してしまうのですが、#(cd /home/komeyan; mkdir test)のようにコマンドをかっこでくくれば、コマンド終了後もディレクトリを移動せずに/etc/のディレクトリに居続けたままになります。カッコ内は別のシェルで実行していると考えてよいです。
{ }コマンドをまとめる
{}で囲った場合は()とは違って現在のシェル上で実行されます。
「;」コマンドの区切り・順次実行
セミコロンはコマンドとコマンドの間に入れることによって、2つのコマンドを一行で記述できます。通常コマンドはパイプなどでつなげていない限り一行に一つ記述します。
「command 1 ; command 2」と書くとcommand1 に続いてcommand2が実行させることができます。
「#」 コメント
#がある行はコメントとして扱われて実行されません。シェルスクリプト中に先頭に#を付けてコマンドの説明を加えたりするのに使います。
cat /etc/passwd
# catでユーザーを表示する
#の列は注意書きとして処理され、コマンドが含まれていたとしても実行されません。
「.」実行
「.」はsourceコマンドと同じようにスクリプトを実行するのに使うことができます。
# . /shellscript/script.sh
これでscript.shは実行されます。同じようにドットの代わりにsourceコマンドを使っても同様の結果が得られます。
「`」バッククオートはコマンドの実行
見た目が紛らわしいバッククオート「`」は’や”とは全く異なる意味を持ちます。バッククオートで囲われた文字列はコマンドとして処理されます。
例えば # echo ”このコンピュータのホストネームは'hostname'です。”
これを実行するとhostnameはコマンドとして実行され、このコンピュータのホストネームはkomeyan-PCです。とホストネームが表示されます。
メタキャラクタ ファイル・ディレクトリ
「.」カレントディレクトリ 隠しファイル・ディレクトリ
「.」はカレントディレクトリを意味するメタキャラクタです。
また、隠しファイルやディレクトリを表現するのにも使われます。
例えば /home/.ssh/ssh_configのように 「.ssh」は隠しディレクトリです。「.bashrc」は隠しファイルです。
「~」ホームディレクトリ
「~」はホームディレクトリを意味するメタキャラクタです。
cd ~
と入力するとホームディレクトリに移動できます。