パラメータとは、パラメータ展開で値に置き換えられるデータを言います。パラメータには位置パラメータ・特殊パラメータ・変数の三種類があります。
位置パラメータは 1 以上の自然数によって識別されるパラメータです。
例えば位置パラメータが三つある場合、それらは順に 1
, 2
, 3
という名称で識別されます。位置パラメータの個数は特殊パラメータ #
で取得できます。また全ての位置パラメータを表す特殊パラメータとして *
と @
があります。
位置パラメータは、シェルの起動時に、シェルのコマンドライン引数を元に初期化されます (起動時のコマンドライン引数参照)。引数のうち、位置パラメータの値として与えられたオペランドが順に一つずつ位置パラメータとなります。
シェルのコマンド実行中に関数が呼び出されるとき、位置パラメータはその関数の呼び出しに対する引数に変更されます。すなわち、関数の実行中は位置パラメータによって関数の引数を参照できます。関数呼び出しの直前の位置パラメータの値は保存されており、関数の実行が終了する際に元の値に戻ります。
位置パラメータは、set や shift などの組込みコマンドによって変更できます。
0
は位置パラメータとは見なされません (特殊パラメータの一つです)。
特殊パラメータは一文字の記号によって識別されるパラメータです。特殊パラメータにはユーザが明示的に値を代入することはできません。
Yash では以下の特殊パラメータが利用可能です。
0
#
$
-
?
!
*
IFS
が存在し、その値が空でない場合、各位置パラメータは変数 IFS
の値の最初の文字で区切られます。
IFS
が存在し、その値が空の場合、各位置パラメータは間に何も置かずに連結されます。
IFS
が存在しない場合、各位置パラメータは空白文字で区切られます。
@
*
と同様に現在の全ての位置パラメータを表します。ただし、このパラメータが二重引用符によるクォートの中で展開される場合の扱いがパラメータ *
と異なります。この場合、各位置パラメータは文字で区切られるのではなく、(クォートの内部であるにもかかわらず) 単語分割されます。また位置パラメータが一つもない場合、このパラメータは展開後の単語には残りません。
echo 1 "$@" 2
は echo、1、2 という三つの単語に展開されます。位置パラメータが 1
、2 2
、3
の三つのとき、コマンドライン echo "$@"
は echo、1、2 2、3 という四つの単語に展開され、コマンドライン echo "a$@b"
は echo、a1、2 2、3b という四つの単語に展開されます。
変数とはユーザが自由に代入可能なパラメータです。各変数は名前で区別され、ぞれぞれが文字列の値を持ちます。
変数の名前は、英数字と下線 (_
) から構成されます。ただし変数名の頭文字を数字にすることはできません。環境によってはこれ以外の文字も変数名に使用できます。
シェルが扱う変数のうち、エクスポートの対象となっているものは環境変数といいます。これらの変数はシェルが外部コマンドを起動する際に外部コマンドに渡されます。シェルが起動されたときにシェルを起動したプログラムから渡された変数は自動的に環境変数になります。
変数は、単純コマンドによって代入できます。また typeset 組込みコマンドなどでも変数に代入することができます。変数を削除するには unset 組込みコマンドを使います。
以下の名前の変数は、yash の実行において特別な意味を持っています。
CDPATH
COLUMNS
COMMAND_NOT_FOUND_HANDLER
DIRSTACK
ECHO_STYLE
ENV
FCEDIT
HANDLED
COMMAND_NOT_FOUND_HANDLER
変数の値が実行された後に、コマンドが見つからなかったことをエラーとするかどうかを指示します。単純コマンドの実行を参照。
HISTFILE
HISTRMDUP
1
のときは、履歴に追加されるコマンドが一つ前のコマンドと同じならばそれは削除されます。それより古い履歴のコマンドは、(履歴に追加されるコマンドと同じでも) 削除されません。もしこの変数の値が HISTSIZE
変数の値と同じなら、履歴の中で重複するコマンドはすべて削除されます。あるいはもしこの変数の値が 0
なら、重複する履歴は一切削除されません。
HISTSIZE
HOME
IFS
LANG
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MESSAGES
LC_MONETARY
LC_NUMERIC
LC_TIME
LC_CTYPE
変数の値はシェルの起動時にのみ反映されます。シェルの実行中にこの変数を変更してもシェルのロケールは変わりません (シェルが非 POSIX 準拠モードで対話モードの場合を除く)。
LINENO
LINES
MAIL
MAILCHECK
600
に初期化されます。
MAILPATH
NLSPATH
OLDPWD
OPTARG
OPTIND
1
に初期化されます。
PATH
PPID
PROMPT_COMMAND
eval -i "${PROMPT_COMMAND}"
というコマンドが実行されるのと同じです。
PS1
\$
に初期化されます。(POSIX 準拠モード なら実行ユーザ ID が 0 かどうかによって $
と #
のどちらか)
PS1R
PS1S
PS2
>
に初期化されます。
PS2R
PS1R
変数と同様ですが、プロンプトとして PS1
変数ではなく PS2
変数の値が使用されるときに使用されます。
PS2S
PS1S
変数と同様ですが、プロンプトとして PS1
変数ではなく PS2
変数の値が使用されるときに使用されます。
PS4
PS1
変数と同様に、バックスラッシュで始まる特殊な記法が利用できます。
+
に初期化されます。
PS4S
PS1S
変数と同様ですが、プロンプトとして PS1
変数が使用されるときではなく、トレース出力の際に PS4
変数の値が使用されるときに使用されます。この変数を使うとトレース出力のフォントの書式を変更することができます。
PWD
RANDOM
TERM
YASH_AFTER_CD
eval -i "${YASH_AFTER_CD}"
というコマンドが実行されるのと同じです。
YASH_LE_TIMEOUT
YASH_VERSION
配列とは、一つの変数に複数の値 (文字列) を持たせたものです。一つの配列の複数の値は位置パラメータと同様に 1 以上の自然数で識別されます。
配列は、単純コマンドによって代入できます。また array 組込みコマンドなどでも配列に代入することができます。配列を削除するには変数と同様に unset 組込みコマンドを使います。
配列を配列のままエクスポートすることはできません。配列をエクスポートしようとすると、配列の各値をコロンで区切って繋いだ一つの文字列の値を持つ変数としてエクスポートされます。
POSIX 準拠モードでは配列は使えません。