ここでは Linuxにおける function(関数) について、実務レベルでしっかりわかるように解説します。
function(関数)とは?
function(関数) は、シェルスクリプト内で何度も使える処理のまとまりを定義する仕組みです。
関数を使うことでスクリプトの再利用性や可読性を向上させられます。
基本構文
書き方①
関数名() {
コマンド
}
書き方②
function 関数名 {
コマンド
}
どちらでもOKですが、①がよく使われます。
しかし、関数であることを分かりやすくするために敢えて明示的に②を使うこともあります。
実行方法
関数名
実例
hello() {
echo “Hello Linux!”
}
hello
引数の受け取り
関数内では、スクリプトと同じように $1, $2, … で引数を受け取れます。
greet() {
echo “Hello, $1!”
}
greet “Taro” # Hello, Taro!
return と exit の違い
| コマンド | 役割 | スクリプトへの影響 |
|---|---|---|
return | 関数の終了 | 関数だけ終了(外へ戻る) |
exit | スクリプト終了 | スクリプト全体を終了してしまう! |
returnの使用例(ステータス返却)
check_file() {
[ -e “$1” ] && return 0 || return 1
}
check_file /etc/passwd && echo “存在する” || echo “存在しない”
0が成功、それ以外は失敗 が基本
ローカル変数を使う
Linuxのシェルスクリプトを書くとき、関数内で変数を定義する場合に スコープ(有効範囲) が問題になることがあります。local は、関数内でのみ有効な変数を作るためのキーワードです。これにより、外部のグローバル変数や他の関数への影響を避けられます。
基本的な local の使い方
myfunc() {
local message=”Hello, World!”
echo “Inside function: $message”
}
myfunc # 出力: Inside function: Hello, World!
echo $message # 出力なし(関数外では見えない)
ポイント
localを付けた変数は関数の外から参照できません。- 同じ名前のグローバル変数が存在しても上書きされません。
local のメリット
- グローバル変数との衝突を防ぐ
大規模スクリプトで同じ名前の変数を誤って上書きするリスクを減らせます。 - 関数の再利用性が高まる
ローカル変数を使うことで、他のスクリプトや関数に安全に組み込めます。 - メモリ管理の効率化
関数終了時に自動的に破棄されるため、不要な変数が残らずスクリプトが軽量化されます。
function + trapでクリーンなスクリプトに
trapコマンドはシェルスクリプトで シグナルを検知して特定の処理を実行するためのコマンドです。
trapコマンドについてはこちらの記事↓で説明してます。

使用例
一時ファイルの生成 + 終了時削除
#!/bin/bash
set -e #エラーで即終了
cleanup() {
local tmpfile=$(mktemp)
rm -f “$tmpfile”
}
trap cleanup EXIT
echo “一時ファイル: $tmpfile”
実務テンプレート(一例)
#!/bin/bash
set -Eeuo pipefail
cleanup() {
echo “終了処理中…”
}
run() {
echo “処理中…”
sleep 1
}
trap cleanup EXIT ERR INT
run
よく使う組み合わせ:
set -e→ エラーで即終了set -E→ 関数やサブシェルでも ERR トラップが発火する
set -Eを付けない場合、関数内で失敗しても ERR トラップは発火しません。set -u→ 未定義変数の使用防止set -x→ デバッグ表示set -o pipefail→ パイプ内の失敗検知
関数 -設計ベストプラクティス-
1.関数名は「動詞+目的語」で分かりやすく
❌ doit()
⭕ backup_files() / check_user_exists()
→ 何をする関数か一目でわかるように!
2.ローカル変数を使う(必須級)
my_func() {
local filename=”$1″ # ← グローバル汚染を防ぐ
…
}
→ 予期せぬ変数上書きバグを防ぐ
3.エラー時は return or exit ではなく、メッセージも出す
error() {
echo “[ERROR] $*” >&2
return 1
}
→ スクリプト全体終了が必要なら exit。
4.関数を小さく・一つの責務で
❌ 大量処理まとめ → 可読性が死ぬ
⭕ 必要分割 → 再利用とテストが簡単
5.set -Eeuo pipefail と trap 併用で堅牢に
set -Eeuo pipefail
trap “echo ‘エラー発生!'” ERR
→ エラー時にも後始末を行えて安全
6.関数はファイル先頭にまとめて記載する
#!/bin/bash
###関数定義(上の方)
…
###メイン処理
main() {
…
}
main “$@”
➡ 読む側が迷わない構造に
7.helpコメントを付ける(関数ドキュメンテーション)
#Usage: backup_files
#Copy src to dst with timestamp
backup_files() {
…
}

コメント