条件分岐と繰り返しで高度なマクロを作る
Tera Term マクロでは、VBA マクロなどと同様に条件分岐や繰り返し処理を行うことができます。これらの処理をマスターすることでより高度で便利なマクロを作成することができます。
この記事では、Tera Term マクロにおける条件分岐と繰り返し処理の記述方法を解説します。
動作確認環境
- Tera Term Version 4.104
条件分岐の記述方法【if,elseif,else】
条件分岐とは
条件分岐とは、指定した条件に合致する場合と合致しない場合で実行する処理を変えることを指します。
例えば、以下は変数 IPAddress に格納されている値が「1.1.1.1」かどうかを調べてその結果によって以下のようにメッセージを表示するマクロです。
- IPAddress に格納されている値が「1.1.1.1」の場合
- 「IPアドレスは「1.1.1.1」です。」というメッセージを表示する
- IPAddress に格納されている値が「1.1.1.1」ではない場合
- 「IPアドレスは「1.1.1.1」ではありません。」というメッセージを表示する
IPAddress = '1.1.1.1'
strcompare IPAddress '1.1.1.1'
if result = 0 then
messagebox 'IPアドレスは「1.1.1.1」です。' 'アドレスチェック'
else
messagebox 'IPアドレスは「1.1.1.1」ではありません。' 'アドレスチェック'
endif
上のマクロ例では、strcompare コマンドの仕様を利用し strcompare を実行した後に「システム変数 result の値が 0 である場合」という条件を使用して条件分岐しています。
条件分岐の記述方法については以下で説明します。
関係演算子を理解しよう
条件分岐を記述する際、必ず記載するのが「条件文」です。条件文とは条件分岐を行う際の検査対象となる条件を記述した文(式)です。条件文は同値関係や大小関係などを示す「関係演算子」を使用して記述されます。このためまず関係演算子を把握してください。
関係演算子 | 条件文例 | 意味 | 備考 |
---|---|---|---|
< | a < b | a が b 未満 | |
> | a > b | a が b より大きい | |
<= | a <= b | a が b 以下 | |
>= | a >= b | a が b 以上 | |
= | a = b | a と b が等しい | |
== | a == b | a と b が等しい | バージョン 4.54 以降で利用可 |
<> | a <> b | a と b が異なる | |
!= | a != b | a と b が異なる | バージョン 4.54 以降で利用可 |
- 関係演算子は数値に対してのみ使用できます。文字列が等しいかどうかを条件にするためには strcompare を使用した上で result の値を条件文に使用してください
真偽値
Tera Term では「1」が真、「0」が偽を意味します。条件文の代わりに「1」(常に真)や「0」(常に偽)を記述することもできます。
論理演算子でより複雑な条件文を作成する
論理演算子を使用することで、複数の条件文を結合して複数の条件文を同時に満たす場合「かつ(AND)」やいずれかの条件文を満たす場合「または(OR)」、という条件にすることもできます。
論理演算子 | 条件文例 | 意味 | 備考 |
---|---|---|---|
&& | a < b && a > c | a が b 未満、かつ a が c より大きい | バージョン 4.53 以降で利用可 |
|| | a < b || a < c | a が b 未満、または a が c 未満 | バージョン 4.53 以降で利用可 |
演算子の優先順位
複数の演算子を使用して複数の値や条件文を結合し、一つの文にすることができますが、注意が必要なのが演算子の優先順位です。足し算より掛け算の方が優先して計算されるのと同じように、関係演算子と論理演算子にも優先順位あります。
- 乗算、除算、余剰演算子
- *、/、%
- 加算、減算演算子
- +、-
- 関係演算子
- <、>、<=、>=
- 関係演算子
- =、==、<>、!=
- 論理積演算子
- &&
- 論理和演算子
- ||
条件分岐の記述方法【if,elseif,else】
条件分岐を行うためには「if文」を使用します。if文には以下のようないくつかのパターンがあります。
- if~endif
- 条件文に合致した場合の処理を記述
- if~else~endif
- 条件文に合致した場合の処理と合致しなかった場合の処理を記述
- if~elseif~endif
- 条件文①、条件文②、...、それぞれの条件文に合致した場合の処理を記述
- if~elseif~else~endif
- 条件文①、条件文②、...、それぞれの条件文に合致した場合の処理と、どれにも合致しなかった場合の処理を記述
① if~endif の記述例
「① if~endif」は、条件に合致した場合のみ何らかの処理を行いたい場合に使用します。その記述方法は以下の通りです。
- if <条件文> then
- <条件に合致した場合に実行する処理>
- endif
※実行する処理内容が1行の場合は以下の形式でも記述可能
- if <条件文> <条件に合致した場合に実行する処理>
以下は変数 n の値が「1」である場合に「値は「1」です。」というメッセージを表示するマクロです。
n = 1
if n = 1 then
messagebox '値は「1」です。' '値チェック'
endif
② if~else~endif の記述例
「② if~else~endif」は、条件に合致した場合と、条件に合致しなかった場合のそれぞれで異なる処理を実行したい場合に使用します。その記述方法は以下の通りです。
- if <条件文> then
- <条件に合致した場合に実行する処理>
- else
- <条件に合致しなかった場合に実行する処理>
- endif
以下は変数 n の値が「1」である場合に「値は「1」です。」というメッセージを表示し、そうでない場合には「値は「1」ではありません。」というメッセージを表示するマクロです。
n = 2
if n = 1 then
messagebox '値は「1」です。' '値チェック'
else
messagebox '値は「1」ではありません。' '値チェック'
endif
③ if~elseif~endif の記述例
「③ if~elseif~endif」は、2つ以上の条件があるときに各条件ごとに異なる処理内容を実行したい場合に使用します。その記述方法は以下の通りです。
- if <条件文①> then
- <条件①に合致した場合に実行する処理>
- elseif <条件文②> then
- <条件②に合致した場合に実行する処理>
- endif
※elseif の部分を増やして条件文③以降の処理を追加することも可能
以下は変数 n の値が「1」である場合には「値は「1」です。」というメッセージを表示し、変数 n の値が「2」である場合には「値は「2」です。」というメッセージを表示するマクロです。
n = 2
if n = 1 then
messagebox '値は「1」です。' '値チェック'
elseif n = 2 then
messagebox '値は「2」です。' '値チェック'
endif
このif文は else を含んでいないため、どの条件にも合致しない場合には何も処理が実行されません。
④ if~elseif~else~endif の記述例
「④ if~elseif~else~endif」は、2つ以上の条件があるときに各条件ごとに異なる処理内容を実行し、さらにどの条件にも合致しない場合にも何らかの処理を行いたい場合に使用します。その記述方法は以下の通りです。
- if <条件文①> then
- <条件①に合致した場合に実行する処理>
- elseif <条件文②> then
- <条件②に合致した場合に実行する処理>
- else
- <どの条件にも合致しなかった場合に実行する処理>
- endif
※elseif の部分を増やして条件文③以降の処理を追加することも可能
以下は変数 n の値が「1」である場合には「値は「1」です。」というメッセージを表示し、変数 n の値が「2」である場合には「値は「2」です。」というメッセージを表示し、変数 n の値が「1」でも「2」でもない場合には「値は「1」でも「2」でもありません。」というメッセージを表示するマクロです。
n = 3
if n = 1 then
messagebox '値は「1」です。' '値チェック'
elseif n = 2 then
messagebox '値は「2」です。' '値チェック'
else
messagebox '値は「1」でも「2」でもありません。' '値チェック'
endif
文字列の比較を行う方法【strcompare】
条件文で使用する関係演算子は数値に対しては使用できますが、文字列に対しては使用できません。ただ、文字列を比較した結果を条件にしたいということは良くあります。
文字列の比較結果を条件にしたい場合、strcompare コマンドを使用することで実現できます。strcompare は、指定された2つの文字列の比較結果に応じてシステム変数 result に値を格納します。その使い方は以下の通りです。
- strcompare <文字列①> <文字列②>
- <文字列①> と <文字列②> の比較結果に応じてシステム変数 result に値が格納される
- 2つの文字列が等しい場合 ⇒ result に「0」が格納される
- 2つの文字列が等しくない場合 ⇒ result に「-1」または「1」が格納される
上記の性質を利用し、strcompare を実行後に result の値が「0」かどうかを条件にすることで文字列比較の結果に基づいて条件分岐できます。
以下は変数 string の値が「mystring」と等しいかどうかを strcompare で検査し、その結果をメッセージで表示するマクロです。
string = "mystring"
strcompare string "mystring"
if result = 0 then
messagebox '値は「mystring」です。' '値チェック'
else
messagebox '値は「mystring」ではありません。' '値チェック'
endif
繰り返し処理の記述方法【for,do】
繰り返し処理には「for文」と「do文」の2種類があります。
for文の使い方
for文は繰り返す回数が決まっている場合に使用する繰り返し文です。for文の使い方は以下の通りです。
- for <変数名> <開始値> <終了値>
- <繰り返しで実行する処理>
- next
- <変数名>は数値を格納する変数
- <開始値>は繰り返しの開始時に変数にセットする変数値
- <終了値>は繰り返しを終了するしきい値
for文の動作仕様は以下の通りです。
- for文が開始されると、指定した変数に開始値が格納される
- 指定した変数の値が終了値[以下/以上]である限り以下の通り繰り返し処理を実行する
- 繰り返し処理を実行する
- 繰り返し処理実行後、指定した変数に[1が加算される/1が減算される]
- 指定した変数の値が終了値を[超えた/下回った]らfor文を抜ける
開始値と終了値の大小関係によって、変数値が繰り返し毎に加算される加減算されるかが変わります。
- 開始値が終了値より小さい場合 ⇒ 変数値は繰り返し毎に加算される
- 開始値が終了値より大きい場合 ⇒ 変数値は繰り返し毎に減算される
以下はfor文で指定した変数 i の値を表示する処理を5回繰り返すマクロです。
for i 1 5
sprintf2 message 'i=%d' i
messagebox message 'iの値'
next
このマクロを実行するとメッセージが5回表示され、各メッセージ内容は以下のようになります。
- i=1
- i=2
- i=3
- i=4
- i=5
for文の開始値と終了値を逆にするとマクロと結果は以下のようになります。
for i 5 1
sprintf2 message 'i=%d' i
messagebox message 'iの値'
next
- i=5
- i=4
- i=3
- i=2
- i=1
do文の使い方
do文は任意の条件に従って処理を繰り返したい場合に使用する繰り返し文です。
do文には以下のパターンがあります。
- do while~loop
- 繰り返し処理を実行する前に条件の検査を行う
- 条件に合致する場合に繰り返し処理を続ける
- do until~loop
- 繰り返し処理を実行する前に条件の検査を行う
- 条件に合致しない場合に繰り返し処理を続ける
- do~loop while
- 必ず1回は繰り返し処理を実行し、繰り返し処理を実行した後に条件の検査を行う
- 条件に合致する場合に繰り返し処理を続ける
- do~loop until
- 必ず1回は繰り返し処理を実行し、繰り返し処理を実行した後に条件の検査を行う
- 条件に合致しない場合に繰り返し処理を続ける
① do while~loop の記述方法
「① do while~loop」は条件に合致する限り繰り返し処理を実行したい場合に使用します。その記述方法は以下の通りです。
- do while <条件文>
- <繰り返しで実行する処理>
- loop
以下は変数 i の値が 5 以下である限り、繰り返し処理として変数 i の値をメッセージで表示するマクロです。
i = 1
do while i <= 5
sprintf2 message 'i=%d' i
messagebox message 'iの値'
i = i + 1
loop
このマクロを実行するとメッセージが5回表示され、各メッセージ内容は以下のようになります。
- i=1
- i=2
- i=3
- i=4
- i=5
ポイントとしては、繰り返し処理の中で「i = i + 1」と繰り返し条件に関わる変数 i の値を変えていっている部分です。この処理を行わないと無限ループになってしまいます。
② do until~loop の記述方法
「② do until~loop」は条件に合致しない限り繰り返し処理を実行したい場合に使用します。その記述方法は以下の通りです。
- do until <条件文>
- <繰り返しで実行する処理>
- loop
以下は変数 i の値が 5 より大きくない限り(5以下である限り)、繰り返し処理として変数 i の値をメッセージで表示するマクロです。
i = 1
do until i > 5
sprintf2 message 'i=%d' i
messagebox message 'iの値'
i = i + 1
loop
このマクロを実行するとメッセージが5回表示され、各メッセージ内容は以下のようになります。
- i=1
- i=2
- i=3
- i=4
- i=5
ポイントとしては、繰り返し処理の中で「i = i + 1」と繰り返し条件に関わる変数 i の値を変えていっている部分です。この処理を行わないと無限ループになってしまいます。
③ do~loop while の記述方法
「③ do~loop while」は最初の1回は必ず繰り返し処理を実行し、さらに条件に合致する限り繰り返し処理を実行したい場合に使用します。その記述方法は以下の通りです。
- do
- <繰り返しで実行する処理>
- loopwhile <条件文>
以下は変数 i の値が 5 より大きくない限り(5以下である限り)、繰り返し処理として変数 i の値をメッセージで表示するマクロです。
i = 1
do
sprintf2 message 'i=%d' i
messagebox message 'iの値'
i = i + 1
loop while i <= 5
このマクロを実行するとメッセージが5回表示され、各メッセージ内容は以下のようになります。
- i=1
- i=2
- i=3
- i=4
- i=5
ポイントとしては、繰り返し処理の中で「i = i + 1」と繰り返し条件に関わる変数 i の値を変えていっている部分です。この処理を行わないと無限ループになってしまいます。
do~loop while の場合、必ず最初の1回は繰り返し処理を実行するため、この文に到達した時点で繰り返し条件に合致していなくても1回は処理が実行されます。例えば上で記載したマクロ例について以下のように変数 i の初期値を繰り返し条件を満たさない 10 にした場合、1回のみ繰り返し処理が実行され「i=10」のメッセージが表示されます。
i = 1
do
sprintf2 message 'i=%d' i
messagebox message 'iの値'
i = i + 1
loop while i <= 5
- i=10
④ do~loop until の記述方法
「④ do~loop until」は最初の1回は必ず繰り返し処理を実行し、さらに条件に合致しない限り繰り返し処理を実行したい場合に使用します。その記述方法は以下の通りです。
- do
- <繰り返しで実行する処理>
- loopuntil <条件文>
以下は変数 i の値が 5 より大きくない限り(5以下である限り)、繰り返し処理として変数 i の値をメッセージで表示するマクロです。
i = 1
do
sprintf2 message 'i=%d' i
messagebox message 'iの値'
i = i + 1
loop until i > 5
このマクロを実行するとメッセージが5回表示され、各メッセージ内容は以下のようになります。
- i=1
- i=2
- i=3
- i=4
- i=5
ポイントとしては、繰り返し処理の中で「i = i + 1」と繰り返し条件に関わる変数 i の値を変えていっている部分です。この処理を行わないと無限ループになってしまいます。
do~loop until の場合、必ず最初の1回は繰り返し処理を実行するため、この文に到達した時点で繰り返し条件に合致していなくても1回は処理が実行されます。例えば上で記載したマクロ例について以下のように変数 i の初期値を繰り返し条件を満たさない 10 にした場合、1回のみ繰り返し処理が実行され「i=10」のメッセージが表示されます。
i = 10
do
sprintf2 message 'i=%d' i
messagebox message 'iの値'
i = i + 1
loop until i > 5
- i=10
その他の繰り返し文
上で説明した do~loop 文と似た繰り返し文で while~endwhile 文と until~enduntil 文があります。それぞれ使い方は do~loop 文と同じため説明は省略します。
配列と繰り返し処理の活用
繰り返し処理は配列との相性が良いためよく一緒に使用されます。
以下のように、配列の添え字とfor文の変数を対応付けて繰り返し処理を行うことで、配列の各値に対して処理を行うことができます。
strdim address 5
address[0] = '192.168.1.1'
address[1] = '192.168.1.2'
address[2] = '192.168.1.3'
address[3] = '192.168.1.4'
address[4] = '192.168.1.5'
for i 0 4
messagebox address[i] 'アドレス'
next
このマクロを実行するとメッセージが5回表示され、各メッセージでは配列の各値が表示されます。
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
- 192.168.1.4
- 192.168.1.5
次の繰り返しに移行する【continue】
for文やdo文では、現在の繰り返し処理をスキップして次の繰り返し処理に移行することもできます。
次の繰り返し処理に移行するためには以下のコマンドを使用します。
- continue
以下はfor文で配列の各要素の内容をメッセージ表示しますが、空の要素があったら次の繰り返し処理に移行するマクロです。
strdim address 5
address[0] = '192.168.1.1'
address[1] = '192.168.1.2'
address[2] = '192.168.1.3'
address[3] = ''
address[4] = '192.168.1.5'
for i 0 4
strcompare address[i] ''
if result = 0 continue
messagebox address[i] 'アドレス'
next
このマクロを実行すると、繰り返し4回目で配列の要素が空になっているため、4回目の繰り返し処理をスキップして5回目の繰り返し処理に移行する動作になります。
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
- スキップされメッセージは表示されず
- 192.168.1.5
繰り返し処理を途中で抜ける【break】
for文やdo文では、処理の途中で繰り返し処理を終了して繰り返し文を抜けることもできます。
繰り返し処理の途中で繰り返し文から抜けるためには以下のコマンドを使用します。
- break
以下はfor文で配列の各要素の内容をメッセージ表示しますが、空の要素があったらその時点で繰り返しを終了しfor文を抜けるマクロです。
strdim address 5
address[0] = '192.168.1.1'
address[1] = '192.168.1.2'
address[2] = '192.168.1.3'
address[3] = ''
address[4] = ''
for i 0 4
strcompare address[i] ''
if result = 0 break
messagebox address[i] 'アドレス'
next
このマクロを実行すると、繰り返し3回目まではメッセージが表示されますが、繰り返し4回目で配列の要素が空になっているため、その時点で break が実行されfor文を抜ける動作になります。
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
- breakが実行されfor文を抜ける
まとめ
- Tera Term マクロでも条件分岐や繰り返し処理を行える
- 条件分岐には if 文を使用する
- 繰り返し処理には for 文や do 文 (while、until)を使用する
- 条件分岐や繰り返し処理を活用することでより高度でより便利なマクロを作成できる
ここでは条件分岐と繰り返し処理の基礎知識を説明しました。これらの基礎技術を用いて様々な処理を実現することができます。応用例については別の記事で説明します。
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
コメント