Infra Engineer

Linuxのメタキャラクタ~メタキャラクタについて~
2021.01.03
Lv1

Linuxのメタキャラクタ~メタキャラクタについて~

今回の内容

今回は、メタキャラクタについて解説します。

試験ポイント

★LPIC試験ポイント①★

コマンドラインで使用されるメタキャラクタの「*」「‘」「”」「/」が重要! 
★LPIC試験ポイント①★

★LPIC試験ポイント②★

ファイルを検索するときに役立つシェルのメタキャラクタの「[]」が重要! 
★LPIC試験ポイント②★

メタキャラクタとは

シェルで特別な意味を持つ記号のことを、「メタキャラクタ」といいます。 「メタキャラクタ」は、適切に活用することにより、コマンドライン上での表現に幅を持たせることが可能となります。

ディレクトリを表すメタキャラクタ

以下は、ディレクトリを表すメタキャラクタの一覧となります。
例)一般ユーザ「test」でログインしており、 カレントディレクトリが/home/test/lpic の場合

メタキャラクタ 説明
~ = ホームディレクトリ /home/test
. = カレントディレクトリ /home/test/lpic
.. = 1つ上のディレクトリ /home/test

——————–

例1)~
一般ユーザ「test」でログインしており、 カレントディレクトリが/home/testの場合
[test@localhost lpic]$ echo ~
/home/test
↑testユーザのホームディレクトリディレクトリ(~)をechoで表示

[test@localhost lpic]$
[test@localhost lpic]$ cd ~
                         ↑cdコマンドを使ってtestユーザのホームディレクトリに移動
[test@localhost ~]$

——————–

例2).
現在のカレントディレクトリ(.)直下のファイルやディレクトリを表示
[test@localhost ~]$ ls .
Desktop    Downloads  Music     Public      Templates  Videos
Documents  lpic       Pictures  readme.txt  test

——————–

例3)..
cdコマンドを使って現在のディレクトリ(/home/test/lpic)の一つ上の階層に(.)のメタキャラクタを使って移動
[test@localhost ~]$ cd ..
[test@localhost home]$
[test@localhost home]$ ls .
test
[test@localhost home]$

——————–

コマンドラインで使用されるメタキャラクタ

以下は、コマンドラインで使用されるメタキャラクタの一覧となります。

メタキャラクタ 説明
* ワイルドカード(任意の数の文字)。
? ワイルドカード(1文字の任意の文字)。
コマンド1;コマンド2 コマンドの連結。
コマンド1&&コマンド2 コマンド1が成功した場合(正常な戻り値を得たとき)のみ、コ
マンド2を実行。
コマンド1||コマンド2 コマンド1が失敗した場合(正常な戻り値以外を得たとき)の
み、コマンド2を実行。
$(コマンド) `コマンド` コマンドの置き換え
? ワイルドカード(1文字の任意の文字)。
‘(「単一引用符」
(シングルクォーテーション))
囲まれた部分が文字列であることを表す(一切のメ
タキャラクタを無視)。
“(二重引用符
(ダブルクォーテーション))
引用符内にコマンドがあれば、そのコマンドを実行し
た結果が展開される。
変数の場合は、変数に格納されているコマンドを実
行した結果が展開される。

(バックスラッシュ)
次の1文字をエスケープする(メタキャラクタとしての
特殊な意味を無視)。

——————–

例1) *
ワイルドカード(任意の数の文字)
[test@localhost ~]$ touch file1 file22 file333
★touch:空のファイルを作成するコマンド
[test@localhost ~]$
[test@localhost ~]$ ls file*
file1  file22  file333
★file~を出力

——————–

例2) ?
ワイルドカード(1文字の任意の文字)
[test@localhost ~]$ ls file?
file1
[test@localhost ~]$ ls file???
file333

——————–

例3)コマンド1;コマンド2
コマンドの連結
[test@localhost ~]$ pwd ; ls
/root
anaconda-ks.cfg  Documents  file1    file333               Music     Public     Videos
Desktop          Downloads  file222  initial-setup-ks.cfg  Pictures  Templates
[test@localhost ~]$

——————–

例4)コマンド1&&コマンド2
コマンド1が成功した場合(正常な戻り値を得たとき)のみ、コマンド2を実行
[test@localhost ~]$ pwd && echo true
/home/test ★一つ目のコマンドが成功している
true
⇒使用例)バックアップが成功したら、圧縮するよとか。。
試験では、あまり出ないが、実務でよく使う


