if制御構文

PowerShellをシェルスクリプトとして使うようになってくると、if制御構文が欠かせなくなる。if制御構文は多くのプログラミング言語に導入されている基本的な構文で、条件に応じて処理を切り分けるために使われる。ifという名前ではないこともあるが、似たような機能は大抵のプログラミング言語で用意されている。

if制御構文の代表的な使い方は、ある条件を評価して、それが真値であればこちらの処理を行い、偽値であればそちらに処理を行う、というものだ。処理を切り分けることでさまざまな状況に対応できるようになる。

if制御構文の書き方

PowerShell Coreにおけるif制御構文は次のように記述する。

PowerShell Coreのif制御構文

if (条件1) {
    ステートメントリスト1
} elseif (条件2) {
    ステートメントリスト2
} else {
    ステートメントリスト3
}

条件1が真値であればステートメントリスト1が実行される。条件1が偽値で条件2が真値の場合にはステートメントリスト2が実行される。条件1が偽値で条件2が偽値の場合にはステートメント3が実行される。

if (条件)の部分は必須だが、elseif (条件)やelseオプショナルなので、指定しなくてもよい。elseは構文の一番最後にひとつしか指定することができないが、elseifに関してはいくつでも追加することができる。この組み合わせによって複数の条件をひとつのif制御構文の流れに中に納めることができる。

if制御構文はネスト構造にすることもできる。if制御構文の中のステートメントリストの中にさらにif制御構文を利用する場合だ。if制御構文で何個もネストを行うと人が理解しにくいシェルスクリプトになってくるので避けた方がよいが、そういった書き方をすることもできる。

if制御構文の条件には比較演算子などを利用する。利用できる比較演算子は次のとおり。

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

<や>といった記号ではなくハイフンからはじまる文字列を比較演算子としているプログラミング言語やコマンドはほかにも存在している。UNIXのシェルスクリプトではtestコマンドが条件式の代わりとして機能するが、このコマンドは比較演算子をハイフンからはじめる文字列としてとっており、PowerShellの書き方とよく似ている。

if制御構文のサンプル

if制御構文をelseまたはelseifを使わずに書くと次のようになる。

if制御構文のサンプル1

if ($val -gt 10) {
    Write-Host '変数$valは2よりも大きい'
}

この書き方では条件が$val -gt 10となっており、変数$valが10よりも大きい値だった場合に真値となり、{ }ブロックの中に記述されているWrite-Hostコマンドレットが実行され、メッセージが出力される。変数$valがその条件を見たさない場合、そのコマンドレットは実行されない。

このif制御構文にelseを繋げると次のようになる。

if制御構文のサンプル2

if ($val -gt 10) {
    Write-Host '変数$valは10よりも大きい'
} else {
    Write-Host ('変数$valは10またはこれよりも小さいか' +
        '作成されていない、または初期化されていない')
}

この場合、if ($val -gt 10)の条件を満たさなかった場合、else { }の中のWrite-Hostコマンドレットが実行される。このような書き方をした場合、if ()の条件式に当てはまらなかったものはかならずelse { }の側で処理されるようになる。条件によって処理される内容を2分岐させたい場合にはこの書き方を使う。

if (条件式)とelse { }の間にelseif (条件式)を記述すると次のようになる。

if制御構文のサンプル3

if ($val -gt 10) {
    Write-Host '変数$valは10よりも大きい'
} elseif ($val -eq 10) {
    Write-Host '変数$valは10と同じ'
} else {
    Write-Host ('変数$valは10よりも小さいか' +
        '作成されていない、または初期化されていない')
}

この書き方では、if (条件式)に当てはまらなかった処理は、次のelseif (条件式)で再び条件判定を受けることになる。このような記述をすることで一続きのif制御構文において複数の分岐を行うことができる。なお、if (条件式)やelseif (条件式)に当てはまった場合にはその後の{ }の中を実行して、if制御構文を抜ける。処理したあとでさらに次のelseif()やelseを評価することはない。このあたりは注意しておきたいポイントだ。

上記サンプルコードを実際に実行すると次のようになる。

$valの値が15の場合の実行例

$valの値が5の場合の実行例

こんな感じで処理の切り分けを行うことができる。if制御構文はプログラミング言語としてPowerShell Coreを実行する場合のもっとも基本的な方法だ。PowerShellでシェルスクリプトを組む場合にはまず覚えておく必要がある。

参考資料