シェルスクリプトで見かけるおまじない

メソ
2024-06-24
2024-06-24

最近はシェルスクリプトに触れる機会が増えてきました。
今までほとんど触れたことがなかったので、今回シェルスクリプトでよく見る書き方についてまとめてみようと思います。

#!/bin/bash

1行目によくある記述です。shebang(シェバン/シバン)と呼ばれ、シェルの一つであるbashで動かしますよと指定しています。
今回の場合はbashですが、インタプリタの種類によってこのパスは変わります。
例えば、perlを動かしたいとなった際は「#!/usr/bin/perl」と記述されることもあります。

grep -v "^$"

grepはおなじみのパターンマッチを行うコマンドですね。「-v "hoge"」のオプションで"hoge"を除外したものをマッチングします。
「^」は行頭、「$」は行末を示します。"^$"は文字列を含まない行頭と行末を示します。ですので、grep -v "^$"で行に含まれる空白以外、つまり文字列のみを指定することとなります。
行ごとに文字が書かれたファイルを読み込む際、ループ処理に記述しておくと文字列のみを取り出すことができます。

[[:space:]]

POSIX文字クラスと呼ばれるもので、クラスと呼ばれる特定の語を[:クラス:]のように記述します。

クラスにはいくつか種類がありますが、[:space:]は空白を示します。この文字クラスを[]で囲み、[[:space:]]とすることで空白文字とのマッチを行います。

 A > /dev/null 2>&1

Aはなにがしかのコマンドやプログラムを指します。
A > Bの記法は、Aの標準出力としてBを利用することを指します。ですので、「A > /dev/null」はAの標準出力先として/dev/nullを使います。出力先である「/dev/null」は、書き込まれても破棄される領域になります。
Aのコマンドやプログラムを実行しても、なにも表示されないという事になります。

次に「2>&1」についてですが、まずコマンドやプログラムを実行した際に表示される結果は、標準出力と標準エラー出力に分けられます。「1」は標準出力、「2」は標準エラー出力となります。
「2>&1」で標準エラー出力を標準出力と共に表示することになります。

結果として「A > /dev/null 2>&1」では、Aを実行すると標準出力及び標準エラー出力は破棄されるため、実行結果は何も表示されないという事になります。

おわりに

シェルスクリプトの記法にはUNIXやLinuxの仕組みが反映されている部分もあり、記述方法を知ることもそうですが、これをきっかけに仕組みについても理解を深めていきたいと思いました。