本文へスキップ
BecomeCoder

シェルスクリプトコース · 第6章 関数と構造化 · レッスン25

関数 ― 処理に名前をつける

ブラウザで完結

導入

同じ3行を、スクリプトの中で4回書いている。そんなときは関数の出番です。名前を付けてまとめてしまえば、呼び出しは1行になり、直すときも1か所で済みます。

説明

関数は 名前() { … } で定義し、名前を書くだけで呼び出せます。

#!/bin/bash

log() {
  echo "[$(date +%H:%M:%S)] $1"
}

log "処理を開始します"
log "ファイルを読み込みました"
log "処理が完了しました"

書き方の決まりごと。

  • 名前() {() の中には何も書かない(引数はここでは宣言しない)
  • } で閉じる
  • 呼び出しはコマンドと同じlog "メッセージ" のように、括弧もカンマも使いません
  • 定義は呼び出しより前に書く(上から順に読まれるため)

引数の受け取り方は、スクリプト本体と同じ $1$2$# です。関数の中では、その関数に渡された値を指します。

flowchart LR
    A["log \"開始\" と書く"] --> B["log 関数の中へ"]
    B --> C["$1 = 開始"]
    C --> D["[10:23:45] 開始 を表示"]

「時刻つきでログを出す」ようなお決まりの処理は、関数にしておくと後から書式を変えるのが一瞬です。log() の中を1行直せば、呼び出している全箇所の書式が変わります。

関数名は snake_case(小文字とアンダースコア)が慣習です。check_filesend_alert のように、動詞から始めると読んだときに意図が伝わります。

やってみよう

スクリプトを実行して、3行すべてに時刻が付くことを確かめましょう。次に log() の中を echo "[LOG] $1" に書き換えて実行してください。1か所直しただけで3行すべての書式が変わる——これが関数のいちばんの価値です。

演習

log 関数を使って 準備が整いました というメッセージを出してください。

ヒント1を見る

関数は log "メッセージ" の形で呼びます。

ヒント2を見る

スクリプトの最後に log "準備が整いました" を足します。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。