【bash/シェルスクリプト 】関数を定義して使うには

シェル/bash

bashで関数を使いたい人
「bashで関数を使いたいので構文や使い方を教えてください。例えば、シェルスクリプトだけでなく、ターミナルからも関数定義できますか?引数や戻り値の使い方も教えて欲しいです。」

こんな疑問を解決します。

この記事を書いた私は、年収1,000万円ちょっとのエンジニア。高校生の頃から約20年間、bashやtcsh、zshのようなシェルスクリプトのほか、C/C++,Java,SML,Ocamlなど様々なプログラミング言語を扱ってきました。

数あるプログラミング言語の中でも、bashのようなスクリプト言語は簡単かつ効率的に処理を行うことができるのが特徴です。

これまでのプログラミング経験とエンジニア業務経験を踏まえて記事を書きます。

本記事の内容

機能単位で関数にした方が良い理由

機能単位で関数にした方が良い理由

bashでも他のプログラミング言語同様に、関数を使うと以下のメリットがあります。

  • 機能単位でテストしやすい
  • 可読性が高まる
  • 汎用性が高まる
  • 再利用可能となる
  • 変数がローカル化され、影響範囲を制限できる

機能単位でテストしやすい

関数ごとにテストが可能になります。関数にしていないと、プログラムコード全体を使ってテストすることになり、無駄な処理まで動かさなくてはなりません。

可読性が高まる

機能ごとに関数にしておけば、知りたい関数のみ見れば良いので読みやすくなります。また呼出元の処理も個別の機能が外に出てコードがシンプルになるため、可読性が高まります。

再利用可能となる

関数の無いプログラムコードは汎用性がなく、再利用生が低いです。関数にしておけば別の場所から呼び出したり、引数を変えて様々な条件に対応できたり再利用生が高まります。

変数がローカル化され、影響範囲を制限できる

関数内でローカル変数を使えば、変数がその関数の外に影響を及ぼすことはありません。影響範囲を限定し、他の処理に悪影響を与えることを防ぐことができます。

 
つまり、シェルスクリプトと言えど、複数の機能がある場合には関数にすべきです。

構文と簡単な例

構文は次の通りです。なお、先頭のfunctionは省略可能です。

function 《関数名》 () {
《処理》
..
}

早速、簡単な例を示します。

#!/bin/bash
function f1() {
   echo "Hello, World"
}

f1

これをtest.bashと言う名前で保存し実行します。

$ ./test.bash
Hello, World

様々な関数の呼び出し方

関数はファイルに書かなくても、コマンドプロンプト上で再定義してそのまま実行できます。

$ function f1() { echo "Hello, World"; }
$ f1
Hello, World

また、関数を別ファイルに定義しておき、sourceコマンドで呼び出してから実行するのも便利です。以下の例ではfunctions.libという関数定義ファイルを作って、呼び出して実行します。

$ cat functions.lib
function f1() {
echo "Hello, World"
}

$ source functions.lib
$ f1
Hello, World

関数の引数

引数を参照する場合の文法はbashのプログラム本体と同様、第1引数・第2引数・第3引数と順に$1,$2,$3・・・です。

  • $0 関数名
  • $1 第1引数
  • $2 第2引数
  • $3 第3引数
  • $N 第N引数
  • $* 第1引数以降の全ての引数
#!/bin/bash
function f2() {
   echo "$1,$2"
}

f2 "Hello" "World"

test2.bashという名前で保存し実行します。

$ test2.bash
Hello,World

関数の戻り値

戻り値を設定する場合はreturn文で値を指定します。

function 《関数名》 () {
《処理》
..
return 《戻り値》
}

以下に戻り値の設定し参照する例を示します。bashの言語制約で、戻り値には数字しか指定できません。この例では、引数として”error”の文言が指定されていた場合は戻り値1を返し、それ以外の場合は”Hellow,World”の文言と戻り値0を返ます。

function f3() {
   [ "$1" = "error" ] && return 1
   echo "Hello, World"
   return 0
}

この戻り値は$?で取得可能です。

$ f3
Hello, World
$ echo $?
0
$ f3 "error"
$ echo $?
1

関数内ではローカル変数を使う

構文

local 《変数名》=《値》

変数whoに注目してください。

function f4() {
local who="Japan"
echo "Hello, $who"
}

f1
echo $who

実行結果は次の通りです。

Hello, Japan

この例でwhoは関数f4()内のローカル変数ですから、関数の外には値を持ち出しません。
ローカル変数を使えば、関数内部の処理による影響を関数の外に与えないため、影響範囲を限定できます。

今回は以上です。参考になりましたら幸いです。

Blog TOP  シェルスクリプトを勉強したい人向け|bashの使い方 記事まとめ

bashの使い方 - もくじ

bashの使い方 - もくじ

シェルとは

 - シェルとは
 - シェルはOSと会話するための言語
 - シェルの種類(bash以外のシェル)
 - シェルスクリプトとは
 - シェルスクリプトの書き方

条件式

 - if else文
 - 文字列の比較
 - &&と||の使い方
 - case文

文字列操作

 - 文字列の連結
 - 文字列の一部を切り出す

繰り返し

 - for文
 - while文
 - while文でリストから1つ要素ずつ処理する

定数

 - 定数の定義

関数

 - 関数の定義

デバッグ

 - デバッグオプション(-x)

実行権限

 - 実行権限のないシェルスクリプトファイルを実行する

 - シェルスクリプトの書籍3選