【bash/シェルスクリプト 】関数を定義して使うには
こんにちは。
普段はIT業界についてのブログを執筆してるエンジニアです。
» 参考:プログラマーの年収は200万円以下です【IT業界の残酷な成功法則】
» 参考:【一生使える本です】bashの解説書 厳選3選【おすすめ】
今回は、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の使い方 - もくじ
シェルとは
- シェルとは
- シェルはOSと会話するための言語
- シェルの種類(bash以外のシェル)
- シェルスクリプトとは
- シェルスクリプトの書き方条件式
- if else文
- 文字列の比較
- &&と||の使い方
- case文文字列操作
- 文字列の連結
- 文字列の一部を切り出す繰り返し
- for文
- while文
- while文でリストから1つ要素ずつ処理する定数
- 定数の定義
関数
- 関数の定義
デバッグ
実行権限
本