シェル変数のまとめ

覚えていられないシェル変数について書いておこう・

特殊変数

特殊変数一覧

変数 説明
$0〜$9 $0はコマンド名、以降$1,$2・・は第1,2引数に対応。
$* 引数全体。ダブルクオートで括ると、引数全体をダブルクオートで囲んだ状態となる。
$@ 引数全体。ダブルクオートで括ると、引数をそれぞれダブルクオートで囲んだ状態となる。
$# コマンドに渡された引数の数。$0に該当するコマンド自身は数に含まれない。
$? 直前に実行されたコマンドの終了ステータスがセットされる。
$$ 現在実行中のシェルのプロセスIDがセットされる。
$! バックグラウンドジョブのプロセスIDがセットされる。
$- シェルの起動時のフラグや、setコマンドにて設定したフラグの一覧がセットされる。

$?変数の使用例

直前に実行されたコマンドの終了ステータスがセットされ、慣例的に正常終了の場合は真(0)、異常終了の場合は偽(0以外)の値がセットされる。$?変数のチェックにより、コマンドの終了状態の判断が可能。


リネーム処理の正常終了の判断例

mv tmp.txt temp.txt
if [ $? -eq 0 ]; then
    echo "success !!"
fi

$@変数の使用例

位置パラメタに何の値もセットされていない場合、"$@" は null に、"$*" は "" に置き換わる。nullの場合はパラメタとして処理しないが、"" は何もないパラメタがある、として処理される。
以下のようにすると、あるシェルスクリプトに渡した引数を、まったくそのままの形で command に渡す。


引数をそのままの形で受け渡す例

command ${@+"$@"}

@に値が設定されていた場合"$@"、設定されていない場合何もしない。

$$変数の使用例

現在実行しているコマンドのプロセスIDがセットされ、プラットフォーム上で一意となる。
実行コマンドの一意IDを利用して、一時ファイルを作成できる。
以下の例では、一時ファイルにディレクトリ下に存在するファイルとシンボリックリンクのリストを一時ファイルに書き込んでいる。


一時ファイルの作成例

TEMP_FILE=/tmp/temp.$$

trap `rm -f /tmp/*.$$; exit 1`  1 2 3 15
find . \( -type f -o -type l \) -print | sort > $TEMP_FILE

$!変数の使用例

バックグラウンドジョブのプロセスIDがセットされる。
以下の例では、コマンドをバックグラウンドで実行し、その間に・・の別処理を行った後、先のバックグラウンドジョブの終了を待つ処理。


バックグラウンドジョブの終了待機

command &
・・・
wait $!