Shell Script Advent Calendar 2016の今日の枠が埋まってなかったのでコネタを書きます。
やりたいこと
rg(ripgrep)はテキスト検索ツールです。ag(The Silver Searcher)と同様にgrep -r
相当の検索を高速に実行します。rgについての詳細はすでにいろいろ解説エントリーが書かれていますし、今回の本題ではないので割愛します。
rgは、GitHubからダウンロードしてきて、静的リンクされた1バイナリを~/binなどに置くだけで使えるので、インストールも楽です。ただし、開発がえらく速いので、こまめにチェックしていないとバージョンがすぐ古くなってしまいます。
そこで、現在インストールされているバージョンとGitHubのreleasesに上がっているバージョンを比較する簡単なシェルスクリプトを作りました。
作ったシェルスクリプト
GitHubのreleases APIでとってきたlatest情報のJSONから、jqコマンドでバージョン番号を抜き出して比較します。
#!/bin/sh
APIURL=https://api.github.com/repos/BurntSushi/ripgrep/releases/latest
{
rg --version | tr -d '\n'
echo -n ' -> '
curl -s "$APIURL" | jq -r .tag_name
} | sed -e 's/^ripgrep \(.*\) -> \1$/now up to date/'
最新版の場合は「now up to date」と、最新版でない場合は「ripgrep 0.3.1 -> 0.3.2」のような形式で表示されます。
シェルスクリプトとしての工夫点
最初に書いたときには、インストールされているバージョンと最新バージョンをそれぞれ変数に入れてから比較していました。しかし、コマンドの結果を変数に入れるのはシェルスクリプトらしくないなあと思っていました。
そんなときにpiroorさんの「プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 - Qiita」を読んで、やっぱりそうだなあと思い、パイプで処理するよう書き直しました。