特殊変数($0, $#, $?, ...)

特殊変数の一覧

特殊変数意味
$0スクリプト名
$1 〜 $n引数(位置パラメータ)
$#引数の数
$*全ての引数(一つの文字列として展開)
$@全ての引数(個別に展開)
$?直前のコマンドの終了ステータス
$$現在のプロセスのPID
$!直近のバックグラウンドプロセスのPID
$_直前のコマンドの最後の引数
$-現在のシェルオプション

引数に関する特殊変数

スクリプト実行時の引数や、自身のスクリプト名を参照します。

code
# 1. 実行用のスクリプト (sample.sh) を作成
cat << 'EOF' > sample.sh
echo "スクリプト名 (\$0) : $0"
echo "第1引数     (\$1) : $1"
echo "引数の数    (\$#) : $#"
EOF

# 2. 作成したスクリプトを引数付きで実行
bash sample.sh りんご みかん バナナ
stdout
スクリプト名 ($0) : sample.sh
第1引数     ($1) : りんご
引数の数    ($#) : 3

全ての引数 ($* と $@)

全ての引数をまとめて扱う変数です。引数にスペースが含まれる場合などの挙動を考慮すると、"$@" を使用することが推奨されます。

code
# 引数をセット(スペースを含む引数を1つ目にする)
set -- "ふじ りんご" "温州 みかん"

echo 'すべての引数を "$*" で展開'
for item in "$*"; do
  echo "item: ${item}"
done

echo '------------------------------'
echo 'すべての引数を "$@" で展開'
for item in "$@"; do
  echo "item: ${item}"
done
stdout
すべての引数を "$*" で展開
item: ふじ りんご 温州 みかん
------------------------------
すべての引数を "$@" で展開
item: ふじ りんご
item: 温州 みかん

終了ステータス ($?)

直前に実行したコマンドの成否(成功=0, 失敗=0以外)が入ります。

code
# 成功するケース
ls /dev/null
echo "成功時のステータス: $?"

# 失敗するケース (存在しないディレクトリ)
ls /nonexistent
echo "失敗時のステータス: $?"
stdout
/dev/null
成功時のステータス: 0
失敗時のステータス: 2
stderr
cannot access '/nonexistent': No such file or directory

プロセスに関する特殊変数

自身のプロセスID ($$) や、バックグラウンド実行した直近のプロセスID ($!) です。

code
echo "自身のPID (\$\$) : $$"

# バックグラウンドで実行
sleep 1 &
echo "バックグラウンドのPID (\$!) : $!"

# 終了を待機
wait $!
echo "バックグラウンド終了後のステータス (\$?) : $?"
stdout
自身のPID ($$) : 1076
バックグラウンドのPID ($!) : 1079
バックグラウンド終了後のステータス ($?) : 0

その他の便利な変数

直前のコマンドの最後の引数 ($_)

直前に実行したコマンドに渡された、最後の引数が入ります。

code
# 3つの引数を渡す
echo "りんご" "みかん" "バナナ" > /dev/null

# 最後の「バナナ」が入っている
echo "最後に渡した引数 : $_"
stdout
最後に渡した引数 : バナナ

現在のシェルオプション ($-)

現在有効になっているオプション(set -e など)をアルファベットの羅列で表します。

フラグ対応するオプション内容
eerrexitコマンドが失敗したときに直ちに終了する (set -e)
unounset未定義の変数を参照したときにエラーにする (set -u)
xxtrace実行するコマンドを標準エラー出力に表示する (set -x)
iinteractiveインタラクティブ(対話型)シェルとして動作中
hhashingコマンドの場所をハッシュテーブルに記憶する(デフォルト)
Bbraceexpandブレース展開( {a,b} など)を有効にする(デフォルト)
code
echo "1. 現在のオプション : $-"

# エラー時に終了するオプション (-e) を有効にしてみる
set -e
echo "2. set -e を有効後  : $-"

# オプションを戻す
set +e
echo "3. 元に戻した後     : $-"
stdout
1. 現在のオプション : hB
2. set -e を有効後  : ehB
3. 元に戻した後     : hB