はじめに
この前、Qiita APIを使って、「フォローしているけど、フォローされていない」ユーザーを取得するやつを何となく書いたことがあったのだけど、自分では短く書けた気がするけど、他の言語ではこうは行かないなあと思ったり(煽り)。
ここで、もっと短く書けるぞという人やシェルスクリプト(Shell Script)以外で書いたという人は、是非、挑戦してみてください(コメント!)。
#!/bin/bash
user=$USER
page=`curl -sL http://qiita.com/${user}/following_users | grep data-pjax | tail -n 1 | cut -d "?" -f 2 | cut -d '"' -f 1 | cut -d = -f 2`
following=$(for (( i=1;i<=${page};i++ ))
do
html=`curl -sL "http://qiita.com/${user}/following_users?page=${i}" | grep 'span itemprop="name"' | tr '>' '\n' | grep -A1 'itemprop="name"' |cut -d '<' -f -1`
echo "$html"
done)
followers=$(for (( i=1;i<=${page};i++ ))
do
html=`curl -sL "http://qiita.com/${user}/followers?page=${i}" | grep 'span itemprop="name"' | tr '>' '\n' | grep -A1 'itemprop="name"' |cut -d '<' -f -1`
echo "$html"
done)
d=`echo "$following"`
d=$d`echo "$followers"`
user=`echo "$d"|sort | uniq -u`
case $user in
"") echo ok ;;
*) echo "http://qiita.com/${user}" ;;
esac
Shell Scriptの扱いやすさ
では、本題に入りたいと思います。Shell Scriptは、他の言語ではとっつきにくいことが、割りとすぐに実現できてしまいます。
これはなぜなのかというと、Shell Scriptはとても直感的だからだと思います。
出力が基本的に端末に出力され、また、パイプを繋いだりする処理の感覚的なわかり易さなどが、この「直感的」であることに寄与していると考えます。
通常の言語では、例えば、出力は、print
を使わなければならなかったりしますが、ほぼすべてのコマンドは、結果をデフォルトで出力します。つまり、Shell Scriptは、とてもシンプルな流れになっているわけです。
この点、Shell Scriptは基本的にはただのコマンドの羅列です。確かに、書き方によっては、一見シンプルではなくなるかもしれませんが、やはり作る側にとってはシンプルだと思います。
他の言語との比較
他の言語とShell Scriptの比較と言っても漠然としすぎていますが、RubyやPython, PHPなどを想起していただければと思います。
Shell Scriptは、これらの言語よりも遥かに簡単なものを簡単に作るのに適していると私は思います。
例えば、あるAPIを試したいとしましょう。
この場合、ほとんどのエンジニアやハッカーは、curl
コマンドを叩くことから始めると思います。
例えば、GitHub API v3のドキュメントを見てみましょう。
そこには必ずと言っていいほど、curl
コマンドが載せられているはずです。
$ curl -i "https://api.github.com/repos/vmg/redcarpet/issues?state=closed"
この意味は、「まずはcurl
を叩け、話はそれからだ」や「ワンライナーやShell Scriptで試してね」ということでしょう←なにそれ
ここで、簡単なものを簡単に作るのに、Shell Scriptが第一候補に挙げられる事が多いのも理解していただけたかなと思います。
他にもShell Scriptが推される様々な理由があります。例えば、Linuxを使っているとして、Linuxの仕組み的なものから考えても、Shell Scriptはスタートアップとして、何かを試すにはお手軽さがあります。
Shell Scriptの弱点
しかし、Shell Scriptは、簡単なものを簡単に作れる反面、複雑なものを複雑に作ることには向いていない言語でもあります。
複雑なものを複雑に作るとは、例えば、コードの量が非常に多くなることが予想されるシステムだとか、複合的なWebアプリだとかがそれに当たります。
この場合、一般的な言語で書いたほうが、Shell Scriptで書くよりも、遥かに閲読性に優れ、メンテナンスする際に優位ですし、構造上もShell Scriptでかくよりも遥かにシンプルなものにすることが可能です。
結論
Shell Script、いいですよー。お手軽で簡単、とても便利。
ただし、大きなものを作る時は他の言語でやりましょう。
おわり。
追記
Qiita APIは、同一IPからの連続的な要求を制限しています。したがって、こういう時は、Access Tokenを使うと便利です。Qiita Userは設定からすぐに使えるようになっています。Tokenを使ったアクセスは、制限が緩和されます。
$ url="https://qiita.com/api/v2/items/${USER}"
$ token=xjisjaiojo939u02nvdiaj34
$ curl -H "Authorization: Bearer $token" $url
$ curl -H "Authorization: Bearer $token" $url | jq -r '.body'