シェルスクリプトで変数の値をインクリメントするときの書き方を紹介したいと思います。変数の値をインクリメントするとは、変数の値を1増加させることを言います。使う場面も多いので知っておいて損はありません。
exprコマンドを使う方法
#!/bin/sh i=0 while [ $i -lt 10 ] do echo $i; i=`expr $i + 1` done
この例で変数の値をインクリメントしているのは次の部分です。
i=`expr $i + 1`
exprコマンドで変数iに1を加算して、その結果を再び変数iへ代入しています。
Bourne Shell(sh)でシェルスクリプトを書く場合、Bourne Shellに四則演算の機能はないので、この書き方が一般的だと思います。exprコマンドが提供されていれば実行できるので汎用性(移植性)が高い書き方と思われます。
Bashの算術式展開を使う方法
#!/bin/bash for i in {0..9} do echo $((i++)); done
この例でインクリメントを実行しているのは次の部分です。
$((i++));
$((...))はBashの算術式展開の記法です。$((...))に囲まれた算術式を評価して、その結果に置き換えます。算術式展開ではC言語と同じ演算子が使えますので、C言語ではおなじみの++演算子を使えます。また、算術式展開の中では変数の前の$を省略することもできます。
ここでは++演算子を後置で使っています。後置の場合は$((i++))の部分はiの値で置き換えられた後、iをインクリメントします。++演算子を前置で使った場合は、iをインクリメントした後の値で置き換えられます。
次の例は後置した場合と前置した場合の動作の違いを示しています。
$ i=0 $ echo $((i++)) $i 0 1 $ echo $((++i)) $i 2 2
先ほどの例も++演算子を前置に変えて実行してみてください。0から9ではなく1から10を表示するようになります。
2つの方法を紹介しましたが、どちらも使える場合は好きな方を使えば良いでしょう。ただし、1つ目の方法の実行速度は遅いらしいので、実行速度を気にする場合は2番目の書き方の方が良さそうです。