シェルプログラミングTips

変数代入の=前後には空白を入れない

シェルスクリプトは汎用的なプログラミング言語とは異なり、コマンドを実行するという操作が処理の主眼にある。一見するとシェルスクリプトも汎用的なプログラミング言語のように見えるが、あくまでもそう見せているだけであって、汎用的なプログラミング言語というわけではない。

このため、JavaやC言語、PHPなどの汎用的なプログラミング言語からシェルスクリプトに移ってきた場合には、いくつかのシンタックスには理解しにくいところがある。特にシェルスクリプトビギナーが陥りがちで誤解しやすいシンタックスに変数代入がある。

CやJavaを使ってきたユーザは次のように変数代入を実施したくなるだろう。

i = 0;
j = 0;

これは次のようなエラーとして処理される。

$ i = 0;
i: not found
$ j = 0;
j: not found
$ 

シェルスクリプトはコマンドを実行することを前提としており、基本的に次のようなシンタックスを採用している。

コマンド 引数1 引数2 ...

このため、次の記述では、

i = 0;

iがコマンド、=が引数1、0が引数2として認識される。シェルでは1つ目の文字列が=を含んでいる場合に、それを変数代入として処理する仕組みになっている。このため、変数代入は=の前後には空白を入れずに次のように記述する。

i=0
j=0

行ごとに処理が実行されるので、区切りの;も省略できる。

変数代入はこうしたシンタックスの一例といえる。

今まで動作していたシェルスクリプトをタブや空白などで整形したつもりになっていたら、いつの間にかシェルスクリプトが動作しなくなっていた、という場合にはこうした変更が原因になっていることがある。

シェルスクリプトでは、一見制御構文に見える記述が実はコマンドによるものだっりするので、空白が入っているかどうかが意味が変わってくる。こうした例は他にもあるので、問題が発生した場合にはその記述方法がコマンドの指定方法に合っているかどうかを確認してみるとよい。

last modified: 2014-01-13 16:01:13