Bashシェルスクリプト/変数

変数

変数とは、いろいろな異なった値を表現できる入れ物の事です。
たとえば、Xという変数があったとき、そのXは単なる入れ物でしかなく、
なかには「りんご」「120」「腹減った」などなんでも詰め込む事ができます。
なかに入っているものが、その変数の実態(値)です。
変数の作成は=の左に変数名を記述するだけでできます。
作成と同時に値を代入したい時は=の右にその値を指定します。
変数名として利用できる文字は英数字と_ですが、数字を変数名の先頭にすることはできません。
この場合

X="りんご"
X=120

といった感じです。

変数を作成する。

シェルスクリプト内ではどこでも変数を作成できます。

VAR=

こうするだけで、VARという変数が作成できます。
変数名は自由ですが、中に入れる値がどんなものなのかによって分かり易い名前にするのが普通です。
合計の値を入れる変数なら

SUM=

などとするのが良いと思います。

変数名に利用できる文字

変数名は基本的に自由に付けられますが、変数名にも多少のルールがあります。
空白(スペースやタブ)、'(シングルクォテーション)や、.(ドット),-(ハイフン)といった特殊文字は利用できないのです。
変数名の例

変数名として認識変数名として認識されない
HENSU001HENSU
HENSU_01HENSU-01
_88VariableVariable.88

変数に値を代入する。

変数へ代入する値は文字列です。
数値を代入しても全て文字列として処理されます。
値の代入には=と使いますが、その両脇に空白を入れてはいけません。
空白や特殊文字列を含む文字列を代入したい場合はクォーテーションやエスケープ文字を使います。
代入例:

変数VARに代入代入された文字列
VAR=abcabc
VAR="I am hungry."I am hungry.
VAR='I said "I'\''m hungry\!'I said "I'm hungry\!
VAR=1234512345
VAR="123 + 456"123 + 456
VAR= abcエラーとなり値は代入されない。

変数の値を、さらに別の変数に代入することも可能です。
変数VAR1に値abc
変数VAR2に値xyz

変数VAR_Aに代入変数VAR_Aに代入された文字列
VAR_A=$VAR1$VAR2abcxyz
VAR_A=123$VAR1123abc
VAR_A=${VAR2}123xyz123
VAR_A=$VAR2abcVAR2abcという変数を探すのでエラーとなる。

変数の値を参照する。

変数に代入された値は、変数名の前に$(ダラー)を付ける事で参照できます。
どこまでが変数名なのか明確にする場合は${}で変数名を囲みます。

■echoコマンドで値を参照する。

$ VAR1=abc
$ VAR2="123 xyz"
$ echo $VAR1 $VAR2
abc 123 xyz

■スペースで区切らなくても参照できます。

$ echo $VAR1$VAR2
abc123 xyz

■NGの例

$ echo $VAR1abc

この場合だと、変数VAR1abcの中身を参照する為、何も出力されません。
■表示できる場合

$ echo ${VAR1}abc
abcabc

これだと変数VAR1とabcを表示する事ができます。 ■スペースの前までが変数名

$ echo $VAR1 abc
abc abc

■.(ドット)の前までが変数名

$ echo $VAR1.c
abc.c

■/の前までが変数名

$ echo $VAR1/abc
abc/abc

パラメータ変数

スクリプトを作成するときにパラメータを取得できないと困ることがある.パラメータは以下の変数で表される.

$0         スクリプトの名前 
$#         渡されたパラメータの数 
$$         スクリプトのプロセスID 
$1,$2,...  スクリプトのパラメータ 
$*         全パラメータを表す一つの変数.各パラメータは$IFSで区切られる.ダブルクォートしないと,BASHに$0,$1,$2,....と展開される気がする(*は全ての文字列に一致する). 
$@         全パラメータを表す一つの変数.各パラメータは$IFSに関係なく(おそらくスペースで)区切られる.