どうも、シローです。

シェルスクリプトも他のプログラミング言語と同じく、関数を作ることができます。

今回は関数の使い方についてまとめていきます。

関数について

プログラムにおいて一連の処理において、一部を置き換えて何回も実行したいというケースがある。

  • 数値を引数にして、計算式を実行
  • ファイル名を引数にして、テキストファイルを生成

などなど

こういった、可変の情報を受け取って、一定の処理をするものを関数という。

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

シェルスクリプトにおける関数は次のように記述する。

// 関数の宣言  関数名()  {    処理  }  // 関数の実行  関数名 引数1 引数2

PHPやJavaScriptとは

  • 関数の宣言に引数を決める部分が無く
  • 実行するときには関数名(引数1, 引数2)ではなく、関数名 引数1 引数2という記述になる

部分が異なる

また、関数の実行部分よりも前に関数を宣言しないといけないのもポイントである。

関数に渡された引数を呼び出す

関数に渡した引数は渡した順番通りに$1,$2,$3といった値に渡されます。

サンプル:三角形の面積を計算する関数

小数点の計算にはbcコマンドを使用している。

calc_try.sh

#!/bin/bash  // 関数の宣言  calc() {    height=$1    bottom=$2    echo "scale=2; ${height} * ${bottom} / 2" | bc  }    // 実行  result=$(calc 3 5)  echo ${result}    

実行

$ bash calc_tri.sh  7.50

変数のスコープ

基本的に関数の外で定義した変数を関数内で参照することはできます。また、関数内で上書きすると、関数の実行後もその変数の値は上書きされたままになります。

fparam.sh

#!/bin/bash    update()  {    name=taro    echo "inside: ${name}" # taro  }    name=shiro  echo "outside: ${name}" # shiro  update  echo "outside: ${name}" # taro  

実行

bash fparam.sh  outside: shiro  inside: taro  outside: taro

関数内でのローカル変数

変数を関数の中だけに影響させたい場合は、localを変数の前につけます。

local_fparam.sh

#!/bin/bash    update()  {    local name=taro    echo "inside: ${name}" # taro  }    name=shiro  echo "outside: ${name}" # shiro  update  echo "outside: ${name}" # shiro

実行

bash local_fparam.sh  outside: shiro  inside: taro  outside: shiro

通常は、関数内で関数外の変数を上書きしたりすると、エラーの原因がよく分からなかったりする原因になるのでlocalをつけて関数内でしか適用しないようにするみたいです。

まとめ

  • 関数の宣言を先に書いてから、関数を実行する
  • 関数に渡した引数は位置パラメータ($1,$2,$3...)に渡される
  • 関数の外で渡した変数を参照できる、また上書きすることもできるが、localをつけることで関数内に限定させることができる