シェル変数
UNIXのシェル(UNIX以外の環境に移植されたものも含む)には、シェル変数という概念がある。 環境変数と類似しているが、シェル内で独自に保持しているものであり、シェル以外のプロセスには存在しない。 スクリプトファイル内でも、シェル変数を定義することができる。
またその変数を参照する場合は変数名の前に" $ "を付けることで参照できる。 変数名に使用できる文字は英数字および" _ "(アンダーバー)であり先頭は英字を使用しなくてはならない。
変数名="値"
この変数名と値の間の" = "の前後にスペースを入れてはならない。
(入れると、シェル変数への代入ではなく、コマンドの実行と判断される。)
また、設定する値に、空白やタブがある場合には、これをそのまま記述することはできない。
空白やタブはシェルにとって区切りを見分ける文字だからである。その場合は「"」「'」を用いる。
同一の値が複数ある場合は1つの変数を定義した方が修正も1箇所で済むので効率がよい。
シェル変数を削除するには、unsetコマンドを使う。
現在設定されているシェル変数を見るには、setコマンドを使う。
変数名(Variable Names)
The name of a variable can contain only letters ( a to z or A to Z), numbers ( 0 to 9) or the underscore character ( _).
変数定義(Defining Variables)
$ variable_name=variable_value
変数を使う(Accessing Values)
code:bash
NAME="Scrapbox Beaver"
echo $NAME
読み取り専用変数(Read-only Variables)
code:bash
NAME="Scrapbox Beaver"
readonly NAME
変数の削除(Unsetting Variables)
unset で削除できる
code:bash
NAME="Scrapbox Beaver"
unset NAME
echo $NAME
変数の種類(Variable Types)
引数を扱うシェル変数
$0
シェルスクリプトの名前(ファイル名)
$1(第1引数)~$9(第9引数)
この数字だけのシェル変数は、positional変数といってシェルが実行されたときの引数を保持している変数である。
C言語でいうところの、argvに相当する。
スクリプトの場合は$0がスクリプトファイル名、$1から順に第一引数、第二引数となる。
なお、この変数は、$9までしか用意されていないので、このままでは10個までしか引数が扱えないが、10個しか引数が指定できないわけではない。 同時に10個までしか参照できないだけである。
$# (シェルスクリプトの引数の数)
"$#"には、positional変数に設定されている引数の個数が設定されている。
C言語のargcとほぼ同じである。
ただし、C言語のargcが、argv0も含めているのに対して、この場合には$0 は含まれない。 shiftコマンドを使うと、値が1つ減少する。
$* $@ (シェルスクリプトの全ての引数)
どちらも、$1から始まるpositional変数に展開される。
ただし、引用符 '"' の中で用いたときには、展開方法が異なる。
"@"が用いられると、"$1"、"$2"、"$3"... と展開されるのに対して、"*"の場合には、"$1 $2 $3"... と展開される。
前者は、展開の結果が複数のワードとして扱われるのに対して、後者は1つのワードとして扱われることが違う。
特殊な変数
$?
最後に実行したコマンドが返したexit値が入っている。
$$
シェルのプロセスIDが入っている。
$!
シェルが最後に起動したバックグラウンドプロセスの、 プロセスIDが入っている。
$-
シェルが起動されたときに指定されたフラグ、 又はsetコマンドで設定されたフラグ値が入っている。
$PATH
シェルがコマンドを探すためのディレクトリを記述する。
複数のディレクトリは「」で区切って指定し、順番に検索されていく。
不用意に変更するとコマンドが実行されなくなるので注意が必要である。
$CDPATH
ユーザーがcdコマンドでディレクトリを変更するときにそのディレクトリ名がカレントディレクトリにない場合には、この変数に指定されているディレクトリにあるかどうか検索し、あればそのディレクトリに移動する。
スクリプト中で利用されることはほとんどない。
$USER
ユーザー名。
$HOME
ユーザーのホームディレクトリ。
$IFS
International Field Separator。 コマンドラインの区切り記号のリストを保持する変数。
通常は、空白、タブ、改行の3文字が入っている。
この変数は、positional変数や、readコマンドなどの挙動に影響するので、不用意に変更するとスクリプトが正しく動作しなくなる。
$LANG
使用する言語が入っている。
$TERM
使用している端末の種別名が入っている。
viなどのコマンドが正しい出力を生成する為には、使われている端末の種別を知る必要がある。