bashには自分で設定する変数や環境変数の他に特殊な変数があります。
ステータスコード$?でコマンドが正常終了したか判断
コマンドが正常に実行されたか?それとも異常終了したか?判断したい場合があると思います。
$?には直前に実行されたコマンドが
- 正常に終了したら「0」
- 異常終了したら「1」
が代入されます。
$ rm test.txt
$ echo "$?"
0. #正常にtest.txtが削除された
$ rm test.txt
$ echo "$?"
1. # test.txtがなかったなど、正常にコマンドが終了しなかった
シェルスクリプト実行時に渡した引数が入る$1,$2…$n
コマンド実行時のようにシェルスクリプトを実行するときにも引数を渡せます。
$ cat test.sh
#!/bin/bash
echo "$1"
echo "$2"
$ ./test.sh arg1 arg2
arg1
arg2
$0もありますが、これは上記とは別の意味で「スクリプトの名前」が入ります。
$ cat test.sh
#!/bin/bash
echo "$0"
$ ./test.sh arg1 arg2
./test.sh
引数全体を展開するには$*, $@を使います。
$ cat test.sh
#!/bin/bash
echo "$*"
echo "$@"
$ ./test.sh arg1 arg2
arg1 arg2
arg1 arg2
どちらも結果は同じように見えますが$*は全ての引数がひとまとまり(“$1 $2 “)で出力されているのに対して、ダブルクォートで囲った”$@”は一つずつの引数が一塊”$1”, “$2″になって出力されています。
クォートで囲われていない$*と$@は同じ意味です。
引数の数を表示する$#
コマンド、シェルスクリプト実行時につけられた引数の数を表示するには$#を使います。
$ cat test.sh
#!/bin/bash
echo "$#"
$ ./test.sh arg1 arg2
2
$$で実行コマンドのプロセスIDを表示する
“$$”実行したプロセスのプロセスIDを表示できます。
$ cat test.sh
#!/bin/bash
echo "$$"
$ ./test.sh
57149