第21回 関数と終了ステータスを組み合わせよう:returnとif文で使う方法 | はじめてのシェルスクリプト

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第21回 関数と終了ステータスを組み合わせよう:returnとif文で使う方法 | はじめてのシェルスクリプト

はじめてのシェルスクリプト | 第21回

目次

はじめに

この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。

第13回では処理をまとめる「関数」を、第10回ではコマンドの成功・失敗を表す「終了ステータス」を、それぞれ学びました。どちらもシェルスクリプトを実用的に書くための大切な仕組みです。

この2つを組み合わせると、「関数の処理が成功したか失敗したかを呼び出し元で判定する」という、より洗練されたスクリプトが書けます。echo で値を出力する方法との違いを正しく理解しておくことが重要です。

第21回では、関数の中で return を使って終了ステータスを返す方法と、それを if 文で活用するパターンを学びます。これを身につけると、再利用しやすく、エラー処理もしっかりしたスクリプトが書けるようになります。

この回で学ぶこと

  • 関数の終了ステータスとは何か
  • return の基本
  • 成功と失敗を 0 とそれ以外で扱うこと
  • 関数を if 文で使う形
  • 小さな判定関数の例
  • echo の出力と終了ステータスの違い
  • 初学者が混同しやすい点

関数の終了ステータスとは何か

関数も成功と失敗を返せる

シェルスクリプトでは、コマンドだけでなく関数にも終了ステータスがあります。

終了ステータスが 0 なら成功、0 以外なら失敗です。

return で終了ステータスを返す

関数の中では return を使って終了ステータスを返せます。

check_name() {
  return 0
}

この例では、check_name は成功として終了します。

サンプルコード

function_status_sample.sh に次の内容を保存します。

#!/bin/sh

check_answer() {
  if [ "$1" = "yes" ]; then
    return 0
  else
    return 1
  fi
}

if check_answer "yes"; then
  echo "成功です"
else
  echo "失敗です"
fi

実行手順

1. ファイルを作成して保存する

エディタで function_status_sample.sh という名前のファイルを作成し、次の内容を保存します。

#!/bin/sh

check_answer() {
  if [ "$1" = "yes" ]; then
    return 0
  else
    return 1
  fi
}

if check_answer "yes"; then
  echo "成功です"
else
  echo "失敗です"
fi

2. スクリプトを実行する

次のコマンドを実行します。

sh function_status_sample.sh

実行結果の例です。

成功です

if check_answer "no"; then のように変えると、実行結果は次のようになります。

失敗です

コードの読み方

return 0

関数を成功として終了しています。

if 文では、この 0 が「条件に合った」として扱われます。

return 1

関数を失敗として終了しています。

1 は失敗のひとつの例で、0 以外は失敗として扱われます。

if check_answer “yes”; then

関数をそのまま if 文の条件として使っています。

関数の終了ステータスが 0 なら then 側が実行されます。

echo と return の違い

echo は文字を表示するためのコマンドです。

一方で return は、関数が成功したか失敗したかを返すためのものです。

たとえば、次の関数は OK という文字を表示しますが、それ自体が成功判定の意味になるわけではありません。

show_message() {
  echo "OK"
  return 0
}

表示する内容と終了ステータスは別に考える必要があります。

小さな判定関数を作る

終了ステータスを使うと、「条件に合うかどうか」だけを判定する小さな関数を作りやすくなります。

is_admin() {
  if [ "$1" = "admin" ]; then
    return 0
  else
    return 1
  fi
}

このような関数は、if is_admin "$name"; then のように使えます。

初学者が混同しやすい点

return は文字列を返すものではない

シェルスクリプトの return は、主に終了ステータスを返します。

文字列を返したいときは、echo の出力やコマンド置換を使う考え方になります。

0 は成功である

普段の数値の感覚とは違い、シェルでは 0 が成功です。

ここを逆に覚えると分岐の意味が分からなくなりやすいです。

関数名の後ろに () を付けて呼ばない

定義では check_answer() { ... } と書きますが、呼び出すときは check_answer "yes" のように書きます。

よくあるエラー

if の結果が思った通りにならない

関数の中で return 0return 1 の使い分けが逆になっていないか確認してください。

文字列を返したつもりなのに使えない

return "OK" のような使い方はしません。

文字列を扱いたい場合は、出力として表示する方法を考えます。

呼び出し方が間違っている

関数を呼ぶときに check_answer() のように書いていないか確認してください。

呼び出しは関数名を書くだけです。

練習用コード

次の内容で user_check.sh を作成して実行してみてください。

#!/bin/sh

is_guest() {
  if [ "$1" = "guest" ]; then
    return 0
  else
    return 1
  fi
}

if is_guest "guest"; then
  echo "guest です"
else
  echo "guest ではありません"
fi

引数を変えて、成功と失敗の分岐がどう変わるか確認してください。

この回で理解しておくこと

  • 関数にも終了ステータスがある
  • return で終了ステータスを返せる
  • 0 は成功、0 以外は失敗である
  • 関数は if 文の条件としてそのまま使える
  • echo は表示、return は成功と失敗の通知である
  • 文字列を返す考え方と終了ステータスを返す考え方は別である

まとめ

今回は、関数と終了ステータスを組み合わせて、成功と失敗で処理を分ける基本を確認しました。

関数が判定専用の部品として使えるようになると、スクリプト全体を整理しやすくなります。

次回は、よく使うコマンドを組み合わせた実用例を作ります。

次回予告

次回は「よく使うコマンドを組み合わせた実用例を作ろう」です。

複数の基本コマンドを順番に使う小さな実用スクリプトを確認します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次