シェルスクリプトマガジン

第10回 写真から場所を調べる

実際のプログラム例

 では、シェルスクリプトを作成してみましょう。今回のシェルスクリプト(photo_gps.sh)は、次のようになります。「アプリケーションID」の部分は、先ほど発行したものに書き換えてください。

#!/bin/bash

##Yahoo! JAPANのアプリケーションID
yahoo_appid="アプリケーションID"

## 地図の大きさ、縮尺
width="300"
height="200"
scale="15"

identify -verbose $1 | grep -e "exif:DateTime:" -e "exif:GPSLatitude" -e "exif:GPSLongitude" > /tmp/gps_data

## 撮影時刻取得
photo_date_time=$(cat /tmp/gps_data | grep "exif:DateTime:" | sed "s/exif:DateTime://")
photo_date=$(echo ${photo_date_time} | cut -f 1 -d " ")
photo_time=$(echo ${photo_date_time} | cut -f 2 -d " ")

## 緯度・経度の取得関数
function coordinate () {
  gps=$(cat /tmp/gps_data | grep $1 | sed "s/$1//")
  gps_do=$(echo ${gps} | tr "/" "," | cut -f 1 -d ",")
  gps_fun=$(echo ${gps} | tr "/" "," | cut -f 3 -d ",")
  gps_byo=$(echo ${gps} | tr "/" "," | cut -f 5 -d ",")
  gps=$(echo "scale=5;${gps_do} + ${gps_fun} / 60 + ${gps_byo} / 360000" | bc)
  gps_ref=$(cat /tmp/gps_data | grep "$2" | sed "s/$2//")
  test ${gps_ref} = $3 && printf "-"
  printf ${gps}
}

## 緯度・経度の取得
gps_latitude=$(coordinate exif:GPSLatitude: exif:GPSLatitudeRef: S)
gps_longitude=$(coordinate exif:GPSLongitude: exif:GPSLongitudeRef: W)

##HTMLファイル生成
echo "<!DOCTYPE html>" > photo.html
echo "<html lang='ja'>" >> photo.html
echo "<head>" >> photo.html
echo "<meta charset='UTF-8'>" >> photo.html
echo "<title>撮影日時・場所</title>" >> photo.html
echo "</head>" >> photo.html
echo "<body>" >> photo.html
echo "<p>ファイル名:$1<br>" >> photo.html
echo "撮影日:${photo_date}<br>" >> photo.html
echo "撮影時間:${photo_time}</p>" >> photo.html
echo "<p>撮影場所:<br>" >> photo.html
echo "<img width=${width} height=${height} src='https://map.yahooapis.jp/map/V1/static?appid=${yahoo_appid}&lat=${gps_latitude}&lon=${gps_longitude}&z=${scale}&width=${width}&height=${height}&pointer=on'>" >> photo.html
echo "</p>" >> photo.html
echo "</body>" >> photo.html
echo "</html>" >> photo.html

 それでは、シェルスクリプトを1行ずつ見ていきましょう。1行目は「シェバン」です。シェバンについては、第1回に説明しました。今までは「#!/bin/sh」を記述して、「sh」を「インタープリタ」(インタープリタについても第1回を参照)として利用していました。今回は「#!/bin/bash」として「Bash」を利用します。

 shは「Bourne Shell」と呼ばれる古くからあるシェルです。現在はBourne Shellではなく、代替となるシェルがリンクされています。次のコマンドで代替シェルを確認できます。

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 14 09:49 /bin/sh -> dash

 上はUbuntu 18.04 LTSでの実行例ですが、「dash」(Debian Almquist shell)というシェルが代替となっています。「緯度」と「経度」は同じ処理なので、「関数」にしておくと便利ですが、dashの場合、関数(fuction)が使えません。よって、関数が使えるBashをインタープリタとして利用しました。

 3行目の「#」で始まる行は「コメント」です。6行目、13行目、18行目、30行目、34行目もコメントになります。