setはシェルの内部コマンドです。シェルのオプションを設定/解除する機能だ けでなく、1つのレコードからシェル変数 IFSで区切られたフィールド取り出し、 それを位置パラメータに代入する機能も持っています。
setによるシェルオプションの設定/解除機能は起動時にオプションをコマンド ラインで指定したのと等価です。 さらにスクリプト内の任意の位置でオプションの設定や解除ができますので スクリプトをデバッグするときに必要な部分だけの実行状態を監視することも できます。
位置パラメータへの代入機能は setの引数として与えられた文字列(レコード)から IFSを区切としてそれぞれのフィールドを切り出し、$1〜$9 に 格納します。この機能はユーザが位置パラメータに値を代入できる唯一の方法で、 シェルスクリプト内で多用されます。
$ set `date` ; echo $1を実行してみると メカニズムが良く分かると思います。 dateコマンドの出力が setに渡されています。シェルの IFSはホワイト スペース文字ですからdateコマンドの出力をスペースで区切って位置パラメータに 代入します。 dateコマンドの出力の第1フィールドは曜日を表していますので、それが位置パラ メータ $1に抜き出されているのがechoの出力で分かります。 また、この時に位置パラメータの数を表すシェル変数
$#
には setコマンド
で分解されたフィールド数が格納されています。これもechoで確認してみてください。
この代入が行われると古い位置パラメータの値は永久に失われてしまいます。
もし、あとで必要なものがあればユーザの責任で事前に退避しておかなければなりません。
setコマンドに引数を与えずに使うと、ユーザの環境内に存在するすべての変数 が表示されます。