特殊変数
Shell scriptでは、特殊変数は$から始まる文字列で表されます。
一覧を以下の表にまとめます。
文字 | 内容 | |
---|---|---|
コマンドライン引数 | $# | 引数の数 |
$0 | 実行中のシェルまたは実行中のファイル名 | |
$1,$2...,$9 | 引数の値 1〜9個目の引数まで取得可能 |
|
$@ | 全ての引数の値 | |
$* | ||
$_ | 直前に実行したコマンドの最後の引数の値 | ステータス | $? | 直前に実行したコマンドの終了ステータス |
プロセス | $$ | 実行中プロセスのPID |
$! | 直前に実行したプロセスのPID | |
オプション | $- | 実行中シェルのオプション |
$#
$#はスクリプトに渡された引数の個数になります。
#!/bin/bash
echo $#
./test.sh arg1 arg2 arg3 # 3
./test.sh arg1 arg2 arg3 arg4 arg5 # 5
$0
$0はスクリプト実行時にはスクリプト名になります。
#!/bin/bash
echo $0
./test.sh # test.sh
シェル実行時には実行中のシェル名になります。
# bashを使っている場合
echo $0 # -bash
$1〜$9
$1〜$9は引数の値になります。
10個目以降の引数値を取得することはできません。
#!/bin/bash
echo $1
echo $2
echo $3
./test.sh arg1 arg2 arg3
# arg1
# arg2
# arg3
$@と$*
$@と$*はともに全ての引数になります。
#!/bin/bash
echo $@
echo $*
./test.sh arg1 arg2 arg3
# arg1 arg2 arg3
# arg1 arg2 arg3
$@と$*の違いは全ての引数を結合するかどうかです。
#!/bin/bash
for i in "$@"
do
echo $i
done
for i in "$*"
do
echo $i
done
./test.sh
# arg1
# arg2
# arg1 arg2
$_
$_は直前に実行したコマンドの最後の引数になります。
#!/bin/bash
echo $1 $2 $3
./test.sh hoge1 hoge2 hoge3
# hoge1 hoge2 hoge3
echo $_
# hoge3
$?
$?は直前のコマンドの終了ステータスです。
成功は0、失敗はそれ以外です。
#!/bin/bash
rmdir testdir1 # コマンド成功:空のディレクトリ
echo $?
rmdir testdir2 # コマンド失敗:空でないディレクトリ
echo $?
./test.sh
# rmdir: testdir: Directory not empty
# 1
# 0
$$
$$は実行中プロセスのPIDになります。
#!/bin/bash
echo $$
ps | grep test.sh
./test.sh
# 58142
# 58142 ttys001 0:00.01 /bin/bash ./test.sh
$!
$!は直前に実行したプロセスのPIDになります。
PIDを取得したいプロセスはバックグラウンド実行する必要があります。
#!/bin/bash
ps | grep test.sh
./test.sh $
# 61518 ttys001 0:00.01 /bin/bash ./test.sh
# 61528 ttys001 0:00.00 grep test.sh
echo $!
# [1] + done ./test.sh
# 61518
$-
$-は実行中プロセスのオプションになります。
#!/bin/bash
echo $-
./test.sh
hB