位置パラメータ
よく使われるものは大きく分けて3つです。
以下のスクリプトを例にして解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash echo $0 echo $1 echo $2 echo $3 echo $@ for var in $@ do echo $var done |
$0
実行するスクリプトファイル名を格納しています。
1 2 3 4 5 6 7 8 9 |
sh args.sh 1 2 3 args.sh # <= $0 1 2 3 1 2 3 1 2 3 |
実行しているファイル名を利用する処理で使えそうです。
$n(n>=1の整数)
引数に渡した変数を格納しています。
1 2 3 4 5 6 7 8 9 |
sh args.sh 1 2 3 args.sh 1 # <= $1 2 # <= $2 3 # <= $3 1 2 3 1 2 3 |
ほとんどのプログラム言語と同じく実行時にスペース区切りで引数を渡せるようになっています。
$@
引数に渡した変数をまとめて配列にして格納しています。
格納したデータリストはfor文などで取り出すことができます。
1 2 3 4 5 6 7 8 9 |
sh args.sh 1 2 3 args.sh 1 2 3 1 2 3 # <= $@ 1 2 3 |
特殊パラメータ
プログラム実行時に渡す引数を格納する以外にも自動的に値が設定されるのが特殊パラメータです。
代表的なのは以下の4つです。
$#
引数の個数を格納します。
1 2 3 4 5 6 7 |
#!/bin/bash arg_num=$# if [ $arg_num -ne 4 ]; then echo "引数は4つにしてください" fi |
1 2 |
$ sh arg#.sh 1 2 3 引数は4つにしてください |
$?
直前に実行したコマンドの終了コードを格納しています。
終了コードは
成功時:0
失敗時:1以上の整数
となっています。
1 2 3 4 |
$ cd /hogehoge bash: cd: /hogehoge: No such file or directory $ echo $? 1 # <= 失敗している |
$$
実行しているシェルのプロセスIDを格納しています。
シェルスクリプトは実行するたびにそれぞれ別のプロセスIDが割り振られます。
そのため、一時ファイル生成の時に利用できます。
1 2 3 4 5 |
$#!/bin/bash echo $$ touch /tmp/test_file$$ |
1 2 3 4 5 6 7 8 |
$ sh pid.sh 3230 $ ls /tmp/ test_file3230 # <= PID=3230の時のファイル $ sh pid.sh 3233 $ ls /tmp test_file3230 test_file3233 # <= 新しいPID=3233のファイルが作成された |
$!
バックグラウンドで実行している直前のプロセスIDを格納しています。
バックグランド実行とは
通常の直前のコマンドが実行が終了したタイミングを合わせて実行するのが同期実行ですが、
バックグラウンド実行では処理の終了のタイミングを待たずに次の処理に進むことができます。
メール送信やファイルアップロードといった時間がかかりそうな処理はバックグラウンド実行で行われることが多い印象です。
例えば、以下のコマンドは実行して10秒間はsleepコマンドによってターミナルで他の操作を行うことができませんが
1 |
$ sleep 10; echo "hoge"; |
以下のように&
をつけて実行することでバックグラウンド実行ができ、ターミナルで他の操作を受け付けることができます。(10秒後に"hoge"と出力されます)
1 2 |
$ (sleep 10; echo "hoge";) & [1] 3243 |
このようなバックグランドで走らせたプロセスIDを取得することができるのが$!
の役割です。
1 2 3 4 |
$ (sleep 10; echo "hoge";) & [1] 3246 $ echo $! 3246 |
まとめ
- 位置パラメータ(
$0
,$n(n>=1の整数)
,$@
)はプログラムの実行ファイル名や引数を格納している - 特殊パラメータ(
$#
,$$
,$?
,$!
ではプログラム実行時の引数の数やプロセスIDを格納している - コマンドに
&
をつけることでバックグランド実行になる