LoginSignup
2
1

More than 3 years have passed since last update.

シェルスクリプトで今日の天気予報を見る

Posted at

はじめに

シェルスクリプトの練習として、Livedoorの天気予報APIであるWeather Hacksを使って「今日の天気」を調べるスクリプトを作ってみました。

また、所望の地点における天気予報が見られるように、地名を指定して天気予報が見られるようにしてみました。

スクリプト

概要

  • 天気予報が公開されている地名のリストである全国の地点定義表はXML(RSS)形式ですが、シェルスクリプトでXMLをサクッとパースする方法が見つからなかったので、sedコマンドで不要な部分をゴリゴリと削っています。
  • 引数で指定した地名が「全国の地点定義表」に存在する時は、その地点の今日の天気をJSON形式で取得して、jqコマンドで解析した結果を表示しています。
  • 引数で指定した地名が「全国の地点定義表」に存在しない時は、「全国の地点定義表」に定義されている地点名を一覧表示します。

使い方

  • 以下のweather.shを実行する際に、引数として所望の地名を指定します。
weather.sh
#!/bin/bash
# http://weather.livedoor.com/forecast/webservice/json/v1?# 全国の地点定義表(RSS)から、入力された地名と合致する地点名とIDを抽出する。
# http://weather.livedoor.com/forecast/rss/primary_area.xml
cityname_id=$(curl -s http://weather.livedoor.com/forecast/rss/primary_area.xml \
    | sed "s/>/>\n/g" \
    | grep city \
    | sed "s/<city title=\"//g" \
    | sed "s/\" source.*>//g" \
    | sed "s/\" id=\"/,/g" \
    | grep $1) \# 該当する地名が存在する時は、その都市の天気予報を取得する。
# 該当する都市が存在しない時は処理を終了する。
if [ -z "$cityname_id" ]; then
    echo$1」の天気予報は提供されていません。以下の都市から選択してください。
    echo ----------------------------------------
    echo $(curl -s http://weather.livedoor.com/forecast/rss/primary_area.xml \
        | sed "s/>/>\n/g" \
        | grep city \
        | sed "s/<city title=\"//g" \
        | sed "s/\" id.*>//g")
else
    # {地点名,ID}の文字列からIDだけ抜き出す。
    city_id=$(echo $cityname_id | sed "s/.*,//g")
    city_name=$(echo $cityname_id | sed "s/,.*//g")echo $city_nameの今日の天気: \
        $(curl -s http://weather.livedoor.com/forecast/webservice/json/v1?city=${city_id} \
            | jq '.forecasts[]' \
            | jq -r 'select(.dateLabel=="今日").telop')
fi

実行結果

実行結果(指定した地名の天気予報が存在する時)
[root@akagi ~]# ./weather.sh 東京
東京の今日の天気: 晴れ
実行結果(指定した地名の天気予報が存在しない時)
[root@akagi ~]# ./weather.sh ペンギン村
「ペンギン村」の天気予報は提供されていません。以下の都市から選択してください。
----------------------------------------
稚内 旭川 留萌 網走 北見 紋別 根室 釧路 帯広 室蘭 浦河 札幌 岩見沢 倶知安 函館 江差 青森 むつ 八戸 盛岡 宮古 大
船渡 仙台 白石 秋田 横手 山形 米沢 酒田 新庄 福島 小名浜 若松 水戸 土浦 宇都宮 大田原 前橋 みなかみ さいたま 熊
谷 秩父 千葉 銚子 館山 東京 大島 八丈島 父島 横浜 小田原 新潟 長岡 高田 相川 富山 伏木 金沢 輪島 福井 敦賀 甲府 河口湖 長野 松本 飯田 岐阜 高山 静岡 網代 三島 浜松 名古屋 豊橋 津 尾鷲 大津 彦根 京都 舞鶴 大阪 神戸 豊岡 奈良 風屋 和歌山 潮岬 鳥取 米子 松江 浜田 西郷 岡山 津山 広島 庄原 下関 山口 柳井 萩 徳島 日和佐 高松 松山 新居浜 宇
和島 高知 室戸岬 清水 福岡 八幡 飯塚 久留米 佐賀 伊万里 長崎 佐世保 厳原 福江 熊本 阿蘇乙姫 牛深 人吉 大分 中津 日田 佐伯 宮崎 延岡 都城 高千穂 鹿児島 鹿屋 種子島 名瀬 那覇 名護 久米島 南大東 宮古島 石垣島 与那国島

まとめ

  • 簡単にXMLをパースする方法が見当たらなかったため、力任せなコードになってしまいました。
    • 無理してシェルスクリプトで頑張らずに、RubyやPythonなどを使った方が可読性の高いコードになるだけでなく、生産性も高くなると思いました。
  • 一方で、シェルスクリプトだけでもある程度の事は出来る...ということも分かりました。
    • シェルスクリプトはどうも苦手ですが、苦手意識がなくなるように時々こういったチャレンジを続けていきたいです。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1