——————–

例5)コマンド1||コマンド2
コマンド1が失敗した場合(正常な戻り値以外を得たとき)のみ、コマンド2を実行
[test@localhost ~]$ cd xxx && echo true
-bash: cd: xxx: そのようなファイルやディレクトリはありません
[test@localhost ~]$

[test@localhost ~]$ cd xxx || echo true
-bash: cd: xxx: そのようなファイルやディレクトリはありません
true ★cd xxxが失敗したので、echo trueが出力された

——————–

例6)$(コマンド) `コマンド`
コマンドの置き換え
[test@localhost ~]$ var1=$(pwd)

[test@localhost ~]$ echo $var1
/home/test

[test@localhost ~]$ var2=`pwd`
[test@localhost ~]$ echo var2
var2 ★「$」をつけないとpwdの実行結果はでない
[test@localhost ~]$ echo $var2
/home/test

——————–

例7)‘(「単一引用符」(シングルクォーテーション))
囲まれた部分が文字列であることを表す(一切のメタキャラクタを無視)
[test@localhost ~]$ echo $var1
/home/test
[test@localhost ~]$

【’】
[test@localhost ~]$ echo '$var1'
$var1
★ただの文字列として出力
[test@localhost ~]$

★試験ポイント①★

試験では、以下の”(シングルクォーテーション)で括った場合の出力結果が求められます

——————–

例8)“(二重引用符(ダブルクォーテーション))

引用符内にコマンドがあれば、そのコマンドを実行した結果が展開される。
変数の場合は、変数に格納されているコマンドを実行した結果が展開される

【”】
[test@localhost ~]$ echo "$var1"
/home/test
★メタキャラクタとして認識


——————–

例9)∖(バックスラッシュ)
次の1文字をエスケープする(メタキャラクタとしての特殊な意味を無視)
【バックスラッシュ】
[test@localhost ~]$ echo $var1
/home/test
[test@localhost ~]$ echo \$var1
$var1
[test@localhost ~]$

[test@localhost ~]$ echo \"$var1\"
"/home/test"
[test@localhost ~]$
[test@localhost ~]$ echo \"\$var1\"
"$var1"
[test@localhost ~]$


——————–

コマンドおよび引用符 使用例 結果
* $ ls file* file1 file22 file333
? $ ls file?? file22
コマンド1;コマンド2 $ pwd ; ls /home/test
true
コマンド1||コマンド2 $ cd directory1 || echo false bash: cd: directory1: No such
file or directory false
$(コマンド) `コマンド` $var1=$(pwd)
$ echo $var1
—————-
$var2=`pwd`
$ echo $var2
/home/test
$ echo ‘$var1’ $var1
$ echo “$var1” /home/test
∖(バックスラッシュ) $ echo ∖$var1 $var1

※「∖(バックスラッシュ)」は、フォントやOSにより、「¥」と表示されることもあります。

ファイルを検索するときに役立つシェルのメタキャラクタ

ファイルを検索するときに役立つのがシェルのメタキャラクタです。 メタキャラクタを使うとパターンに一致する複数ファイルを一括して扱うことができます。 以下が主なメタキャラクタとなります。

メタキャラクタ 説明
* 0文字以上の文字または文字列にマッチする。
【例】「a*」であれば「a」「ab」「abc」「aaaa」のいずれもマッチする。0文字もマッチする
ことに注意。
? 任意の1文字にマッチする。
【例】「a?」であれば「aa」「ab」「a1」などはマッチし、「a」「abc」などにはマッチしない。
[] []内に列挙されている文字のいずれか1文字にマッチする。
連続した文字列には「-」が使用できる。
[a-z]は英小文字すべて、[0-9]は数字すべて、指定範囲の先頭に「!」を使うとマッチし
ない範囲を指定できる。
【例】「a[bcd]」は「ab」「ac」「ad」のいずれかにマッチする。
「a[!bcd]」は「aa」「a1」はマッチするが、「ab」「ac」「ad」にはマッチしない。
{} {}内の文字を使って文字列を生成する。
【例】「test{1,2}」はtest1、test2を生成する。

また、メタキャラクタに使用されている文字をメタキャラクタではなく文字列として使いたい 場合には「¥」(バックスラッシュ)を使用します。

——————–

