特殊変数の一覧
| 特殊変数 | 意味 |
|---|---|
| $0 | スクリプト名 |
| $1 〜 $n | 引数(位置パラメータ) |
| $# | 引数の数 |
| $* | 全ての引数(一つの文字列として展開) |
| $@ | 全ての引数(個別に展開) |
| $? | 直前のコマンドの終了ステータス |
| $$ | 現在のプロセスのPID |
| $! | 直近のバックグラウンドプロセスのPID |
| $_ | 直前のコマンドの最後の引数 |
| $- | 現在のシェルオプション |
引数に関する特殊変数
スクリプト実行時の引数や、自身のスクリプト名を参照します。
# 1. 実行用のスクリプト (sample.sh) を作成
cat << 'EOF' > sample.sh
echo "スクリプト名 (\$0) : $0"
echo "第1引数 (\$1) : $1"
echo "引数の数 (\$#) : $#"
EOF
# 2. 作成したスクリプトを引数付きで実行
bash sample.sh りんご みかん バナナ
全ての引数 ($* と $@)
全ての引数をまとめて扱う変数です。引数にスペースが含まれる場合などの挙動を考慮すると、"$@" を使用することが推奨されます。
# 引数をセット(スペースを含む引数を1つ目にする)
set -- "ふじ りんご" "温州 みかん"
echo 'すべての引数を "$*" で展開'
for item in "$*"; do
echo "item: ${item}"
done
echo '------------------------------'
echo 'すべての引数を "$@" で展開'
for item in "$@"; do
echo "item: ${item}"
done
終了ステータス ($?)
直前に実行したコマンドの成否(成功=0, 失敗=0以外)が入ります。
# 成功するケース
ls /dev/null
echo "成功時のステータス: $?"
# 失敗するケース (存在しないディレクトリ)
ls /nonexistent
echo "失敗時のステータス: $?"
プロセスに関する特殊変数
自身のプロセスID ($$) や、バックグラウンド実行した直近のプロセスID ($!) です。
echo "自身のPID (\$\$) : $$"
# バックグラウンドで実行
sleep 1 &
echo "バックグラウンドのPID (\$!) : $!"
# 終了を待機
wait $!
echo "バックグラウンド終了後のステータス (\$?) : $?"
その他の便利な変数
直前のコマンドの最後の引数 ($_)
直前に実行したコマンドに渡された、最後の引数が入ります。
# 3つの引数を渡す
echo "りんご" "みかん" "バナナ" > /dev/null
# 最後の「バナナ」が入っている
echo "最後に渡した引数 : $_"
現在のシェルオプション ($-)
現在有効になっているオプション(set -e など)をアルファベットの羅列で表します。
| フラグ | 対応するオプション | 内容 |
|---|---|---|
| e | errexit | コマンドが失敗したときに直ちに終了する (set -e) |
| u | nounset | 未定義の変数を参照したときにエラーにする (set -u) |
| x | xtrace | 実行するコマンドを標準エラー出力に表示する (set -x) |
| i | interactive | インタラクティブ(対話型)シェルとして動作中 |
| h | hashing | コマンドの場所をハッシュテーブルに記憶する(デフォルト) |
| B | braceexpand | ブレース展開( {a,b} など)を有効にする(デフォルト) |
echo "1. 現在のオプション : $-"
# エラー時に終了するオプション (-e) を有効にしてみる
set -e
echo "2. set -e を有効後 : $-"
# オプションを戻す
set +e
echo "3. 元に戻した後 : $-"