Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

実用的な5つの例で学ぶBashスクリプト入門チュートリアル

実用的な5つの例で学ぶBashスクリプト入門チュートリアルUnix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。

シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。

ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。

一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この場合、シェルはスクリプトファイルの各行を上から下へ順番に読み込み、ユーザーが直接入力したかのように各コマンドを実行していきます。

組み込みシェル変数「$-」の値を出力すると、現在のシェルが対話型か非対話型かを確認できます。

# echo $-
himBH

注意:シェルが対話型の場合、$-変数には「i」が含まれます。

Unixにはさまざまな種類のシェルが存在します。Bourneシェル(sh)、Bourne Againシェル(bash)、Cシェル(csh)、Kornシェル(ksh)、Tenex Cシェル(tcsh)などです。以下のように、whichコマンドやwhereisコマンドを使えば、特定のシェルがどこにインストールされているかを調べられます。

# which bash
/bin/bash

# whereis bash
bash: /bin/bash /usr/share/man/man1/bash.1.gz

シェル名を入力するだけで、別のシェルへ切り替えることもできます。たとえば「csh」と入力すればCシェルに切り替わります。

シェルスクリプトの作成と実行

例1:Hello World Bashスクリプト

  1. お好みのエディタで、次の2行をファイルに入力してスクリプトを作成します。
  2. $ cat helloworld.sh
    #!/bin/bash
    echo Hello World
  3. ファイル名は自由に決められますが、Unixの組み込みコマンドと同じ名前は避けてください。
  4. スクリプトは必ず「#!」という2文字で始まります。これは「シバン(she-bang)」と呼ばれ、このファイルがスクリプトであること、そして1行目の残りの部分で指定されたインタープリタ(/bin/bash)を使って実行すべきことを示しています。
  5. 以下のようにスクリプトを実行します。実行時に問題が発生した場合は、シェルスクリプト実行のチュートリアルを参照してください。
  6. $ bash helloworld.sh
    Hello World
  7. 「bash helloworld.sh」コマンドを実行すると、非対話型シェルが起動し、ファイル名が引数として渡されます。
  8. 1行目は、スクリプトを実行するためにどのシェルを起動するかをOSに伝える役割を果たします。
  9. 上記の例では、bashインタープリタがスクリプトを解釈し、コマンドを上から下へ順番に1つずつ実行します。
  10. 先頭に「bash」を付けずにスクリプトを実行することも可能です。そのためには次の2点が必要です。
    • 「chmod u+x helloworld.sh」コマンドで、スクリプトにユーザーの実行権限を付与する。
    • スクリプトが格納されているディレクトリがPATH環境変数に含まれていること。含まれていない場合は、スクリプトの絶対パスを指定して実行できます。
  11. echoは、引数として与えた内容をそのまま出力するコマンドです。変数の値を表示する際にも使われます。

Bashのスタートアップファイル

以前の記事で解説した.bash_profileと関連ファイルの実行順序のように、bashが対話型シェルとして起動されると、まず/etc/profileからコマンドを読み込んで実行します。/etc/profileが存在しない場合は、~/.bash_profile、~/.bash_login、~/.profileの順にコマンドを読み込んで実行します。この動作を抑制したい場合は、シェル起動時に--noprofileオプションを使用します。

通常、bash_profileは~/.bashrcを実行します。必要であればウェルカムメッセージを表示させることもできます。これは初回ログイン時にのみ実行されます。また、任意の変数をexportしたり、シェルを開いたときにすぐ使えるエイリアスを設定したりすることも可能です。ログインシェルが終了するときには、Bashは~/.bash_logoutからコマンドを読み込んで実行します。

例2:ログイン時にウェルカムメッセージを表示する

bash_profileファイルに以下の内容を入力してください。ファイルが存在しない場合は、同じ内容で新規作成します。

$ cat ~/.bash_profile
hname=`hostname`
echo "Welcome on $hname."

対話型シェルにログインすると、以下のようなウェルカムメッセージが表示されます。

login as: root
root@dev-db's password:
Welcome on dev-db

例3:システム関連情報を表示する

