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