
第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ルータの作成・2 (2010/3/11)
IPパケットのディスティネーションアドレスを書き換える「DNAT」を使って、透過型プロキシを構築します - 一歩進んだ監視のカスタマイズ (2010/3/3)
スクリプトの実行結果などを取得できるユーザーパラメータを用いて、自分のニーズにぴったり合った監視を実現 - OSSライセンス順守の第一歩 (2010/2/18)
企業として、OSSライセンス違反を犯さないためには、どのような手順が必要か、いくつかアドバイスします - 無視できないフラグメンテーション問題への解答は? (2010/2/10)
今回は、メモリコンパクション、そしてメモリバリアを発行するシステムコールという2つのパッチについて深く紹介します
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |






