本サイトはプロモーションを含みます。

if文でバグを仕込まないための注意点

今回はTeraTermマクロの仕様上回避のしようがないので、コーディングする側が気をつけましょう、という話です。

追記(2016年3月5日)

2016年3月5日リリースされたTera Term 4.90で仕様が変更されたため、4.90以降はこの問題に該当しません。

if文は皆さんご存じの通り、条件判定により「もし〜だったら」という処理をおこないます。では、つぎのマクロはどのような動作をするでしょうか。

code = 100

if code != 100
	messagebox 'codeの値が100ではありません!' 'error'
	goto error
else
	messagebox 'codeの値は100です!!' 'OK'
endif

:error
	end

実行結果はつぎのようになります。

おかしいですね。codeの値は100で間違いありません。

if文の書き方

TeraTermマクロのif文は2通りの書き方があります。まず最初は「if 〜 then 〜 endif」形式です。

if <条件> then
    条件がマッチした際の処理
endif

もうひとつの書き方は「if 〜 マッチした際の処理」形式です。

if <条件> <条件にマッチした際の処理>

そう、if文には「then」がある場合とない場合の2パターンの書き方があります。

最初に掲載したサンプルマクロは「then」がありません。TeraTermマクロの仕様では「then」がない場合、条件にマッチした際の処理コードを書かなくても構文エラーになりません。そのため、条件に関わらず次の行へ進みます。ですから、codeの値が100だろうが200だろうが関係なく「codeの値が100ではありません!」というメッセージボックスが表示されてしまいます。

訂正(2016年2月19日)

「then」がない場合は次にTTLコマンドが来ることをTeraTermマクロは期待していますが、if文の条件に一致しない場合はTTLコマンドが実行されないため、次の行へ進みます。今回のサンプルでいうと4行目の「codeの値が100ではありません!」というメッセージを表示する箇所です。逆にif文の条件に一致した場合はTTLコマンドを実行しようとしますがTTLコマンドを記述していないためシンタックスエラーとなります。

thenの書き忘れに注意

これまで、本サイトではif文の使い方として、あえてthenを書かない方法を紹介しませんでした。それは今回のようばバグが発生してしまう可能性があるからです。ぼくの個人的な意見ですが、thenを書かない方式は使わず、常にthenを使う事をオススメします。そうすれば、if文を検索してthenの有無をチェックする事でバグを見つけやすくなるからです。

Tera Term 4.90以降はシンタックスエラーになる

2016年3月5日リリースされたTera Term 4.90へアップデートすると、thenの書き忘れはシンタックスエラーで処理が停止します。

2 COMMENTS

shj

ありがとうございます。v4.90のリリースで修正を確認後、記事を更新します。

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)