PowerShell
シェル
アドベントカレンダー2018

Windows環境以外でPowerShellを使ってみよう

Ateam Lifestyle x cyma Advent Calendar 2018の4日目は、株式会社エイチームライフスタイルのエンジニア@matsu06が担当します。

突然ですが、皆さんターミナルで作業する際にはどのようなシェルをお使いでしょうか?

最近はfishを使用する方が多いようですね。

今回は、Microsoft謹製のオープンソースのシェルであるPowerShellについて、ご紹介させていただきたいと思います。


対象


  • これまでbash等のシェルを使用しており、Macや、Linuxを使うにしても、PowerShellはWindowsサーバを管理するような場合以外、特にメリットはないと思っている方


PowerShellとは


歴史

PowerShellは、マイクロソフトが開発したシェルおよびスクリプト言語であり、オブジェクト指向に基づいて設計されています。

.NET Frameworkと.NET Coreを基盤としており、2018年1月からは、PowerShell Core 6.0として、クロスプラットフォーム版がリリースされています。

各OSでのインストール方法については、公式サイトにまとまっているため、ご参考にしてください。


コマンドレット

PowerShellで実行されるコマンドは、コマンドレットと言われています。

そして、コマンドレットには覚えやすいように動詞-名詞形式の命名規則がされています。

例えば、ディレクトリを移動するためのコママンドレットは、

Set-Location ./hoge

のようになっています。

しかし、これでは長いですし、他シェルの経験者ならば、cdコマンドが使いたいと思われると思います。

そこで、デフォルトでいくつかのエイリアスが設定されており、cdコマンドもエイリアスに登録されていますし、エイリアスを新たに追加するコマンドレットも用意されています(Get-Alias)。

コマンドレットの一覧については公式サイトにあるので、見てみるのもいいかもしれません。


オブジェクト指向

PowerShellは、他のシェル同様、パイプで繋いで複雑な処理を簡単にできます。

しかし、他と大きな違いがあり、それはパイプで渡すのはオブジェクトであるということです。

例えば、下記のようなCSVファイルのスコアの合計や平均、最大、最小を知りたい場合、どのようにすればよいでしょうか?(スプレッドシートを使うのが楽そうですが)


score.csv

team,score

a,45
b,65
c,55

bashの場合は、下記のようになると思います。


合計

$ cat ./score.csv | awk -F "," 'NR>1{sum+=$2} END{print sum;}'

165


平均

$ cat ./score.csv | awk -F "," 'NR>1{sum+=$2} END{print sum/(NR-1);}'

55


最大

$ cat ./score.csv | awk -F "," 'NR>1{if(max<$2) max=$2} END{print max;}'

65


最小

$ cat ./score.csv | awk -F "," 'NR>1BEGIN{min=100}{if(min>$2) min=$2} END{print min;}'

45

詳細は省略しますが、読みづらかったり、書きづらいと思ったことはないでしょうか?

これは、従来のシェルがテキストベースで設計されており、パイプで渡すものがテキストであるためことに起因していると考えられます。

同じ処理でも、オブジェクト指向であるPowerShellでは、下記のようになります。


集計

PS> Import-Csv ./score.csv | Measure-Object -sum -average -maximum -minimum score

Count : 3
Average : 55
Sum : 165
Maximum : 65
Minimum : 45
StandardDeviation :
Property : score


従来のものに比べて、わかりやすくはないでしょうか?

簡単に説明いたしますと、まず、Import-CsvというコマンドレットでCSVを読み込み、オブジェクトを生成します。

そのCSVオブジェクトを、パイプで集計用コマンドレットであるMeasure-Objectに渡し、オプションで-sum -average -maximum -minimumを指定しています。そして、渡したオブジェクトの集計したいプロパティ(今回の場合はCSVオブジェクトのscore)を引数にする、ということを行っています。

これまでのテキストベースのシェルでは、どうしてもawk等用いて、文字列として扱わなければならなかったものが、オブジェクト指向になったことで、大変わかりやすく表現できるようになっていると思います。


まとめ

PowerShellは、オブジェクト指向を取り入れることで、これまでのシェルに比べて、書きやすく、読みやすいものになっていると思います。

実績が少なく、これまでの資産もあるため、業務に取り入れるのはハードルが高いかもしれませんが、息抜きに触ってみるといろいろ発見があり、楽しいかもしれませんですよ。


Ateam Lifestyle x cyma Advent Calendar 2018、明日は凄腕マネージャーの @gonjyu121 に書いてもらう予定です。ぜひお楽しみに!

エイチームグループでは、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。興味を持たれた方はぜひエイチームグループ採用サイトを御覧ください。

https://www.a-tm.co.jp/recruit/