LinuxでPowerShell 1..5とseq 5は異なるのか


アニメ『将国のアルタイル』

雰囲気がアルスラーン戦記に似てる気はしますが、主人公はこちらの方が好きです。王よりも忠実な部下ってのがかっこいいと思ってしまいます。
主人公は美少年で若いのに将軍ですが、将軍なのにあまり兵を率いるって場面がありません。個人での戦闘シーンばかりです。でも将軍だから一人で戦っても強いです。

さて、前回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によって脅かされそうな気がします。

コメント

タイトルとURLをコピーしました