シェルスクリプトの関数

シェルスクリプトの関数定義

関数の定義

シェルスクリプトの関数定義は以下の形式となります。

関数名の後に「( )」を付けます。


function 関数名() {
    処理
    return 値
}

なお、頭につける「function」は省略可能であり、一般的には以下のような書式で関数を定義します。


hello_world() {
    # メッセージを標準出力とログファイルに出力する。
    echo "hello world." | tee -a ./test.log 
    return 0
}

シェルスクリプトにおける関数の戻り値

数値の戻り値(終了コード)

関数の末尾に「return」コマンドを記述すると、関数の終了ステータスを数値として返すことができます。

returnコマンドの引数に指定できる値は、「1~255の正の整数のみ」です。マイナス値の指定も可能ですが、「-1」を指定した場合は結果的に255になります。

returnコマンドは省略可能です。省略された場合は、関数内で最後に実行されたコマンドの終了ステータスが、関数自体の終了ステータスとなります。


delete_config_file() {
    rm ./conf/camp-network.conf
    if [ $? -gt 0 ]; then
        echo "ERROR: invalid argument."
        return 1
    fi

    return 0
}

文字列などの戻り値

returnコマンドでは、文字列などを戻り値として返すことはできません。

戻り値を使用したい場合は、関数内で標準出力に戻り値を出力し、コマンド置換でその値を取得する方法があります。


hello_world() {
    echo "hello world."
}

msg=`hello_world`
echo "戻り値=${msg}"

シェルスクリプトにおける関数の呼び出し

関数の呼び出し

シェルスクリプトの関数呼び出しは以下の形式となります。

呼び出し時は「( )」は不要です。


関数名 引数リスト

関数の引数

関数は引数を持つことが可能で、関数内ではシェルスクリプトと同様に変数「$1 ~ $n」で各引数を参照することが可能です。

C言語のように括弧の中に引数を記述する必要はありません。

関数に引数を渡す場合は、シェルと同じようにスペース区切りで渡します。


#!/bin/sh

func_sample()
{
  #引数が存在しているか確認する
  if [ $# != 2 ]; then
      echo "ERROR: Too few arguments." 1>&2
      return 1
  fi

  # 引数を出力する
  echo "\$0=$0"
  echo "\$1=$1"
  echo "\$2=$2"
  return 0
}

func_sample 123 456
ret=$?
echo "result=${ret}"

引数を表す特殊な変数は以下の通りです。

$# 関数に与えられた引数の個数
$0 シェル自身のファイル名(関数名ではないので注意が必要です。)
$1~$n シェルに与えられた引数の値。$1は第1引数、$2は第2引数…となる。
$* 全引数リスト。"$*"のように「"」で囲んだ場合、"$1 $2 … $n" と全引数を一つにくっついた形で展開される。
$@ 全引数リスト。"$@"のように「"」で囲んだ場合、"$1" "$2" … "$n" とそれぞれの引数を個別にダブルクォートで囲んで展開される。
$? 最後に実行したコマンドの終了コード(戻り値)

シェルスクリプト関数の変数スコープ

シェルスクリプトのグローバル変数

シェルスクリプトでは、関数内で宣言した変数はグローバル変数となります。

ローカル変数ではありませんので、関数外から参照することが可能です。


#!/bin/sh

set_logfile_path() {
    logfile_path="./log_`date +%Y%m%d`-`date +%H%M`.log"
}

set_logfile_path
echo "[LOG] log point: 1" | tee -a ${logfile_path}

シェルスクリプトのローカル変数

シェルスクリプトでローカル変数を用いる場合には、変数に「local」キーワードを指定します。


func_sample() {
  local local_var="ローカル変数です"
  global_var="グローバル定数です"
}

シェルスクリプトの定数

シェルスクリプトで定数を用いる場合には、変数に「readonly」キーワードを指定します。「readonly」を付けると以降値の書き換えを出来なくなります。


func_sample() {
  readonly local_var="読み込み専用のグローバル変数です"
  local readonly LOCAL_VAR="読み込み専用のローカル定数です"
}

その他の変数定義方法

明示的に変数を宣言する事場合、下記のコマンドがあります。

ほぼ同機能であるため、「declare」コマンドのほうが利用頻度は高いといえます。


declare [オプション] [変数名[=値]]
typeset [オプション] [変数名[=値]]
-a 変数を配列として作成します。
-i 変数を整数型(integer)として作成します。
-r 変数を参照のみ可能(read only)として作成します。readonlyコマンドと同じ
-f 定義済関数を表示します。
-F 定義済関数名を表示します。

シェルスクリプト変数の開放

変数の開放には「unset」コマンドを使用します。


unset var

関連ページ