
この記事はそんな疑問に答えるために書きました。
macOSやLinuxなどのターミナルで、同じ操作を何度も繰り返したいとき、大量のデータを処理したいとき、シェルスクリプトを作れば操作を減らして楽をすることができます。
今回は、そんな便利なシェルスクリプトについて紹介します。
シェル=殻?

そもそも、シェルとは何でしょうか?
私たちのコンピュータは、オペレーティングシステムと呼ばれるソフトウェアによって管理されています。このオペレーティングシステムの内部には、ハードウェアとソフトウェアの仲立ちをしている「カーネル」(「核」という意味)という部分があります。
カーネルはCPU、メモリー、ハードディスクなどさまざまなハードウェアに対して命令を出します。ただ、カーネルが出す命令は普通の人には難しくて理解できません。
そこで、私たちのような普通の人でもカーネルが出す命令を扱えるように、分かりやすいコマンドがたくさん作られました。このコマンドをたくさん集めたものをシェルと呼んでいます。カーネル(核)を包むシェル(殻)、というわけです。
代表的なシェル

オペレーティングシステムがWindows、macOS、Linuxなどいろいろあるように、シェルにもいくつかの種類があります。代表的なシェルをご紹介します。
- 【sh】
最近のオペレーティングシステムに含まれているシェルの中では一番古いものです。AT&Tのベル研究所で開発されました。開発者の1人Steven Bourneさんの名前にちなんで、Bourneシェル、Bシェルとも呼ばれています。ほとんどのUnix系オペレーティングシステムに含まれている標準的なシェルです。また他のほとんどのシェルはこのBシェルの機能を踏襲して作られています。 - 【csh】
カリフォルニア大学バークレー校のBill Joyさんによって開発されたもので、シェルスクリプトがプログラミング言語のC言語に似たスタイルで書けることから、この名前が付けられました。Bシェルをベースに作られたものですが、Bシェルと比べると、対話型で利用できるコマンドが多く含まれていて、より使いやすく、また少ないキー入力で使えるように改良されています。 - 【tcsh】
cshを改良したものです。ファイル名やコマンド名などを保管してくれる機能や、コマンドを複数行にわたって編集する機能など、さらに便利な機能が追加されています。現在も開発が継続されていて、およそ1年に1度の頻度で新しいバージョンが出ています。最近はmacOSやRed Hat Linuxなど多くのオペレーティングシステムでcshを実行すると実際にはtcshが呼び出されるようになっています。 - 【bash】
MITのBirian Foxさんによって開発されたもので、Bシェルを置き換えることを目的として作られ、Bourne-again shellの頭文字をとってBashと名付けられました。Cシェルと同様にBシェルをベースに作られていて、Bシェルのスタイルを踏襲しつつ、新しいコマンドやより複雑なシェルスクリプト構文などが追加されています。最近はmacOSや多くのLinuxディストリビューションで標準のシェルとして採用されています。
またここで、シェルコマンドの例をいくつかご紹介します。
- 【ls】 フォルダの内容を表示します
- 【pwd】現在いるフォルダを確認します
- 【cd】現在いるフォルダを変更します
- 【mv】ファイルやフォルダを移動します
- 【cp】ファイルやフォルダをコピーします
- 【rm】ファイルやフォルダを削除します
- 【mkdir】フォルダを作成します
- 【rmdir】フォルダを削除します
- 【cat】ファイルの内容を表示します
- 【diff】2つのファイルの内容を比較します
- 【date】現在の日付と時刻を表示します
- 【man】コマンドの使い方を表示します
スクリプト=台本?

“Script” という英単語を辞書で調べると、「台本」「脚本」「せりふ」などの意味が載っています。コンピュータ用語の「スクリプト」は、さまざまな命令を順番に並べて書いたファイルのことです。
スクリプトを実行すると、書かれた命令が順番に実行されます。お芝居や演劇などの台本に書かれたせりふが順番に読まれるのと同じですね。
そして「シェルスクリプト」とは、シェルのコマンドを並べて書いたファイルのことです。
シェルスクリプトはプログラミング言語のひとつ

プログラミング言語は、さまざまな命令を順番に並べて書くことによって、コンピュータの動作を作ることができるものです。つまり、シェルスクリプトもプログラミング言語のひとつと言えます。
C、Java、Python、PHPといったメジャーなプログラミング言語は、文法や各種命令をたくさん覚えなければ動かすことができません。一方、シェルスクリプトはとても簡単で、シェルのコマンドを上から順番に並べて書くだけで動きます。
ちなみに、プログラミング言語は書いたものをいったん変換(コンパイル)する必要があるものと、書いたものがそのまま実行されるものの2種類に分けられますが、後者を「インタプリタ型言語」または「スクリプト言語」と呼びます。Python、PHP、Ruby、Perlなどの言語が代表的です。これらの言語で書かれたものを「Pythonスクリプト」「PHPスクリプト」「Rubyスクリプト」などと呼びます。
書き方の例

ここで、簡単なシェルスクリプトの例をご紹介します。
1 2 3 4 |
#!/bin/sh pwd date ls -l |
1行目は、どのシェルを使用するか指定するものです。ここではBシェルを指定しています。
2行目から4行目まではシェルコマンドを並べたものです。現在のフォルダ名を表示して、現在の日時を表示して、フォルダの内容をリスト表示する、という3つのコマンドです。
シェルスクリプトを使わない場合はこの3つのコマンドを順番に実行する必要がありますが、このシェルスクリプトを実行するだけで3つのコマンドを順番に全部実行してくれます。
例えばこのシェルスクリプトを “pwd_date_ls.sh” というファイル名で保存しておけば、次のように実行できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ ./pwd_date_ls.sh / 2019年 8月25日 日曜日 08時15分40秒 JST total 52 drwxrwxr-x+ 138 root admin 4692 8 25 06:56 Applications drwxr-xr-x+ 64 root wheel 2176 11 8 2017 Library drwxr-xr-x@ 2 root wheel 68 9 29 2016 Network drwxr-xr-x@ 4 root wheel 136 6 2 00:51 System drwxr-xr-x 6 root admin 204 3 4 2017 Users drwxr-xr-x@ 6 root wheel 204 8 25 06:56 Volumes drwxr-xr-x@ 38 root wheel 1292 6 2 00:51 bin drwxrwxr-t@ 2 root admin 68 9 29 2016 cores dr-xr-xr-x 3 root wheel 7948 8 2 15:30 dev lrwxr-xr-x@ 1 root wheel 11 3 4 2017 etc -> private/etc dr-xr-xr-x 2 root wheel 1 8 2 15:34 home -rw-r--r--@ 1 root wheel 313 9 24 2016 installer.failurerequests dr-xr-xr-x 2 root wheel 1 8 2 15:34 net drwxr-xr-x@ 6 root wheel 204 3 4 2017 private drwxr-xr-x@ 63 root wheel 2142 6 2 00:51 sbin lrwxr-xr-x@ 1 root wheel 11 3 4 2017 tmp -> private/tmp drwxr-xr-x@ 10 root wheel 340 3 15 2017 usr lrwxr-xr-x@ 1 root wheel 11 3 4 2017 var -> private/var |
1行目はシェルスクリプトを実行している行、2行目はpwdコマンドの実行結果、3行目はdateコマンドの実行結果、4行目以降はls -lコマンドの実行結果です。
シェルスクリプトで楽をしよう

上の例のように、コマンドをいくつも打たなければいけない場合や、その量が多い場合、何度も繰り返さなければいけない場合などに、シェルスクリプトを作るとその手間を省くことができます。作り方もとても簡単ですので、ぜひチャレンジしてみてください。