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

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

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

Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。

bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。

この記事は、進行中のBashチュートリアルシリーズの一部です。過去の記事として、Bash入門Bash終了ステータスBashエイリアスの実例についての記事もありますので、あわせてご覧ください。

Bash関数を作成する構文

function functionname()
{
commands
.
.
}
  • function — キーワードですが、省略可能です。
  • functionname — 関数の名前です。
  • commands — 関数内で実行されるコマンドのリストです。

関数は引数を受け取ることができます。実行時に渡された引数は位置パラメータとして扱われます。位置パラメータ0にはスクリプト名が格納され、これは変更されません。

コマンドラインからは、以下のようにBash関数を呼び出します:

$ functionname arg1 arg2
  • シェルがLinuxコマンドを解釈する際、まずbreak、continue、eval、execなどの特殊な組み込み関数を探し、その後にシェル関数を探します。
  • Bash関数の終了ステータスは、関数本体で最後に実行されたコマンドの終了ステータスになります。

注意: シェル関数の定義は、シェル起動ファイル(例:.bash_profile)に記述しておくのがおすすめです。こうすることで、コマンドラインから常にその関数を利用できるようになります。.bash_profileがいつ実行されるかについては、過去の「bash実行順序」の記事を参照してください。

例1:指定した拡張子のファイルを詳細表示する関数

関数「lsext」は、指定された拡張子を持つファイルをカレントディレクトリから検索し、一覧表示します。findコマンドとlsコマンドを組み合わせることで、この処理を実現しています。

$ function lsext()
{
find . -type f -iname '*.'${1}'' -exec ls -l {} \; ;
}

$ cd ~

$ lsext txt
-rw-r--r-- 1 root root   24 Dec 15 14:00 InMorning.txt
-rw-r--r-- 1 root root  184 Dec 16 11:45 Changes16.txt
-rw-r--r-- 1 root root  458 Dec 18 11:04 Changes18.txt
-rw-r--r-- 1 root root 1821 Feb  4 15:01 ChangesOfDB.txt

例2:複数のファイルに対して指定コマンドを一括実行する関数

次の例では、関数「batchexec」が指定された拡張子のファイルを検索し、それらのファイルに対して指定されたコマンドを実行します。

$ function batchexec()
{
find . -type f -iname '*.'${1}'' -exec ${@:2}  {} \; ;
}

$ cd ~

$ batchexec sh ls

$ batchexec sh chmod 755

$ ls -l *.sh
-rwxr-xr-x 1 root root  144 Mar  9 14:39 debug.sh
-rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh
-rwxr-xr-x 1 root root   22 Mar 18 08:32 t.sh

上記の例では、拡張子「.sh」を持つすべてのシェルスクリプトを検索し、パーミッションを755に変更しています(所有者には全権限、グループとその他のユーザーには読み取り・実行権限を付与)。関数定義内の「${@:2}」は、2番目以降の位置パラメータを展開するシェルの拡張機能です。

例3:ランダムパスワードを生成する関数

次の関数は、特殊文字を含む強力なランダムパスワードを、指定した文字数で生成します。文字数が指定されない場合、デフォルトで12文字のパスワードを生成します。

$ function rpass() {
        cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12}
}

$ rpass 6
-Ju.T[[

$ rpass
Gz1f!aKN^""k

この例では、rpassを引数「6」付きで実行すると6文字のランダムパスワードが生成され、引数なしで実行すると12文字のパスワードが生成されます。「${1:-12}」は、$1が未設定またはnullの場合に12を返し、設定されている場合は$1の値を代入することを意味します。

例4:指定したネットワークインターフェースのIPアドレスを取得する関数

次の例では、「getip」という関数を定義しています。この関数はインターフェース名を引数として受け取り、そのインターフェースに割り当てられたIPアドレスを返します(デフォルトではeth0のIPアドレスを返します)。ifconfigコマンドを使ってIPアドレスを取得します。

$ function getip()
{
/sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}';
}

$ getip
15.110.106.86

$ getip eth0
15.110.106.86

$ getip lo
127.0.0.1

例5:マシンの詳細情報を表示する関数

この例では、マシンに関する必要な情報をまとめて表示する関数を定義します。スタートアップファイル内でこの関数を定義して呼び出せば、システム起動時にこれらの情報を自動的に確認できるようになります。

$ function mach()
{
    echo -e "\nMachine information:" ; uname -a
    echo -e "\nUsers logged on:" ; w -h
    echo -e "\nCurrent date :" ; date
    echo -e "\nMachine status :" ; uptime
    echo -e "\nMemory status :" ; free
    echo -e "\nFilesystem status :"; df -h
}

$ mach
Machine information:
Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux

Users logged on:
root     pts/2    ptal.mot Wed10    0.00s  1.35s  0.01s w -h

Current date :
Thu Mar 18 11:59:36 CET 2010

Machine status :
 11:59:36 up 7 days, 3 min,  1 user,  load average: 0.01, 0.15, 0.15

Memory status :
             total       used       free     shared    buffers     cached
Mem:       2059768    2033212      26556          0      81912     797560
-/+ buffers/cache:    1153740     906028
Swap:      4192956      48164    4144792

Filesystem status :
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              12G   12G     0 100% /
tmpfs                1006M  377M  629M  38% /dev/shm
/dev/sdc5             9.9G  409M  9.0G   5% /mydisk

例6:lsの出力を見やすく整形する関数

次の関数は、画面をクリアし、カーソルを画面上部に移動させてからlsを実行し、最後にカーソルを画面下部へ移動させます。

$ function ll ()
{
    clear;
    tput cup 0 0;
    ls --color=auto -F --color=always -lhFrt;
    tput cup 40 0;
}

$ ll

typeコマンドで関数の中身を確認する

「type」はシェルの組み込みコマンドで、関数のコードを確認するために使用できます。

構文:
type function-name
$ type ll
ll is a function
ll ()
{
    clear;
    tput cup 0 0;
    ls --color=auto -F --color=always -lhFrt;
    tput cup 40 0;
    alias ls="ls --color=auto -F"
}

参考までに、本記事で紹介した6つの関数すべてを含んだサンプルの.bash_profileファイルをご利用いただけます。

これらの関数を~/.bash_profileファイルに追加しておけば、その都度定義し直すことなく、いつでもどこからでも利用できるようになります。日々の作業効率化にぜひお役立てください。

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

    Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この

  2. Excelのデータベース関数とは?12種類の使い方を実例付きでわかりやすく解説

    この記事では、Excelのデータベース関数の使い方を詳しく解説します。Excelには12種類のデータベース関数が用意されており、それぞれの適用方法を一つずつ紹介していきます。まずは記事全体の概要を以下の画像でご確認ください。記事を最後まで読めば、すべての関数の使い方を習得できます。 練習用ワークブックは、下のダウンロードボタンから入手できます。 Excelのデータベース関数の基礎知識 Excelのデータベース関数を使うと、特定のデータベース(リスト)に対して合計、積、平均などの基本的な計算を簡単に実行できます。データベース関数は全部で12種類あり、DSUM、DAVERAGE、DCOUNT、D