Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

特殊変数

Bashにはスクリプトの引数・プロセス情報・終了ステータスなどを参照するための特殊変数が用意されています。シェルスクリプトを書くうえで頻繁に使う変数ばかりです。

構文
# スクリプト名
echo $0

# 位置パラメータ(引数)
echo $1 $2 $3

# 全引数を参照
echo "$@"   # 各引数を独立した文字列として扱う
echo "$*"   # 全引数を1つの文字列として扱う

# 引数の個数
echo $#

# 直前のコマンドの終了ステータス
echo $?

# 現在のシェルの PID
echo $$

# 最後にバックグラウンドで起動したプロセスの PID
echo $!
特殊変数一覧
変数概要
$0スクリプトのファイル名(またはシェル名)です。
$1 〜 $9スクリプトに渡された1番目〜9番目の引数です。
${10} 以降10番目以降の引数は波括弧が必要です。
$@全引数を個別の文字列として展開します(ダブルクォートで保護できます)。
$*全引数を IFS で区切った1つの文字列として展開します。
$#引数の個数です。
$?直前のコマンドの終了ステータス(0=成功、1以上=失敗)です。
$$現在のシェルプロセスの PID です。
$!最後にバックグラウンドで実行したプロセスの PID です。
$_直前のコマンドの最後の引数です。
$LINENO現在実行中の行番号です。デバッグに便利です。
$FUNCNAME現在実行中の関数名の配列です。
$RANDOM参照するたびに 0〜32767 のランダムな整数を返します。
$SECONDSスクリプト起動からの経過秒数です。
サンプルコード

以下のスクリプトを『script.sh』として保存し、『./script.sh Hello World 3』と実行する例です。

スクリプトに渡された引数を参照します。

#!/bin/bash
echo "スクリプト名: $0"
echo "第1引数: $1"
echo "第2引数: $2"
echo "引数の個数: $#"
echo "全引数: $@"
スクリプト名: ./script.sh
第1引数: Hello
第2引数: World
引数の個数: 3
全引数: Hello World 3

引数が不足しているときにエラーメッセージを出して終了します。

if [ $# -lt 2 ]; then
    echo "使い方: $0 引数1 引数2" >&2
    exit 1
fi

『$?』で直前のコマンドの終了ステータスを確認します。0 は成功、1 以上は失敗です。

ls /nonexistent 2>/dev/null
echo "ls の終了ステータス: $?"

ls /tmp 2>/dev/null
echo "ls の終了ステータス: $?"
ls の終了ステータス: 2
ls の終了ステータス: 0

『$$』で現在のシェルの PID、『$!』でバックグラウンドプロセスの PID を取得します。

echo "現在の PID: $$"

sleep 10 &
echo "バックグラウンド PID: $!"
現在の PID: 12345
バックグラウンド PID: 12346

『$RANDOM』は参照するたびに 0〜32767 のランダムな整数を返します。

echo "ランダム: $RANDOM"
ランダム: 27483

『"$@"』と『"$*"』の違いです。スペースを含む引数で顕著に現れます。

args=("hello world" "foo")
for a in "${args[@]}"; do echo "[$a]"; done
for a in "${args[*]}"; do echo "[$a]"; done
[hello world]
[foo]
[hello world foo]
概要

『$?』は直前のコマンドの成否確認に必須です。ただし参照後すぐ上書きされるため、別変数に保存してから使うと安全です(例: ret=$?; if [ $ret -ne 0 ]; then ...)。

『"$@"』はダブルクォートで囲むとスペースを含む引数も安全に扱えます。スクリプトに渡された引数をそのまま別コマンドに渡すときは必ず "$@" を使ってください。

関数内での引数の扱いは 関数の引数と戻り値 を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。