while制御構文

プログラミング言語としてPowerShell Coreを使う場合に欠かせない機能が繰り返し構文だ。繰り返し構文はプログラミング的な処理の基本の一つと言える。

今回はPowerShell Coreの中でももっともシンプルなwhile制御構文を取り上げる。while制御構文は条件に一致する限りブロックの中の処理を繰り返すというもので、基本的に次のような書き方をする。

while制御構文

while (条件) {
    処理
}

PowerShellではfor制御構文やforeach制御構文といった繰り返し制御構文が用意されている。whileはそうした制御構文の中でもっともシンプルで、もっとも応用の幅の広い機能となっている。シンプルな例を通じてwhile制御構文の書き方を追ってみよう。

while制御構文の使い方

「while (条件)」で指定する条件はif制御構文のときと同じような条件だ。if制御構文のときに紹介した条件は次のとおり。

演算子 内容
-eq 等価
-ne 等価ではない
-gt よりも大きい 
-ge よりも大きいまたは等しい
-lt よりは少ない
-le よりは少ないまたは等しい
-like ワイルドカードパターンに一致する
-notlike ワイルドカードパターンに一致しない
-match 正規表現パターンに一致する
-notmatch 正規表現パターンに一致しない
-contains 参照値がコレクションに含まれている
-notcontains 参照値がコレクションに含まれていない
-in テスト値がコレクションに含まれている
-notin テスト値がコレクションに含まれていない
-is 同じオブジェクト型である
-isnot 同じオブジェクト型ではない

メジャーなプログラミング言語の条件に慣れていると、この書き方は違和感を抱くと思う。==ではなく-eqだし、>ではなく-gtだ。しかし、/bin/shなどのシェルスクリプトではtestコマンドまたは[コマンドで条件を指定し、そこでは-eqや-gtといった指定をする。コマンドに与えるオプションといった位置づけで比較していると考えるとわかりやすいかもしれない。このあたりは慣れなので、使っていけば気にならなくなると思う。

この比較演算子を使って実際にwhile制御構文を動かしてみよう。次の処理では、変数iの値が10よりも小さいという条件を満たす限り、変数iの値に1を加算するといった内容になっている。もっともシンプルなwhile制御構文の使い方だ。いずれは条件を満たさなくなり、繰り返し処理は終了となる。

while制御構文の実行例

PS /Users/daichi> $i=0
PS /Users/daichi> while ($i -lt 10)
>> {
>>     Write-Host $i
>>     $i++
>> }
0
1
2
3
4
5
6
7
8
9
PS /Users/daichi>

次の例はwhile制御構文の中でbreakを使っている。switch制御構文のときにbreakを取り上げたが、ここでも同じような動きをする。while制御構文の中でbreakを実行すると、そこで繰り返しは終了となり、while制御構文を抜けるようになる。特定の条件に一致したら繰り返しを抜けたいといった場合に利用する。

breakを使ったwhile制御構文の実行例

PS /Users/daichi> $i=0
PS /Users/daichi> while ($i -lt 10)
>> {
>>     Write-Host $i
>>     if ($i -eq 5) {
>>         break;
>>     }
>>     $i++
>> }
0
1
2
3
4
5
PS /Users/daichi>

次の例はwhile制御構文の条件に1を指定することで無限ループを構築し、内部でif制御構文を使って条件判定を行ってcontinueまたはbreakに処理を切り分けている。continueはループの先頭に戻るという処理で、breakはループから抜けるという処理だ。

continueでループの先頭に戻っているため、$i+=100という処理に到達していないことがわかるだろうか。continueとbreakは繰り返し処理におけるジャンプ的な機能として使われることが多い。うまく利用するとソースコードをスッキリと書くことができる。

break、continue、無限ループを使ったwhile制御構文の実行例

PS /Users/daichi> $i=0
PS /Users/daichi> while (1)
>> {
>>     Write-Host $i
>>     if ($i -lt 10) {
>>         $i++
>>         continue
>>     }
>>     else {
>>         break
>>     }
>>
>>     $i+=100
>> }
0
1
2
3
4
5
6
7
8
9
10
PS /Users/daichi>

while制御構文の基本的な機能はこんなところだ。特にbreakの使い方は覚えておきたい。必要な条件に到達したらbreakを実行してループを抜けるというのは繰り返し構文でよく利用する処理だし、使われているシーンも多い。この処理をbreakを使わないで実現しようとするとif制御構文が入り組んできたり、whileの条件が入り組んだりと読みにくくなってしまう。

breakを使うことでスッキリとした繰り返し処理を記述できる。

参考資料