
第8回 bashで始めるシェルスクリプト基礎の基礎
GUIに対するCUIの優位性の1つとして、作業の自動化が挙げられる。普段行う作業を1つのコマンドにまとめたり、複数のファイルに対して同じ処理を繰り返し行ったりといったことが比較的簡単なのだ。WindowsにもWSH(Windows Script Host)が用意されている。しかし、Linuxのbashスクリプトの方が簡単なのだ。
関野史朗2002/2/5
シェルスクリプトの基本はコマンドを並べること
コマンドによる作業を自動化するには、その内容を記述したテキストファイルを用意すればいいのです。このテキストファイルを「シェルスクリプト」といいます。
■最も簡単な自動化
最も簡単なシェルスクリプトは、コマンドをそのまま並べることです。例えば、tarコマンドでファイルのバックアップを取るとしましょう。単純にルートディレクトリから下を全部バックアップするにしても、/devや/tmpは必要ないですね。すると、
$ tar cf /dev/nst0 /bin |
といった具合になります(注)。
| 注:1つのコマンドでルートディレクトリ以下をまとめてバックアップすることもできます。ただ、ある程度の範囲で分けておいた方が、メディア不良などのダメージが及ぶ範囲を小さくできますし、目的のファイルを探すのも楽です。 |
これをいちいちタイプするのは面倒です。そもそも、バックアップにはある程度の時間がかかるのが普通ですから、前のコマンドが終了するまで次のコマンドはタイプできません。これでは作業効率が上がらないでしょう。
そこで、シェルスクリプトを作ってみましょう。sysbackup.sh(注)という名前のファイルを作り、
tar cf /dev/nst0 /bin |
上記のように実行するコマンドを並べるだけです。WSHだと、普段メニューとマウスで行っている作業をVB ScriptやJScriptに翻訳しながらプログラムを作る必要があります。ところが、シェルスクリプトは普段使っているコマンドを書くだけでいいのです。
注:ファイル名の「.sh」は、なくてもスクリプトの実行には関係ありません。「.sh」を付けなくてもよいのですが、そうなるとファイル名だけではCコンパイラなどを使って作ったバイナリの実行ファイルと区別できません。もちろん、ファイルサイズが全然違いますし、lessなどで中を見れば簡単に区別できます。余談ですが、これを見分けるためのプログラムも存在します。
としてみてください。 |
実行するのも簡単です。
$ sh sysbackup.sh |
とすれば、自動的に順次コマンドを実行します。その間にほかの仕事ができるし、就寝前に実行すれば、翌朝には終了しているでしょう。
■もう少しコマンドらしく
作成したシェルスクリプトを普通のプログラムと同じ方法で実行することもできますが、それには2つばかり細工が必要です。まず、シェルスクリプトの先頭に次の行を追加します。
#!/bin/sh |
これはお約束で、「#!」以後に書かれたプログラムでこのスクリプトを実行するという意味です。応用として「#!/bin/perl」「#!/bin/ruby」(編注)などもあります。
| 編注:この記述は環境によって異なる。多くのLinuxディストリビューションでは、「#!/bin/perl」「#!/bin/ruby」ではなく「#!/usr/bin/perl」「#!/usr/bin/ruby」になるだろう。perlやrubyのパスは、whichコマンドなどで調べられる。 |
もう1つは、ファイルに実行属性を付けることです。chmodコマンドを使って、
$ chmod u+x sysbackup.sh |
とします。この2つの作業を行えば、
$ ./sysbackup.sh |
で実行できるようになります。
シェルスクリプトによる出力の制御
■結果の保存
シェルスクリプトをバイナリの実行ファイルと区別しないのは、入出力のリダイレクトでも同じです。つまり、
$ ./sysbackup.sh > log.txt |
とすれば、出力結果をlog.txtというテキストファイルに保存できます。また、定期的に実行するのであれば、スクリプトの中でリダイレクトを指定することもできます。この場合、柔軟性がやや低下する点に注意が必要です。
なお、普通にリダイレクトを指定すると、標準エラー出力への出力はリダイレクト先のファイルではなく、端末に表示されます。これは、エラーが起きたことをユーザーに知らせるためです。この標準エラー出力もリダイレクトするなら、
$ ./sysbackup.sh > log.txt 2>
err.txt |
とします。「2>」というのがミソで、これが標準エラー出力のリダイレクトの指示です。さらに、
$ ./sysbackup.sh > log.txt 2>&1 |
とすると、すべての出力がlog.txtに記録されます。
■長い文字列を出力する
シェルスクリプトで文字列を出力するには、普通echoコマンドを使って、
echo 'Hello, world' |
などとします。しかし、ちょっと長い文字列を出力したいこともあるでしょう。また、HTMLファイルへの加工を行うなら、ヘッダなどを見やすい形で記述したいと思うでしょう。こんなときに便利なのが、「ヒアドキュメント」です。
例えば、HTMLのスケルトンをechoコマンドで出力するなら、
#!/bin/sh |
ですが、ヒアドキュメントを使うと、
#!/bin/sh |
となります。「<<」の後に指定した文字列が出現する直前まで、コマンドに対する標準入力として扱われます。上の例では、「EOS」を目印にしています。
ヒアドキュメントを使うと、出力したい文字列をそのまま書けばいいので、スクリプトをすっきりと記述できます。後から文字を追加するのも簡単です。
引数と変数で柔軟性を実現
■引数と変数
いつも同じことを繰り返すシェルスクリプトだけでもかなりの省力化になりますが、処理対象を実行時に決めたいこともあります。シェルスクリプトはテキストファイルなので、そのたびに書き換えるのも1つの手です。しかし、処理対象の数が増えてくると面倒ですし、あまりスマートな方法ではありません。
これを解決するため、シェルスクリプトに引数を渡すことができます。引数は、シェルスクリプトからは順番に$1、$2、$3、……として参照できます。引数の数は「$#」で分かります。また、「$*」とすることで、すべての引数を一度に参照できます。なお、「$0」はスクリプトが呼び出されたときの名前が入ります。
例として、簡単なあいさつを行うシェルスクリプトで引数を試してみましょう。greeting.shという名前で、
#!/bin/sh |
という内容のファイルを作ります。chmodコマンドで、直接実行できるようにしておいてください。以下はこのシェルスクリプトの実行例です。
$ ./greeting.sh tom |
実のところ、シェルスクリプトでは「$」で始まる文字列を変数として扱います。より正確にいうと、文字列が$で始まっている場合はその文字列に格納されたデータを取り出して置き換えます。ですから、変数にデータを代入するときは$が不要です。例えば、
test=one |
というシェルスクリプトを実行すると、
$ sh var.sh |
となります。
また、シェルスクリプトでは基本的に変数を文字列として扱います。つまり、
test=1 |
の実行結果は、
$ sh add.sh |
となります。
変数を数値として扱いたいときは、declareコマンドで指定します。
declare -i test |
というシェルスクリプトを実行すると、
$ bash add2.sh |
と、今度は整数演算を行った結果が返ってきます。「-i」で、整数値として処理することを指定するのです。
なお、変数に何も代入されていない場合は、空の文字列が返ってきます。
■変数に対するパターンマッチ
前回、ファイルの拡張子を書き換える例を示したと思います。そこに使ったパターンマッチは4種類あり、非常に汎用性の高いものです。
- ${変数#パターン}
変数の内容について、最初の部分とパターンがマッチしたら、最も短く一致する部分を取り除いた残りの部分を返す。
- ${変数##パターン}
変数の内容について、最初の部分とパターンがマッチしたら、最も長く一致する部分を取り除いた残りの部分を返す。
- ${変数%パターン}
変数の内容について、最後の部分とパターンがマッチしたら、最も短く一致する部分を取り除いた残りの部分を返す。
- ${変数%%パターン}
変数の内容について、最後の部分とパターンがマッチしたら、最も長く一致する部分を取り除いた残りの部分を返す。
変数testpathに/home/sekino/Linux/how.to.linuxという値を設定しておくと、
$ echo ${testpath##/*/} |
といった結果になります。また、ファイル拡張子を置き換えるという観点からは、
#!/bin/sh |
というスクリプトを実行すると分かりやすいと思います。
|
1/2
|
| Index | |
| Windowsユーザーに教えるLinuxの常識 | |
| シェルスクリプトの基本はコマンドを並べること シェルスクリプトによる出力の制御 引数と変数で柔軟性を実現 |
|
| 条件式と繰り返しによるスクリプトの制御 手抜きのススメ |
|
| 連載 Windowsユーザーに教える Linuxの常識 |
| Linux Squareフォーラム Linux/システム学習関連記事 |
| 連載:Windowsユーザーに教えるLinuxの常識(全12回) Windowsのセオリーが通用しないLinux。Linux初心者向けに、LinuxというOSの考え方/常識をゼロから伝授! |
|
| 連載:LFSで作って学ぶLinuxの仕組み(全4回) 管理者(root)は、何をしなければならないのか? 管理に際して検討すべきことは? 管理のための技術とは? など、駆け出し管理者のための考え方や方法論を検討する |
|
| 連載:Linux管理者への道(全8回) 「Linux From Scratch」というシンプルなLinuxをインストール&環境構築する作業を通して、LinuxがOSとして機能するための仕組みや設定を見直そう |
|
| Linux Squareフォーラム全記事インデックス |
|
ホワイトペーパー(TechTargetジャパン)
- natテーブルを利用したLinuxルータの作成 (2010/2/9)
natテーブルを用い、市販のブロードバンドルータと同等かそれ以上の機能を備える「Linuxルータ」を作成してみましょう - Web監視機能を賢く利用する (2010/2/2)
プロセスの稼働確認だけでは、サービスが正常に提供できているか分からないことも。そこで使いたいのがWeb監視です - ものいわぬOpenLDAPサーバのログ管理 (2010/1/20)
不満をいわないコンピュータが相手だからこそ、常にログが確認できる状態を整備することが重要になります - ネットワークアクセス権も放棄せよ (2010/1/12)
新しいセキュリティ機構「disablenetwork」を提案する1通のメールから始まった議論が、LSMも巻き込む話へと拡大しました
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | 企業の仮想化に足りない“発想”とは? 仮想化運用管理のキモは意外なところに! New! |
| ◆ | 操作もマニュアルも分かりやすい! ユーザー視点で開発されたPC管理ツール New! |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |

| ◆ | セキュリティを知り尽くす上野氏が登壇! @ITメールソリューションLive! in Tokyo |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
| ◆ | 世界に通用するストレージの作り方とは? 製品に込めた思いを富士通の開発者に聞く |

| ◆ | OSSで手間も時間も、障害も減った―― 「マピオンの事例」オープンソース活用法 |
| ◆ | 「ノートPCの持ち出し禁止」で大丈夫? 情報漏えいを防ぐ管理手法とインフラは? |
| ◆ | 1日の処理を1秒に――MySQLの達人が語る 「コスト削減」できるチューニング |

| ◆ | ドキュメント作成を自動化して、SEの作業 効率を大幅アップ! Visio 2007の魅力 |
| ◆ | 急速に広がるHyper-Vでのサーバ仮想化 そのベストプラクティスをデルが解説 |
| ◆ | @IT主催セミナーで語られた、「担当者に 求められるセキュリティ対策」をレポート |

| ◆ | @IT「Windows 7」 特設サイトオープン! 最新情報・移行ノウハウを公開しています |