対話型シェルにログインしたときに、サーバーにインストールされているカーネルの情報、bashのバージョン、稼働時間(uptime)、サーバーの時刻などを表示させることができます。

$ cat ~/.bash_profile
hname=`hostname`
echo "Welcome on $hname."

echo -e "Kernel Details: " `uname -smr`
echo -e "`bash --version`"
echo -ne "Uptime: "; uptime
echo -ne "Server time : "; date

対話型シェルを起動すると、以下のようなメッセージが表示されます。

login as: root
root@dev-db's password:
Welcome on dev-db

Kernel Information:  Linux 2.6.18-128 x86_64
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Uptime:  11:24:01 up 21 days, 13:15,  3 users,  load average: 0.08, 0.18, 0.11
Server time : Tue Feb 22 11:24:01 CET 2010

例4:最終ログイン情報を表示する

同じマシンに同じアカウントで複数のユーザーがログインしている環境では、最後にどのマシンからログインしたのか、いつログインしたのかといった情報は非常に役立ちます。この例では、対話型シェルの起動時に最終ログイン情報を表示します。

$ cat ~/.bash_profile
hname=`hostname`
echo "Welcome on $hname."

echo -e "Kernel Details: " `uname -smr`
echo -e "`bash --version`"
echo -ne "Uptime: "; uptime
echo -ne "Server time : "; date

lastlog | grep "root" | awk {'print "Last login from : "$3
print "Last Login Date & Time: ",$4,$5,$6,$7,$8,$9;}'

起動時には、以下のようなメッセージが表示されます。

login as: root
root@dev-db's password:
Welcome on dev-db

Kernel Information:  Linux 2.6.18-128 x86_64
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Uptime:  11:24:01 up 21 days, 13:15,  3 users,  load average: 0.08, 0.18, 0.11
Server time : Tue Feb 22 11:24:01 CET 2010

Last login from : sasikala-laptop
Last Login Date & Time:  Tue Feb 22 11:24:01 +0100 2010

例5:スタートアップ時に変数をexportし、エイリアスを設定する

.bashrcや.bash_profileファイルで最もよく使われるコマンドは、exportとaliasです。

エイリアスとは、あるテキストを別のテキストに置き換える仕組みです。エイリアスを実行すると、入力したコマンドがエイリアスに設定された内容へ自動的に置き換えられます。たとえば、lsコマンドでファイルやフォルダを色付きで一覧表示させるエイリアスを設定するには、次のようにします。

alias ls 'ls --color=tty'

このコマンドをいずれかのスタートアップファイルに追加しておけば、以後lsコマンドを実行するたびに、自動的に「ls --color=tty」へ置き換えられて実行されるようになります。

exportコマンドは、環境変数を設定するために使用します。さまざまな環境変数がシステムや他のアプリケーションによって利用されており、環境変数はあらゆるアプリケーションやスクリプトから読み取れるパラメータを設定する手段となります。なお、exportコマンドを使わずに変数を設定した場合、その変数はそのプロセス内でのみ有効になる点に注意してください。

以下の例では、環境変数HISTSIZEをexportしています。「#」で始まる行はコメント行です。

$ cat /etc/profile
alias ls 'ls --color=tty'

# Setup some environment variables.
export HISTSIZE=1000

PATH=$PATH:$HOME/bin:/usr/bin:/bin/usr:/sbin/etc

export PATH

export SVN_SH=${SVN_RSH-ssh}
  1. Bash変数チュートリアル – 基本からグローバル変数・ローカル変数まで学べる6つの実用例

    Bash変数は、プログラムの実行期間中に必要となる情報を一時的に保存しておくための仕組みです。本記事はBashチュートリアルシリーズの一篇で、他のプログラミング言語と同様にBashでも変数を利用できることを踏まえ、基本的な使い方からグローバル変数とローカル変数の違いまでを、6つの実用的なサンプルを通じて解説します。 Bash変数の基本構文 変数の定義は非常にシンプルで、次の書式に従います。 VARNAME=VALUE 注意: 変数へ代入する際は、「=」記号の前後にスペースを入れてはいけません。「VAR=VALUE」のように書けば、シェルは「=」を代入記号として認識し、この行を変数への代入とし

  2. Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル

    Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の