読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

文字列内変数展開の罠

Power Shell

Power Shellでは、「"」で括られた文字列内の変数は、自動的に展開されます。

PS F:\> $name = "foo"
PS F:\> echo "My Name is $name"
My Name is foo

機能的には、「Rubyみたいに"#{}"で囲む必要ないんだー、へー、」というだけなんですが、ここにちょっとした罠が隠されているのです!具体的にはまったのは以下。

PS F:\> $h = "foo.com"
PS F:\> $p = "80"
PS F:\> echo "http://$h:$p"
http://80

実際には「$h」「$p」は引数で渡されていて、そこからURLを構築しているのですが、なぜか「$h」がスルーされる。引数の渡し方がまずいのかとしばらく悩んだ挙げ句、原因は「$hが変数として解釈されていない」ことであると判明。どうも「$h:」までを変数と解釈して、展開しようとしているみたいなのです。なので「$p」を消して「http://$h」とすると期待通りの動作となります。あと、「$h」の後に空白を入れた場合もうまいこと解釈されるようです。

PS F:\> echo "http://$h"
http://foo.com
PS F:\> echo "http://$h $p"
http://foo.com 80
PS F:\> echo "http://$h$p"
http://foo.com80
PS F:\> $hx = "var.com"
PS F:\> echo "http://$hx$p"
http://var.com80

まぁ、確かに、どこまでを変数とすべきか判断が難しそうなのは解るけど、だったら識別できるような文法にしようよー。

で、対策

さて、原因がわかったとはいえ、「:」をスペースに置き換える訳にもいかないので、今回は次のようにして回避。

PS F:\> echo ("http://"+$h+":"+$p)
http://foo.com:80

なんか、メンドウだなー。

ちなみに

Power Shellでも「'」で括った文字列内の変数は展開されません。ここはRubyと同じ。

PS F:\> echo "$h"
foo.com
PS F:\> echo '$h'
$h