アニメ『将国のアルタイル』
雰囲気がアルスラーン戦記に似てる気はしますが、主人公はこちらの方が好きです。王よりも忠実な部下ってのがかっこいいと思ってしまいます。
主人公は美少年で若いのに将軍ですが、将軍なのにあまり兵を率いるって場面がありません。個人での戦闘シーンばかりです。でも将軍だから一人で戦っても強いです。
さて、前回LinuxでPowerShellを使ってみましたが、bashだけでは長くなるコマンドも、PowerShellを使うと簡潔に書けるメリットがあります。普段私がよく使うseqコマンドを、PowerShellで表現するとどのような違いがあるでしょうか、確認してみます。
(本記事はPowerShell入門記事としてコチラにもまとめています。)
PowerShellで数列を生成
とても簡単にかけてしまいます。2掛けると、各要素が2倍になります。
PS /home/takk> 1..5 1 2 3 4 5 PS /home/takk> 1..5 | %{$_ * 2} 2 4 6 8 10 PS /home/takk>
seqコマンドで数列を生成
こちらは、各要素に2を書けると同じ数字が2つ並ぶだけです。
PS /home/takk> seq 5 1 2 3 4 5 PS /home/takk> seq 5 | %{$_ * 2} 11 22 33 44 55 PS /home/takk>
なぜ結果が違うのでしょうか。一度変数に格納してみましょう。
それぞれの変数の型
変数に格納するのも、バッククォート不要です。PowerShell便利だなあと思います。
PS /home/takk> $a=1..5 PS /home/takk> $b=seq 5 PS /home/takk>
これで格納できました。
念のため、それぞれを実行してみます。
PS /home/takk> $a 1 2 3 4 5 PS /home/takk> $b 1 2 3 4 5 PS /home/takk>
間違いないですね。
次に各変数の型を調べます。
PS /home/takk> $a.gettype() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS /home/takk> $b.gettype() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS /home/takk>
両方変数ともオブジェクトですので、メソッドが使えます。GetType()で型が取得できます。ともにArrayってことです。ここまでは一致してますね。
各要素の型
では各要素の型をGetType()で取得してみましょう。
PS /home/takk> $a | %{$_.gettype()} IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Int32 System.ValueType True True Int32 System.ValueType True True Int32 System.ValueType True True Int32 System.ValueType True True Int32 System.ValueType PS /home/takk> $b | %{$_.gettype()} IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object True True String System.Object True True String System.Object True True String System.Object True True String System.Object PS /home/takk>
1..5の方は、Int32。seq 5の方は、Stringが返ってきました。
seq 5の戻り値は、元々標準出力を使ってますので、文字列(String)になるのは当たり前のように思えます。seq 5を数値として計算したい場合は、以下のようにキャストしてから使用します。
PS /home/takk> seq 5 | %{[Int32]$_ *2} 2 4 6 8 10 PS /home/takk>
Unix/Linuxの基本的なコマンドが、PowerShellによって脅かされそうな気がします。
コメント