あと、Windowsバッチ(.BAT)の書き方で違和感があるのが、ダブルクォーテーションの扱いである。
エスケープしない限り、ダブルクォーテーションは文字としてそのまま使われることはなく、文字列の範囲指定、つまり引用符(ダブルクォーテーションで囲んだ中身が有効)として使われる・・・という認識なんだけど Windowsバッチでは違う。
例えば Perl で
my $a = "ABC";if ("$a" eq "ABC") { print "ok!"; }
としたとき(まあ、変数をわざわざ "" で囲むことはないけど、例としてね)、比較されるのは $a変数に収められた ABC という文字列と、"" で囲まれた ABC という文字列である。決して、"ABC" と "ABC" が比較されるわけではない。
"" とすれば、それはダブルクォーテーションで囲まれた文字が何もない(空文字)ということになる。
ところが Windowsバッチで、
IF %1 == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )
なんて書いて引数に ABC を指定して' test.bat ABC 'ってバッチを起動すると「違います」と言われる。「え?"ABC" と "ABC" なのに?」でも、実際は ABC と "ABC" の比較になってるのだ。
改めて、' test.bat "ABC" 'と実行すれば、これは「同じです」と返ってくる。ダブルクォーテーションも単なる文字として判断されているので、これなら "ABC" と "ABC" の比較となるからだ。
上記の IF 文で、引数に何も指定しなければ「"ABC" の使い方が誤っています。」というエラーになる。
この場合、%1 は「空文字」ではなく「無」な状態となり、変数展開後、
IF == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )
と書いたのと同じことになるのだ。書式として誤った形になっている。なんか気持ち悪い(^^;;;
なので、正しい対応(あとで書くが、これは単なる慣習である)
IF "%1" == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )
と書く。そうすると、引数が指定されなかったときは、
IF "" == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )
と書いたのと同じになるので、書式として正しい。む~ん・・・
上の例は、まるで変数や文字列を二重引用符(ダブルクォーテーション)で囲ったように見えるが、これは実は引用符ではない。そもそも、Windowsバッチには引用符という概念がない。
これは実際には
IF X%1X == XABCX ( ECHO 同じです ) ELSE ( ECHO 違います )
のように、ダブルクオーテーションではなくても良い。%1 が「無」の状態とならなければいいのだ。だから囲ってやる必要もなく、
IF X%1 == XABC ( ECHO 同じです ) ELSE ( ECHO 違います )
でいい。%1が空だったときに、何かしらの値がそこに残ればいいのだ。上の例であれば、「IF X == XABC」となり書式としては成立している。そこを「頭に X を置くのでは見栄えも悪いし」ということで、慣習的にダブルクォーテーションで囲っているだけの話だ。
この辺が日ごろ Windowsバッチに触れてない人間には気持ちが悪いのよね。
「引用符の概念がない」のもそうだけど、そのため空文字対策で変数を何らかの文字で囲ってやらないといけないときは慣習的にダブルクォーテーションを使う(人が多い)。これが俺のようにたまにしか Windowsバッチに触れない人間には「変数を引用符で囲む必要ないんじゃないの?」とトラブルの元となってしまうのである。
もう!ほんま Microsoft の設計思想、嫌い(^^;;; なんでこんな仕様にした?
電気ウナギ的○○
About Backコメント(0)
電気ウナギ的○○