このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトの終了ステータス

シェルスクリプトの終了ステータス

 シェルスクリプトでは、通常のコマンドと同様に終了ステータスを返すことができます。終了ステータスは、シェルスクリプトやコマンドが正常に終了したかどうかを示す数値で、他のプログラムやスクリプトから呼び出された際に、その結果を判断するために使用されます。

 特に明示しなければ、シェルスクリプトの中で最後に実行したコマンドの終了ステータスが、シェルスクリプト全体の終了ステータスとなります。

シェルスクリプトの終了ステータスの基本

例:最後のコマンドの終了ステータスがスクリプトの終了ステータスになる

以下の内容のシェルスクリプトを考えます。

#!/bin/bash

コマンド1
コマンド2
コマンド3

 このスクリプトを実行すると、最後に実行された コマンド3 の終了ステータスが、スクリプト全体の終了ステータスとなります。

解説

  • シェルスクリプトは上から順にコマンドを実行します。
  • 最後のコマンドである コマンド3 の終了ステータスが、スクリプトの終了ステータスとして返されます。
  • 終了ステータスは特殊変数 $? で確認できます。

終了ステータスの確認方法

シェルスクリプト実行後に、終了ステータスを確認するには、直後に echo $? を実行します。

$ ./script.sh
(スクリプトの実行結果)

$ echo $?
(終了ステータスが表示される)

明示的に終了ステータスを指定する方法

シェルスクリプト内で終了ステータスを明示的に指定したい場合は、exit コマンドを使用します。

exit <終了ステータス>

exit コマンドを実行すると、スクリプトはその場で終了し、指定した終了ステータスを返します。

例:引数エラー時に終了ステータス1で終了する(exit-status.sh

スクリプトの作成

user01@ubuntu:~$ nano exit-status.sh

exit-status.sh の内容

#!/bin/bash

if [ -z "$1" ]; then  # 引数が指定されていない場合
    exit 1  # 終了ステータス1で終了
fi

ls "$1"

解説

  • if [ -z "$1" ]; then:コマンドライン引数 $1 が空(未指定)かを判定します。
  • exit 1:引数がない場合、終了ステータス 1 でスクリプトを終了します。
  • ls "$1":引数が指定されている場合、その引数を ls コマンドに渡して実行します。

実行権限の付与

user01@ubuntu:~$ chmod +x exit-status.sh

スクリプトの実行結果

引数を指定せずに実行した場合

user01@ubuntu:~$ ./exit-status.sh
user01@ubuntu:~$ echo $?
1

解説

  • 引数が指定されていないため、exit 1 が実行され、終了ステータスは 1 になります。

引数を指定して実行した場合

user01@ubuntu:~$ ./exit-status.sh /home
user01	user02
user01@ubuntu:~$ echo $?
0

解説

  • 引数に /home を指定すると、そのディレクトリの内容が表示され、終了ステータスは 0(正常終了)になります。

実用例:ファイルやディレクトリの概要を表示するスクリプト(file-summary.sh

このスクリプトは、コマンドライン引数で指定されたファイルやディレクトリの概要を表示します。

スクリプトの作成

user01@ubuntu:~$ nano file-summary.sh

file-summary.sh の内容

#!/bin/bash

path=$1  # コマンドライン引数からパスを取得

if [ -z "$path" ]; then
    echo "使用法: $0 <ファイルまたはディレクトリのパス>"
    exit 1
fi

if [ -d "$path" ]; then  # ディレクトリである場合
    echo "'$path' はディレクトリです。"
    echo "内容一覧:"
    ls "$path"
elif [ -f "$path" ]; then  # 通常ファイルである場合
    echo "'$path' は通常のファイルです。"
    echo "ファイルの先頭5行:"
    head -n 5 "$path"
else
    echo "'$path' は存在しないか、通常のファイルやディレクトリではありません。"
    exit 1
fi

解説

  • path=$1:コマンドライン引数からパスを取得します。
  • if [ -z "$path" ]; then:引数が指定されていない場合、使用法を表示して終了ステータス 1 で終了します。
  • [ -d "$path" ]$path がディレクトリであるかを判定します。
    ・ディレクトリの場合、その内容を表示します。
  • [ -f "$path" ]$path が通常ファイルであるかを判定します。
    ・ファイルの場合、先頭5行を表示します。
  • その他の場合、エラーメッセージを表示して終了ステータス 1 で終了します。

実行権限の付与

user01@ubuntu:~$ chmod +x file-summary.sh

スクリプトの実行例

ファイルを指定して実行

user01@ubuntu:~$ ./file-summary.sh /etc/passwd
'/etc/passwd' は通常のファイルです。
ファイルの先頭5行:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

解説

  • /etc/passwd は通常のファイルであり、その先頭5行が表示されます。

ディレクトリを指定して実行

user01@ubuntu:~$ ./file-summary.sh /home
'/home' はディレクトリです。
内容一覧:
user01	user02

解説

  • /home はディレクトリであり、その内容が表示されます。

存在しないパスを指定して実行

user01@ubuntu:~$ ./file-summary.sh /nonexistent
'/nonexistent' は存在しないか、通常のファイルやディレクトリではありません。
user01@ubuntu:~$ echo $?
1

解説

  • 指定したパスが存在しないため、エラーメッセージが表示され、終了ステータスは 1 になります。

ここで作成したスクリプトを削除します

user01@ubuntu:~$ rm exit-status.sh file-summary.sh

まとめ

  • シェルスクリプトの終了ステータスは、特に指定しなければスクリプト内で最後に実行したコマンドの終了ステータスになります。
  • exit コマンドを使用することで、終了ステータスを明示的に指定してスクリプトを終了できます。
  • エラー時にゼロ以外の終了ステータスを返すことで、他のプログラムやスクリプトから呼び出された際にエラー処理を行わせることが可能です。

これらの知識を活用して、シェルスクリプトの信頼性と再利用性を高めましょう。