シェル関数とは、シェルスクリプトの中で定義する関数のことです。関数とは、何らかの処理を行って結果を返す、まとまった処理のことで、同じ処理を何回も行う必要があったり、ひとまとまりの処理をわかりやすく書くような場合に関数を利用すると便利です。

#!/bin/bash
f_hello() {
    echo "Hello. I am `whoami`."
}
f_hello

実行結果

Hello. I am root.

シェルスクリプトの中で関数を実行して結果を受け取る操作を「関数を呼び出す」と表現します。上記例では、f_hello関数を定義し、メイン処理からf_hello関数を呼び出しています。

関数の定義
関数名() {
実行内容
}

シェル関数は一般的にメイン処理を記述するより前で定義します。

関数をうまく利用することで、プログラムの品質と作業効率を高めることができます。同じコードを複数箇所に書いた場合、その箇所すべてでテストしなければいけませんが、よく使う機能をシェル関数とし、テストしておけば、その後はテストしなくてもその関数を使えます。

シェル関数に引数を渡す

シェル関数には引数を渡すことができます。以下は、それがわかる簡単なサンプルです。

#!/bin/bash
f_param() {
    echo $1
}
f_param abc

実行結果

abc

上記サンプルでは、f_param関数を定義しており、メイン処理からf_param関数を呼び出す際、引数として「abc」を与えています。f_param関数内部では、この引数が$1として扱われます。引数が2つ以上あれば、$1が第1引数、$2が第2引数となります。

シェル関数の戻り値

シェル関数は戻り値を返すこともできます。以下は、シェル関数が成功したか失敗したかの結果を戻り値として返すサンプルです。

f_ret() {
    if [ $1 = "y" ]
    then
        return 0
    else
        return 1
    fi
}
f_ret y && echo "Success."
f_ret n || echo "Fail."

実行結果

Success.
Fail.

return文が実行された時点でシェル関数を終了し呼び出し元に処理が戻ります。また、処理を戻す際、呼び出し元に返す、戻り値を指定することができます。

戻り値が0なら成功、0以外は失敗を表します。
※シェルスクリプトでは真は0、偽は0以外(通常は1)で表されます。他のプログラム言語では真が0以外、偽が0となるのが多いので混合しないよう注意してください。

このサンプルではこれまで出てこなかった新しい構文を使っています。

&&と||
コマンド1 && コマンド2
コマンド1が成功した場合にはコマンド2を実行し、コマンド1が失敗した場合はコマンド2を実行しない。

コマンド1 || コマンド2
コマンド1が失敗した場合にはコマンド2を実行し、コマンド1が成功した場合はコマンド2を実行しない。

上記の構文を踏まえ、以下の動作を考えてみます。

f_ret y && echo "Success."
f_ret n || echo "Fail."

まず、前者は、f_ret関数の戻り値として0、つまり真が返ってきます。&&は真の場合に右辺のコマンドを実行するため、「echo “Success.”」コマンドが実行されます。後者は、f_ret関数の戻り値として1、つまり偽が返ってきます。||は偽の場合に右辺のコマンドを実行するため、「echo “Fail.”」コマンドが実行されます。

戻り値として真、偽以外の値を返す

例えば、JavaやC++など他のプログラミング言語では、関数の戻り値として真、偽以外に、文字列を呼び出し元に返すことができます。では、シェルスクリプトではどうでしょう。

シェルスクリプトのreturn文では、0か、0以外の指定しかできません。

#!/bin/bash
f_str_ret() {
    if [ $1 = "y" ]
    then
        echo "Success."
        return 0
    else
        echo "Fail."
        return 1
    fi
}
f_str_ret y
f_str_ret n

実行結果

Success.
Fail.