シェルでtry~catch構文を実装

シェルでtry~catch構文を実装

シェルスクリプトには、直接的な try~catch 構文はありませんが、エラーハンドリングを模倣するために、いくつかの方法があります。
以下は、シェルスクリプトでエラー処理を実装するための一般的な手法です。

1. エラーコードのチェック

シェルスクリプトでは、コマンドの実行結果としてエラーコード(終了ステータス)を利用してエラーハンドリングを行います。
成功した場合、終了ステータスは 0 で、エラーが発生した場合は 0 以外の値が返されます。
以下はその例です。

#!/bin/bash

# コマンド1を実行し、成功したかどうかをチェック
command1
if [ $? -ne 0 ]; then
  echo "コマンド1が失敗しました。"
  exit 1
fi

# コマンド2を実行し、成功したかどうかをチェック
command2
if [ $? -ne 0 ]; then
  echo "コマンド2が失敗しました。"
  exit 1
fi

echo "すべてのコマンドが成功しました。"

ここで、$? は直前のコマンドの終了ステータスを示します。
コマンドが失敗した場合、エラーメッセージを表示してスクリプトを終了します。

2. trap コマンドを使ったエラーハンドリング

trap コマンドを使用して、スクリプトの実行中にエラーが発生した場合に実行するコマンドを設定することができます。
これにより、スクリプト全体でエラー処理を集中管理できます。

#!/bin/bash

# エラーハンドリング関数
error_handler() {
  echo "エラーが発生しました。終了ステータス: $?"
  exit 1
}

# エラーが発生した場合に error_handler 関数を呼び出す
trap 'error_handler' ERR

# コマンド1を実行
command1

# コマンド2を実行
command2

echo "すべてのコマンドが成功しました。"

この例では、ERR シグナルを trap コマンドで捕捉し、エラーが発生した場合に error_handler 関数が実行されるようにしています。

3. 関数内でのエラーハンドリング

関数内でエラー処理を行うこともできます。
以下のように、関数内でエラーが発生した場合にエラーメッセージを出力し、スクリプトの実行を続ける方法です。

#!/bin/bash

# エラーハンドリングを行う関数
my_function() {
  command1
  if [ $? -ne 0 ]; then
    echo "command1 failed in my_function"
    return 1
  fi

  command2
  if [ $? -ne 0 ]; then
    echo "command2 failed in my_function"
    return 1
  fi
}

# 関数を呼び出し、失敗した場合はエラーを表示
my_function
if [ $? -ne 0 ]; then
  echo "my_function failed"
  exit 1
fi

echo "my_function succeeded"

この方法では、関数内でエラーハンドリングを行い、関数が失敗した場合にはスクリプト全体に対してエラーを通知します。

これらの手法を組み合わせることで、シェルスクリプトでより柔軟なエラーハンドリングを実現できます。