はじめに
今回は Bash における関数について扱っていきます。
関数の基本的な使い方
関数とは
コード数が増加すると複雑化して、コードを理解するのに時間がかかる。
関数 を用いると、似た処理のコードを一つにまとめることができる。
- コードをまとめることで可読性が向上する
- 関数にすることで、別のプログラムからも同じ処理を呼び出せる
関数の定義
関数の定義は、以下の二つの方法を用いる
- function 関数名() { ... }
- 関数名() { ... }
# パターン1
function print_hello() {
echo "Hello"
}
# パターン2
print_hello() {
echo "Hello"
}
# 呼び出す場合
print_hello
関数作成の決まり
-
関数の定義は、小文字とアンダースコアを用いる
参照 - Google Style Guide
-
関数はファイルの上部に記述する
ただし、以下のものは関数よりもファイルの上部に記述してよい- #!/bin/bash
- 定数の設定
- set 文
-
複数関数を定義する場合、関数の間に関数以外の文を記述しない
あとで修正する場合に、コードが読みづらくなる
関数内で引数を用いる
引数を用いる場合も、Bash ファイルを実行するときと同じように \$1、\$2 を用いるとよい。
print_something() {
echo Hello ${1} # ${1} は第一引数
}
print_something Mars # Marsと画面上に表示される
print_something Jupiter # Jupiterと画面上に表示される
関数の返り値として数値を返す( return )
return を用いることで、関数実行後の返り値を指定できる。
$? で返り値を取得する。
my_function() {
echo "some result"
return 55 # 55を呼び出し元に返す
}
my_function # 関数の実行
echo ${?} # 55と表示される
名前空間
名前空間とは
プログラム上では、同じ名前の変数が存在しても一意に識別することができるように、空間ごとに変数の有効範囲が決められる。
これを 名前空間 という。
Bash では、『関数の中で変数に変更を加えた』 かつ 『関数外部に同名の変数が存在した』場合、関数外部の変数の値を書き換えてしまう
my_function() {
name="John" # nameをJohnに設定
}
name="Alen"
my_function # my_functionを呼び出す( nameがAlen → Johnに )
echo "${name}" # Johnと表示される
local でローカル変数として宣言
関数内で、変数が初めて出現したタイミングで local を記述すると、その変数はローカル変数として宣言され、関数内の名前空間だけ存在する変数になる。
変数の値を変えても外部には影響しないため、関数内で変数を利用する場合はなるべく local で宣言した方がよい。
my_function() {
local name="John"
echo "${name}"
}
name="Alen"
my_function # my_functionを呼び出す
echo "${name}" Alenと表示される( Johnに変更されない )
main による宣言
プログラムの開始を簡単に見つけるために、メインプログラムを一番下の関数としてメインと呼ばれる関数に入れます。
ファイル内の最後の非コメント行は、メインへの呼び出しである必要があります。
上記は、 Google Style Guide から抜粋したテキスト
このように定義することで、プログラムの最初の場所を見つけやすくする。
main() {
:
:
}
main "${@}" # 引数と一緒にmainを呼び出す
外部ファイルの呼び出し
シェルスクリプトを実行する際に、外部のファイルをライブラリ化して読み込むことが多くある。
. または source コマンドを用いる。
# パスの取得
path=$(realpath ${0})
basedir=$(dirname ${path})
# ファイル読み込み( test.sh 内で定義された関数を呼び出せるようになる )
source $basedir/libraries/test.sh
おわりに
今回は関数について勉強しました。
そこまで難しいことはないですね。