第2回 役立つコマンドとシェルスクリプト (2/2)


2.シェルスクリプト

これまでいろいろなコマンドを説明してきましたが、何かをするのにいちいちコマンドを打つのは面倒で、Windowsの方が断然便利だな、と思った人も多いと思います。しかし、Unixにはシェルスクリプトというものがあり、それが使えるようになるとUnixの便利さを多少は実感してもらえると思います。ここではシェルスクリプトについて学びます。

a) シェルスクリプトとは?

シェルスクリプトとは、基本的にはいくつかのコマンドをあらかじめ書いておいて、それを実行すると書いてあるコマンドが一度に実行されるというものです。使いこなせるようになれば、いつ、どういった条件でどういう命令を実行する、というような込み入った使い方もできるようになりますが、ここでは入門的な事だけを紹介します。シェルスクリプトだけで一冊の本が書けるほど豊富な内容がありますので、詳しく知りたい人は専門書を調べるなどして勉強してください。

まず基本として、シェルスクリプトは.shの拡張子で作成するのが通常です。試しに、test.shという名前で、以下の内容のテキストファイルをemacsで作成してみましょう。

#!/bin/sh
echo "Hello"
echo "Goodbye"

全部で3行のファイルです。一行目に謎の文字列が並んでいますが、これは「これからシェルスクリプトを書くよ」という一種の決まり文句だと思ってください。2行目以降に実行したいコマンドを書いています。この例だと、Helloと表示した後にGoodbyeと表示するという二つの動作をするスクリプトになっています。これを実行する方法は以下で紹介しますが、実行するとこれらの複数のコマンドを一度に実行することができます。

ちなみに、このようにいくつかのコマンドを一度に実行できるというのは、物理の研究においても有用な場面が多くあります。例えば数値計算の結果のデータから、グラフを作ったり平均値などを計算するといった解析を、シェルスクリプトを一度実行することで全て一度に行うということが可能です。また、一度シェルスクリプトファイルを作成しておけば、もとの数値計算結果が更新されたときに、それに対して同じ解析をすぐに繰り返すことができます。

b) シェルスクリプトの実行

さて、上で作成したシェルスクリプトを実行してみましょう。まず、カレントディレクトリにtest.shがある状態にしてください。そこで./test.shとすれば基本的に実行ができます。しかし、これをやってみると

1+1

となってしまって実行できません。実は、最初に実行するときにはファイルの「実行権限」を与えないといけません。各ファイルには見る権利、書き込む権利、実行する権利のあるなしが設定されていて、このうち実行する権利をオンにしないとシェルスクリプトの実行はできないというわけです。権限を変更するにはchmodというコマンドを使って以下のようにします

1+1

755が何を意味するかはここでは詳しく述べませんが(気になる人は調べてみましょう)、これで実行権限が与えられたことになります。さて、あらためて./test.shとしてみましょう。

1+1

こんどはきちんと実行できましたね。実行出来たら、試しにもう一度実行してみましょう。二度目以降はchmodをする必要はありません。


c) 練習問題

さて、先ほど最も簡単なシェルスクリプトの例を紹介しましたが、やはり何事も慣れるためには「自分で考えてやってみる」のが一番です。時間がある限り、以下で挙げるようなシェルスクリプトを各自で作成して、うまくいくかどうか試してみましょう。

  • 気の利いたフレーズとともに、今日の日付とカレンダーの情報を表示してくれるシェルスクリプト(気の利いたフレーズはecho、日付はdate、カレンダーはcalというコマンドで表示できます。)
  • 前のページで作ったabc.txtの、最初の5行だけを書き出したファイル「abc5.txt」を作成するシェルスクリプト(ヒント:headとリダイレクトを使いましょう)
  • abc.txtの各行の最初に、行番号を挿入した新しいファイル「abc-LN.txt」を作成するシェルスクリプト
  • abc.txtの3と書かれている行を全てHelloという文字列に置き換えた新しいファイル「abc-hello.txt」を作成するシェルスクリプト 
  • abc.txtの1と書かれている行を最初に、2と書かれている行を次に、3と書かれている行を最後に来るように並べ替えたファイル「abc-123.txt」を作成するシェルスクリプト
  • abc.txtの各行を逆順に並べ替えて、最後の行が最初に、最初の行が最後になるようにしたファイル「abc-reverse.txt」を作成するシェルスクリプト
  • 他のディレクトリにある別のシェルスクリプトを実行してくれるシェルスクリプト
  • 時間があれば他にもいろいろ試してみましょう。