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

Linux基礎:引数と終了ステータス

引数と終了ステータス

 シェルスクリプトを使うとき、単に一連のコマンドをまとめるだけでなく、引数 を受け取って動作を変えたり、終了ステータス を利用して処理の成功・失敗を判定することができます。

 引数を使えば、スクリプトを汎用的に利用でき、同じスクリプトでも状況に応じて異なる入力を与えて実行できます。また、終了ステータスを確認することで、エラー時の分岐処理や異常検出を実現できます。これらを理解することは、シェルスクリプトを効率的で実用的なものにするうえで欠かせません。

1.シェルスクリプトにおける引数

1.1. 引数の仕組み

シェルスクリプトに引数を与えると、その内容は特殊変数に格納されます。

特殊変数内容
$0スクリプト名
$11番目の引数
$22番目の引数
$#引数の個数
$@すべての引数(個別に展開)
$*すべての引数(1つの文字列として展開)

1.2. 引数を使った例

例: greet.sh

#!/bin/bash
echo "Hello, $1!"

実行例

[user@rocky9 ~]$ bash greet.sh Tanaka
Hello, Tanaka!

$1 に「Tanaka」が渡されているため、その内容が展開されています。

1.3. 複数の引数

#!/bin/bash
echo "1st: $1"
echo "2nd: $2"
echo "Total args: $#"

実行例

[user@rocky9 ~]$ bash greet.sh Rocky Linux
1st: Rocky
2nd: Linux
Total args: 2

複数の引数は順に $2, $3 … と参照できます。

2.終了ステータス

2.1. 終了ステータスとは

シェルがコマンドを実行するたびに、特殊変数 $? に数値が格納されます。

  • 0 … 正常終了(成功)
  • 0以外 … 異常終了(失敗)

これはプログラムの戻り値のようなもので、エラー判定に活用されます。

2.2. 正常終了の例

[user@rocky9 ~]$ ls /home/user
all_output.log    dummy3.bin           img1.jpg           sysinfo.log
backup.tar.gz     dummy_backup.tar.xz  img2.jpg           testvars.sh
(省略)

[user@rocky9 ~]$ echo $?
0

直前の ls が成功したため、終了ステータスは 0

2.3. エラー時の例

[user@rocky9 ~]$ ls /no_such_file
ls: '/no_such_file' にアクセスできません: そのようなファイルやディレクトリはありません

[user@rocky9 ~]$ echo $?
2

存在しないファイルを指定したため、終了ステータスは 2

3.引数と終了ステータスを組み合わせる

3.1. 条件分岐で利用

例: checkfile.sh

#!/bin/bash
ls $1 > /dev/null 2>&1
if [ $? -eq 0 ]; then
  echo "File $1 exists."
else
  echo "File $1 not found."
fi

実行例

[user@rocky9 ~]$ bash checkfile.sh /etc/passwd
File /etc/passwd exists.

[user@rocky9 ~]$ bash checkfile.sh /etc/xxxx
File /etc/xxxx not found.

3.2. checkfile.sh の解説

 この checkfile.sh のスクリプトは、引数で指定したファイルやディレクトリが存在するかどうかを確認し、その結果をメッセージとして表示する仕組みです。ポイントごとに解説します。

1. シバン行

#!/bin/bash
  • このスクリプトを bash で実行することを指定しています。

2. ls $1 > /dev/null 2>&1

  • $1 はシェルスクリプトに渡された 最初の引数 を意味します。
    例: ./checkfile.sh test.txt → $1 は test.txt。
  • ls $1 で指定されたファイルやディレクトリを一覧表示しようとします。
  • > /dev/null は 標準出力を捨てる(表示しない)リダイレクトです。
  • 2>&1 は 標準エラー出力(2)標準出力(1) にリダイレクトし、その標準出力も /dev/null に捨てます。
    → つまり、エラーや出力があっても 画面には何も表示されません

3. if [ $? -eq 0 ]; then

  • $? は 直前に実行したコマンドの終了ステータスを表します。
  • ls $1 が成功すれば 0、失敗すれば 0 以外 になります。
  • -eq 0 は「終了ステータスが 0(成功)」であるかどうかを確認しています。

4. 条件分岐

if [ $? -eq 0 ]; then
  echo "File $1 exists."
else
  echo "File $1 not found."
fi
  • 成功した場合(存在する場合) → File <名前> exists. と表示。
  • 失敗した場合(存在しない場合) → File <名前> not found. と表示。

3.3. exit コマンド

スクリプトの終了時に明示的に終了ステータスを指定できます。

exit 0   # 正常終了
exit 1   # 異常終了

4.関連するコマンドの書式とオプション

コマンド書式主なオプション説明
echoecho [文字列]-eエスケープシーケンスを解釈して表示
lsls [ファイル/ディレクトリ]-l詳細情報付きで表示
-a隠しファイルも含めて表示
exitexit [コード]なしスクリプトやシェルを終了し、終了ステータスを返す。

まとめ

  • シェルスクリプトはコマンドと同様に引数を受け取ることができ、特殊変数 $1, $2, $#, $@ などを利用して参照できる。
  • コマンドやスクリプトの実行結果は 終了ステータス($?) に数値で保存され、0 が成功、0以外 が失敗を意味する。
  • 引数と終了ステータスを組み合わせることで、柔軟な処理やエラーハンドリングが可能になる。
  • 実際のシステム管理や自動化スクリプトでは、これらを活用して信頼性の高いスクリプトを作成することが求められる。