シェルスクリプトに挑戦しよう(13)制御構文[その5]――forによる繰り返し処理(3):“応用力”をつけるためのLinux再入門(33)
今回も「for文」を解説します。for文では、「算術演算子」を使うことで、回数を指定して繰り返し実行することもできます。
forの基礎構文(2)――回数の処理
for文では、回数を指定した処理は「for ((i=1; i<=10; i++)) do 〜 done」のように書くことができます(※)。「((」と「))」の間に書かれている箇所は、それぞれ「変数iに1を入れる」「iが10以下の間繰り返す」「iは1ずつ増やす」という意味です。
【※】この書き方は、bashでは使用できますが、bashの前身である「sh」では使用できません。shで同じような繰り返し処理を行いたい場合は、この後取り上げる「while文」を使用します。
「(( ))」の部分は「算術式」として扱われます。四則演算や増減、大小の比較などが可能です。基本的な書き方で動作を確認してみましょう。
for ((式1; 式2; 式3)) #式1を実行した後、式3が成立するまでの間繰り返す do コマンド #(doneの直前に式2を実行してforの先頭に戻る) done
#! /bin/bash for ((i=1; i<=10; i++)) do echo "$i" done
$ chmod +x fortest $ ./fortest 1 2 3 4 5 6 7 8 9 10
●算術式の活用
「for ((式1; 式2; 式3))」の各ブロックでは、「,」で区切ることで複数の式を書くことができます。また、「(( ))」を使った算術式は、for以外の所でも使用できます。
それぞれ、以下のスクリプトで試してみましょう。
#! /bin/bash for ((i=1, j=1; i <= 10; i++, j+=2)) #(1)〜(3) do ((sum=i+j)) #(4) echo $i + $j = $sum #(5) done
最初に、変数iと変数jにそれぞれ「1」を入れています(1)。繰り返しの条件は“iが10以下である間”です(2)。そして、繰り返すごとにiは1ずつ増加させ、jは2ずつ増加させています(3)。
この繰り返しの間、変数sumに「i足すj」の結果を保存して(4)、echoコマンドで「変数iの値 + 変数jの値 = 変数sumの値」を表示しています(5)。
このスクリプトを実行すると、以下のようになります。
$ ./fortest 1 + 1 = 2 2 + 3 = 5 3 + 5 = 8 4 + 7 = 11 5 + 9 = 14 6 + 11 = 17 7 + 13 = 20 8 + 15 = 23 9 + 17 = 26 10 + 19 = 29
なお、この「((〜))」の部分は、「let」コマンドで書くこともできます。letコマンドは、bashのビルトインコマンドです。
例えば、「((sum=i+j))」は「let sum2=i+j」のように記述できます。
#! /bin/bash for ((i=1, j=1; i <= 10; i++, j+=2)) do let sum2=i+j echo $i + $j = $sum done
また、本連載第24回で「expr」コマンドを使って計算していた箇所を、「(( ))」およびletコマンドで書くと以下のようになります。
#! /bin/bash str1="100" str2="200" ((sum1=str1+str2)) echo $sum1 let sum2=str1+str2 echo $sum2
$ chmod +x calcvar2 $ ./calcvar2 300 300
算術式で使える演算子
「((〜))」の中で書く算術式では、以下の表の演算子が使用できます。なお、表中では演算式の前後に空白を入れていますが、この空白は入れても入れなくても構いません。例えば、「i=j+3」のように書くことも、「i = j + 3」のように書くことも可能です。
なお、計算できるのは整数のみで、割り算の結果も整数となります。実数の計算が必要な場合は「bc」コマンドを使うとよいでしょう。
演算子 | 意味 |
---|---|
変数++ | 変数の値を1増やす(インクリメント) |
変数-- | 変数の値を1減らす(デクリメント) |
** | 累乗 |
* | 乗算 |
/ | 除算(割り算) |
% | 剰余(余り) |
+ | 加算 |
- | 減算 |
※「++変数」「--変数」という書き方も可能です |
演算子 | 意味 |
---|---|
数1 <= 数2 | 数1が数2と同じか小さければTRUE |
数1 >= 数2 | 数1が数2と同じか大きければTRUE |
数1 < 数2 | 数1が数2より小さければTRUE |
数1 > 数2 | 数1が数2より大きければTRUE |
数1 == 数2 | 数1と数2が同じであればTRUE |
数1 != 数2 | 数1と数2が同じでなければTRUE |
演算子 | 意味 |
---|---|
変数 = 数1 | 変数に数1を代入する |
変数 *= 数1 | 変数に数1を掛けてその結果を代入する |
変数 /= 数1 | 変数にその変数を数1で割った結果を代入する |
変数 %= 数1 | 変数にその変数を数1で割った余りを代入する |
変数 += 数1 | 変数に数1を加算して代入する |
変数 -= 数1 | 変数に数1を減算して代入する |
筆者紹介
西村 めぐみ(にしむら めぐみ)
もともとはDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの“PCヘルパー”やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.