UNIX的なアレ:gihyo.jp出張所

第20回 知っておきたいシェルスクリプトの基礎知識 その1

この記事を読むのに必要な時間:およそ 2 分

今回から,新しいテーマとしてシェルスクリプト作成のノウハウについて解説します。

システム管理者の業務の中心は,日々の運用でしょう。

「サービスに不具合が生じている」「サーバにログインできなくなった」「ハードディスクが調子が悪い」……などなど,日々の運用の内容はあげたらキリがないほどです。

そこで,ある程度なれている管理者であれば自分で使うためのシェルスクリプトを用意することで,作業を自動化ないしは簡略化していることでしょう。

しかしながら,シェルスクリプトの作成テクニックは世間に参考になるマニュアルもすくなくやろうと思っても意外と何から始めてよいのかわかりません。

本連載では,「これからシェルスクリプトを始めたい人」に向けてちょっとしたコツやテクニックを紹介していこうと思います。

シェルスクリプトとは何か?

シェルスクリプトと一般的に呼ばれていますが,ポイントは「コマンドの集合体である」という点です。普段であれば複数うっているコマンドをすべて自動化しているだけなのです。そのため,変に身構えずに,ふだんコマンドを入力している感覚の延長線上で書くことから始めてみましょう。

例題:ファイル名を変える

それでは「a.txt」というファイルを「b.txt」というファイル名にリネームする処理をやってみましょう。まずは実際にコマンドを入力するとどうでしょうか。まずは日本語で書いてみましょう。

  1. a.txtというファイルが存在するか確認する
  2. 存在したら,a.txtをb.txtへリネームする
  3. b.txtが存在したら終了

さて,上記の内容が確認できたら次は実際にコマンドを見てみましょう。

$ ls -l a.txt 
$ mv -i a.txt b.txt
$ ls -l b.txt

細かいオプションなどは人によって変わってくるでしょうが,大まかには上記の例と大きな違いはないと思います。

さてそれでは上記の内容をシェルスクリプトとして一括処理できるようにしてみましょう。

下記の内容を見てください。

#!/bin/sh
if [ -e a.txt ]
then
   mv -i a.txt b.txt
fi

if [ -e b.txt ]
then
   echo "operation is success"
fi

非常に簡単な内容ではありますが手動でやっていることとほぼ同じです。上記の内容に関してはここではまだ触れません。ここでは,ふだんのオペレーションの延長線上にあるということを意識しておいてください。

シェルとは何か?

さて,先ほどからさんざん連呼している「シェル」とはいったい何なのでしょうか?

「シェル」と総称して呼ばれるものは,ユーザの操作をシステムに伝えるためのインターフェースのことを指します。そのため,さまざまな「シェル」が存在し,それぞれの命令の方法が存在しています。以下は代表的なものです。

  • sh(Bourne Shell)
  • bash(Bourne Again Shell)
  • csh
  • tcsh(Tenex Style csh)
  • ksh(Korn Shell)
  • zsh

この中でも,Bourne Shellと呼ばれるシェル最も原始的なものでほぼすべてのUnix/Linux系のOSに入っています。そのため,汎用性を持たせるためにシェルスクリプトはBourne Shellでかかれることが多いです。

いろいろなシェルを知る

それは,皆さんがふだん利用しているシェルは何でしょうか?

それではデフォルトで設定されているシェルを確認してみましょう。$SHELLという環境変数をみることで確認することができます。

$ echo $SHELL
/bin/bash

上記の場合は,「/bin/bash」というシェルが標準のシェルとして設定されています。このように,それぞれのアカウントにはログインしたときに標準で使われるシェルが設定されています。

自分が使っているシェルが何なのかを調べておくと,普段のオペレーションとひも付くため覚えやすいと思います。

シェルスクリプトの書き始め

それでは,シェルスクリプトに取り掛かっていきましょう。

いろいろなシェルスクリプトを眺めていると気がつくと思いますが,どのスクリプトも1行目に 「#!/bin/sh」のような記述があると思います。一般的に「おまじない」と呼ばれることが多いですが,ここはしっかりと覚えておきましょう。

この記述は,shebang(シェバング)と呼ばれるもので,「ここで指定したプログラムを利用して以下の内容を実行してください」という意味です。

そのため,シェルスクリプトでよく見かける記述「#!/bin/sh」「/bin/shを使って以下の内容を実行してください」ということになります。

これと同様に,cshであればcshのパスをといった具合にパスを指定することで動作を変えることができます。

まずは,この記述方法に慣れてください。

さて,それでは実際に簡単なシェルスクリプトを記述してみましょう。好きなエディタで下記の内容を記述してください。

#!/bin/sh

for i in foo bar buzz
do
  echo $i
done

さて,記述ができたら「sample01.sh」という名前で保存してください。早速実行してみましょう。

$ sh ./sample01.sh
foo
bar
buzz

上記のように表示されれば成功です。この場合ですと,実行時にshと指定しているのでshebangは参照されていません。それでは,次はパス指定だけで実行をできるように変えてみましょう。

$ chmod +x ./sample01.sh
$ ./sample01.sh
foo
bar
buzz

このように実行権限を与えてやることで実行をすることができます。上記の例ですと,実行時にシェルの種類を指定していないためshebangが参照されています。

Windowsに慣れている人だと勘違いしがちなのですが,拡張子をみて自動的にshだと認識しているわけではありません。

シェルスクリプトを記述する場合においての拡張子はあくまで「わかりやすくするだけのもの」だという点を理解してください。

最後に

さて,今回はシェルスクリプトの基本的な知識について説明をしてきました。筆者自身も最初はこの部分を適当に理解していたため,後々何度もハマった経験があります。

そのため,今回の基本的な知識の部分は最初から理解しておいたほうがよいでしょう。

次からは実際によく使われる記述方法を少しずつ紹介していきたいと思います。

著者プロフィール

和田修一(わだしゅういち)

株式会社ロケットスタートCTO。PHPやPerlを中心としたアプリケーション開発から,Linuxなどの技術を中心としたインフラ系の設計・構築を担当。個人Blogは「Unix的なアレ」。

コメント

コメントの記入