例1)*
0文字以上の文字または文字列にマッチする

【例】「a*」であれば「a」「ab」「abc」「aaaa」のいずれもマッチする。
0文字もマッチすることに注意。

[test@localhost ~]$ find ./ -name "file"
                                ↑名前で検索
どういう条件か:ルートディレクトリ以下のfileをいう名前の
ファイルやディレクトリを検索
現在「file」というファイルがない事がわかる
  
[test@localhost ~]$ find ./ -name "file*"
./file1
./file22
./file333
[test@localhost ~]$

——————–

例2)?
任意の1文字にマッチする。

【例】「a?」であれば「aa」「ab」「a1」などはマッチし、「a」「abc」などにはマッチしない。

[test@localhost ~]$ find ./ -name "file??"
./file22
[test@localhost ~]$

——————–

例3)[]
[]内に列挙されている文字のいずれか1文字にマッチする。

【例】「a[bcd]」は「ab」「ac」「ad」のいずれかにマッチする。
「a[!bcd]」は「aa」「a1」はマッチするが、「ab」「ac」「ad」にはマッチしない。

[test@localhost ~]$ find ./ -name "file[12]*"

./file1
./file22
[test@localhost ~]$
[test@localhost ~]$ find ./ -name "file[0-9]"
./file1
[test@localhost ~]$
[test@localhost ~]$ find ./ -name "file[0-9][1234][1234]"
./file333
[test@localhost ~]$

★試験ポイント②★

試験では、[]内に列挙されている文字のいずれか1文字にマッチする場合の出力結果が求められます

——————–

例4){}
{}内の文字を使って文字列を生成する。

【例】「test{1,2}」はtest1、test2を生成する。

[test@localhost ~]$ touch Lpic{1,2,3,4}
[test@localhost ~]$ ls
Lpic1 Lpic2 Lpic3 Lpic4  file1  file22  file333
[test@localhost ~]$

まとめ

メタキャラクタはよく試験にも出題されますし、実務においても使いこなすことによりLINUXを扱う速度がグンと上がります!しっかりと覚えておきましょう!

それでは今回はこのあたりで。

確認問題

問題1

1つ上のディレクトリに移動する際のメタキャラクタとして、正しい選択肢を1つ選びなさい。

A) cd ~
B) cd ..
C) cd ##
D) cd …

解答・解説
答え:B

A) ⇒ 「~」は、ホームディレクトリを表すメタキャラクタなので、誤りです。
B) ⇒ 1つ上のディレクトリに移動する際のメタキャラクタとしてい「..」を使用します。
C) ⇒ このようなメタキャラクタはありません。
D) ⇒ 「.」が一つ多いため誤りです。

問題2

ワイルドカード(任意の数の文字)を表すメタキャラクタとして、正しい選択肢を1つ選びなさい。

A) ?
B) .
C) {}
D) *

解答・解説
答え:D

A) ⇒ ワイルドカード(1文字の任意の文字)を表すメタキャラクタなので誤りです。
B) ⇒ 「.」は、カレントディレクトリを表すメタキャラクタなので、誤りです。
C) ⇒ 「{}」は、{}内の文字を使って文字列を生成するメタキャラクタなので誤りです。
D) ⇒ 末尾から指定されたバイト数だけ指定するオプションなので誤りです。

問題3

次の1文字をエスケープする(メタキャラクタとしての特殊な意味を無視)を表すメタキャラクタとして、
正しい選択肢を1つ選びなさい。

A) ‘
B) &&
C) ;
D) ∖

解答・解説
答え:D

A) ⇒ [‘]は、囲まれた囲まれた部分が文字列であることを表す(一切のメタキャラクタを無視)を表すメタキャラクタなので誤りです。
B) ⇒ 「&&」は、コマンド1が成功した場合(正常な戻り値を得たとき)のみ、コマンド2を実行するメタキャラクタなので、誤りです。
C) ⇒ 「;」は、コマンドの連結するメタキャラクタなので誤りです。
D) ⇒ 「∖」は、次の1文字をエスケープする(メタキャラクタとしての特殊な意味を無視)メタキャラクタです。

Linux資格 「LPIC Lv1」徹底解説 連載目次リンク

Linux資格 「LPIC Lv1」徹底解説 連載目次

連載執筆講師が講座開講中!ITスクール SAK

ITスクールSAK | LPIC Lv1合格保証コース 講座紹介ページ