#!/bin/bash
# *******************************************************
# file: weather.sh
# date: 2005-02-21
# author: Marko Schulz - <info@perlXpress.de>
# description: Die Wettervorhersage im Internet abfragen.
# *******************************************************
# URL der Internetseite von der das Wetter abgefragt werden soll.
url="http://www.wetter.com/v2/?SID=&LANG=DE"
# *******************************************************
# ersten Buchstarben eines Wortes gross schreiben...
function firstUpper() {
local string=$1
for word in $string; do
# Den ersten Buchstaben mit cut extraieren und gross schreiben.
local first="$( echo $word | cut -c1 | tr '[:lower:]' '[:upper:]' )"
# Den Rest des Wortes klein schreiben und an [first] anhaengen.
word="$first$( echo $word | cut -c2-${#word} | tr '[:upper:]' '[:lower:]' )"
# Nun den Satz zusammen setzen.
phrase="$phrase $word"
done
echo $phrase
}
# *******************************************************
# P R O G R A M M A B L A U F
# Temporaere Datei anlegen...
tempout="/tmp/weather.$$"
# Wetter Datenbank anlegen, wenn diese noch nicht existiert.
[ -f ${HOME}/.wetter ] && touch ${HOME}/.wetter
# Temporaere Datei wieder loeschen
# wenn ein SIGHUP Signal gesendet wird.
trap "rm -f $tempout" 0 1 15
# Ort als Uebergabeparameter...
location=${1:-""}
# Noch kurz eine Meldung wie man das Programm verwendet,
# wenn kein Ort angegeben wurde und mit exit beenden.
[ -z "$location" ] && echo -e "\aUsage: $(basename $0) <LOCATION>" && exit 1
# Ort klein schreiben, damit wir beim Vergleich
# nicht auf gross/klein Schreibung achten muessen.
location=$( echo $location | tr '[:upper:]' '[:lower:]' )
# Zur Anzeige werden wir jeden Buchstaben eines Wortes im Satz gross schreiben.
display=$( firstUpper "$location" )
echo "*********************************************************"
echo "$( basename $0 ) - Zeigt Informationen zum Wetter an"
echo "Copyright (c) 2005 - Marko Schulz - http://perlXpress.de"
echo "*********************************************************"
# Daten aus Datenbank lesen und [name] mit [location] vergleichen. Ist der
# Vergleich erfolgreich, so wird die dazugehoerige [id] ausgegeben.
while read name number; do
name=$( echo $name | tr '[:upper:]' '[:lower:]' | sed 's/_/ /g' )
[ "$location" = "$name" ] && export id=$number
done < ${HOME}/.wetter
if [ -z "$id" ]; then
# Der gesuchte Ort ist noch nicht in der lokalen Wetter Datenbank vorhanden,
# also muessen wir eine Erweiterte Sucheanfrage vornehmen.
lynx -dump "${url}&LOC=7004&LOCFROM=0001&LOCFULL=7000&search=${location}" > $tempout
# Der gesuchte Ort wurde sofort gefunden.
if grep 'Aktuell:' $tempout >/dev/null; then
# Aus der Neuen URL extrieren wir die ID.
id=$( grep "$url&LOC=7000&LOCFROM=7000&type=WORLD&id=" $tempout | head -n1 | \
sed 's/\(.*\)id=\(.*\)/\2/g' )
# User fragen ob er den neuen Ort in Wetter Datenbank speichern will.
echo -e "\nMöchten Sie »\033[1m$display\033[0m« in Ihrer Wetter Datenbank aufnehmen (J/N):" && read save
# User Eingabe in gross Buchstaben umwandeln.
save="$( echo $save | tr '[:lower:]' '[:upper:]' )"
# Leerzeichen mit Underline ersetzen...
location=$( echo $location | sed 's/ \{1,\}/_/g' )
# Ist die Wetterdatenbank scheibbar und die Antwort J,
# dann speichern wir den Eintrag in die Wetter Datenbank.
[ -w ${HOME}/.wetter -a "$save" = "J" ] && echo -e "${location}\t${id}" >> ${HOME}/.wetter
else
# Leider war die Suche erfolglos, wir beenden das Programm mit entsprechender Meldung.
if grep 'Ihre Suche war leider erfolglos' $tempout >/dev/null; then
echo -e "\aIhre Suche nach »\033[1m$display\033[0m« war leider erfolglos" && exit 1
fi
# Temporaere Datei auslesen und Suchergebnis ermitteln und anzeigen.
cat $tempout | perl -e '
my $line=1;
my $match=0;
my $anzahl=0;
while (<>) {
$_ =~ s/^\s+//g;
if ($_ =~ /Ihre Suche nach »'$display'« ergab ([0-9]+) Treffer/i) {
$anzahl=$1;
$match=$line;
}
$line++;
print $_ if ($line > $match && $line <= ($match+$anzahl+1));
}
print "\nBitte geben Sie die Zahl vor dem gewünschten Ort ein:" if ($match);'
# User Eingebe in [mumber] speichern.
[ -z "$number" ] && read number
# Die ausgewaehlte URL ermitteln und in [newurl] speichern.
newurl=$( sed -n '/^Verweise/,$ p' $tempout | \
sed 's/^ \{1,\}//g' | \
grep "^$number" | \
sed 's/^.*http/http/' )
# Aus der Neuen URL extraieren wir die ID.
id=$( echo $newurl | sed 's/\(.*\)id=\(.*\)/\2/g' )
# User fragen ob er den neuen Ort in Wetter Datenbank speichern will.
echo -e "\nMöchten Sie »\033[1m$display\033[0m« in Ihrer Wetter Datenbank aufnehmen (J/N):" && read save
# User Eingabe in gross Buchstaben umwandeln.
save="$( echo $save | tr '[:lower:]' '[:upper:]' )"
# Leerzeichen mit Underline ersetzen...
location=$( echo $location | sed 's/ \{1,\}/_/g' )
# Ist die Wetterdatenbank scheibbar und die Antwort J,
# dann speichern wir den Eintrag in die Wetter Datenbank.
[ -w ${HOME}/.wetter -a "$save" = "J" ] && echo -e "${location}\t${id}" >> ${HOME}/.wetter
# Nun holen wir mit der ermittelten URL die neue
# Seite und speichern das Ergebnis in [tempout].
lynx -dump "$newurl" > $tempout
fi
else
# Die Wetter Seite mit lynx holen und Ergebnis in [tempout] speichern.
lynx -dump "${url}&LOC=7000&LOCFROM=0202&type=WORLD&id=${id}" > $tempout
fi
# AUSGABE
#
# Ueberschrift
echo -e "\nWetterübersicht für \033[1m$display\033[0m"
# Temporaere Datei einlesen und Interesannte Teile isolieren.
sed -n '/^ \{1,\}Aktuell:/, /^ \{1,\}Sicht:/ p' $tempout | \
# Leerzeichen am Anfang entfernen.
sed 's/^ \{1,\}//g' | \
# Das Wort Ortszeit aus der Zeile Aktuell: entfernen und ein Zeilenumbruch hinzufuegen.
sed 's/^\(Aktuell:\) \(.*\) \(Ortszeit\)/\1 \2\n/g'
echo
# *******************************************************
# end of this script...