Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bashで関数を書く方法|定義から呼び出しまで徹底解説

プログラミングとは、コンピュータに実行させたい手順、すなわちルーチンを定義する作業です。パン作りにたとえると分かりやすいでしょう。まず材料を一度リストアップして作業環境を整え、次にパンが焼き上がるまでの手順を記述していきます。プログラミングでもパン作りでも、いくつかの工程は異なるタイミングで繰り返し行う必要があります。たとえばパン作りなら、サワードウ種を育てる工程がこれにあたります。

STIR=100
SNOOZE=86400

function feed_culture {
  remove_from(pantry)
  add(flour, water)
  stir($STIR)
  sleep($SNOOZE)
}

その後の生地の捏ね(こね)や発酵も同じ考え方です。

KNEAD=600
SNOOZE=7200

function process_dough {
  remove_from(proofing_drawer)
  knead($KNEAD)
  return_to_drawer($SNOOZE)
}

関数とは何か

プログラミングにおいて、こうしたサブルーチンは関数として表現できます。関数はコードの重複を減らし、結果としてメンテナンスの手間を軽減してくれるため、プログラマにとって非常に重要な概念です。

先ほどのパン作りの例で言えば、発酵時間を変更したくなった場面を想像してください。関数を使っていれば、変数(サンプルコードではSNOOZE)の値か、生地を処理するサブルーチン内の値を1箇所修正するだけで済みます。コードベース全体から「生地が膨らむ」関連の記述を探し回る必要がなく、変更漏れの心配もありません。実際、値の修正漏れや、すべての該当箇所を一括置換しようとしたsedコマンドの失敗によって、多くのバグが発生してきました。

Bashでの関数の定義方法

Bashで関数を定義するのは簡単です。書いているスクリプトファイル内に直接記述してもよいですし、専用の別ファイルにまとめても構いません。関数を専用ファイルに保存しておけば、CやC++でライブラリをincludeするように、Pythonでモジュールをimportするように、sourceコマンドでスクリプトへ読み込めます。Bashの関数を作成するには、functionキーワードを使用します。

function foo {
# ここにコードを書く
}

引数を受け取る関数の例

次は、関数が引数を扱う様子を示すシンプルな例です(本来はもっと簡潔に書けますが、説明のためあえてこの形にしています)。

#!/usr/bin/env bash
ARG=$1

function mimic {
  if [[ -z $ARG ]]; then
    ARG='world'
  fi
  echo "hello $ARG"
}

mimic $ARG

実行結果は以下の通りです。

$ ./mimic
hello world
$ ./mimic everybody
hello everybody

関数は呼び出されて初めて実行される

スクリプトの最終行に注目してください。ここで関数を実行しています。これは初心者のスクリプト作者やプログラマがつまずきやすいポイントです。関数は自動的には実行されません。呼び出されるまで、関数は「実行される可能性のあるルーチン」として存在しているだけです。

関数を呼び出す行がなければ、関数は定義されただけで、決して実行されることはありません。

Bashを学び始めたばかりの方は、サンプルスクリプトの最終行を有効にした場合と、コメントアウトした場合の両方で実行してみてください。動作の違いがはっきりと確認できるはずです。

関数を活用する

関数は、シンプルなスクリプトであっても欠かせないプログラミング概念です。関数に慣れておくほど、宣言的なコマンドの羅列だけでは対応しきれない複雑な問題に直面したときに役立ちます。さらに、汎用的な関数を別ファイルにまとめておけば、よく使うルーチンの資産が蓄積され、プロジェクトをまたいで再利用できるため、作業効率も大きく向上します。自分のスクリプトの書き方を見直して、関数を取り入れられる場所を探してみてください。

  1. Linuxでカスタムシェル関数とライブラリを作成・活用する方法

    Linuxにおいて、シェルスクリプトはシステム管理タスクの実行や自動化、簡単なコマンドラインツールの作成など、さまざまな場面で役立ちます。本記事では、Linux初心者の方に向けて、独自のシェルスクリプトを保存すべき信頼性の高い場所、カスタムシェル関数やライブラリの書き方、そして他のスクリプトからライブラリ内の関数を呼び出す方法について解説します。 シェルスクリプトの保存場所 スクリプトを実行するときに毎回フルパス(絶対パス)を入力せずに済むようにするには、そのスクリプトを $PATH 環境変数に含まれるいずれかのディレクトリに保存しておく必要があります。 現在の $PATH の内容は、以下のコ

  2. Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル

    Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の