【Linux】シェルスクリプトの関数の使い方!一通りまとめ

シェルスクリプトの関数
  • このエントリーをはてなブックマークに追加
  • Pocket

プログラミングをやったことがある人にはお馴染みだろうが、シェルスクリプトでも関数を作ることができる。

関数とは処理をまとめて、何度も使えるようにしたものだ。

シェルスクリプトは、もともとあまり複雑なプログラムを組むのに適してはいないが、関数を少し使って効率良く作成するくらいであれば構わないだろう。

このページでは関数の使い方についてご紹介する。参考にしてほしい。

簡単に関数とは?

簡潔にいえば「処理をまとめたものが関数」である。中学校のとき習った次のような関数と同じだ。

y = 2x

xに何かを代入したら、yの値も決まる。

基本的に「引数を受け取り、それを処理し結果を返す」というのが役割である。とはいえ、引数を受け取らなくても動く関数もあるので、同じ動作を何度も書かないでしてくれる便利な方法だと思っておけばいい。

関数を使用すると同じ処理をするコードを繰り返し記述する必要がなくなるのである。

書式について

次のような書式になる。

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

もしくは「function」を省略して

関数名 () {
    処理...
}

とすることが出来る。関数を使うには、

関数名 引数

で使うことができる。

実際にやってみよう

書式をみせられてもピンとこないだろうと思うので実際に書いてみよう。

vi func-ex1.sh

実行結果

$ ./func-ex1.sh

関数の基本

関数の使い方の詳しいところ

関数の引数とパラメータ

関数の場合引数を受け取る場合も多々ある。関数の機能によっては引数をとらないこともあるが、以下の様にすると引数のパラメータを確認できる。基本的にスクリプト実行時のパラメータと使い方は同じである。

vi func-ex2.sh

実行結果

$ ./func-ex2.sh

func-ex2

戻り値について

bashシェルスクリプトには「戻り値」というものは基本的に存在しない。

解決策として関数やコマンドの「実行結果を直接変数に代入する」という手段をとることになる。「return」コマンドは存在するが、あくまで終了ステータスをかえしているだけで、関数の戻り値としての機能ではないので注意しよう。

vi func-ex3.sh

実行結果

$ ./func-ex3.sh

func-ex3

変数の範囲

基本的にbashは指定しない限り、変数はグローバルなものとして扱われる。「グローバル変数」とはどこからでも参照出来る変数のことだ。下記の例をみていただきたい。

vi func-ex4.sh

実行結果

$ ./func-ex4.sh

func-ex4

このようにtestfunc1の内部で宣言した変数が特殊なことなしにtestfunc2で参照できる、その他の場所からでもechoで参照できる。

現在一般的なコンピュータ言語とくらべるとその挙動はルーズなものかもしれないが、bashはインタプリタでありシェルである。機能上、環境変数などをグローバルに参照しなければならない。こういった作りのほうが都合がよいことが多いのだろう。

では「関数内だけのローカル変数は作成できないのか?」というと、ちゃんと仕組みは用意されている。「local」というビルドインコマンドを使用するとローカル変数を作成できる。

vi func-ex5.sh

実行結果

$ ./func-ex5.sh

func-ex5

このように「local」を使用すると関数内部だけで使用する変数を作成できる。

小さなスクリプトならばグローバル変数だけでも問題にはなりにくいが、規模が大きくなると「どこで変数の値が変化するのかわからなくなる」という状態が発生する。

そのため大きめのスクリプトを記述する時や、意図的に変数ローカルにし外部からの変更を受付ないようにする、といった状況で使用するといいだろう。

複数のファイルに分割して記述する

ファイルを分割して管理するほど、大規模になるとシェルスクリプトではなく他の本格的なコンピュータ言語による実装を考えた方がよいと思われるが、出来ないという訳ではない。例えば以下のようになる。

vi myfunc_rsq.func

vi func-ex6.sh

実行結果

$ ./func-ex6.sh

func-ex6

ここで重要なのは「.」である。

この「ドットコマンド」は他のスクリプトファイルを現在のカレントシェルに読み込み、変数や関数を使用出来るようにするコマンドだ。

これを活用することで、個々の断片的なスクリプトを取りこむことが出来るようになる。

まとめ

シェルスクリプトの関数についてまとめてきたが、いかがだっただろうか?

冒頭でもお伝えした通り、シェルスクリプトで大規模なプログラムを組むのはオススメしない。関数を少し使うくらいで止めておいたほうがいいだろう。

とはいえ、関数であれば使う場面は多いので、この機会に使い方は覚えてしまおう。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できます。

IT講師に興味はありませんか?

・「今までIT講師をやってきたが、更に多くの講義を行いたい」

・「エンジニアとしてやってきたが講師業に魅力を感じている」

・「講師として活躍するためにベースとなる知識を知りたい」

・「様々な分野や言語の講師にチャレンジしてみたい」


という方はぜひIT講師募集のページをご覧ください。


リスキルテクノロジーでは「受講している方々にITを好きになってもらう」ことを目標に、同じ目標に向かって歩んで行ける講師の方を常に探しています。


システム開発やインフラ構築などのエンジニアリング経験を活かし、新入社員などの未経験者や経験の浅い初学者の方々に対してITトレーニングを行っていただくことになります。


テキストやカリキュラムは事前に用意されており、それらを元に講義を進めていくため、IT講師をはじめて実施する方でも安心してトレーニングを実施できます。


IT講師募集のページを見る

SNSでもご購読できます。

コメント

  1. HS より:

    「複数のファイルに分割して記述する」で紹介されているfunc-ex6.shのリストですが、これは正しいのでしょうか。
    実際に打ち込んで走らせてみると、エラーが出てしまいます。
    3行目の. myfunc.funcを. myfunc_rsq.funcと、読み込むファイル名を略すことなく打ち込むと、そこで正常に動きます。

HS へ返信する コメントをキャンセル

*

未経験からの育成制度も充実
IT講師に興味はありませんか?

リスキルテクノロジーでIT講師の積極募集を開始! 経験・未経験問わずご応募可能。育成制度で講師スキル向上も目指せます

IT講師に応募する