Ich schreibe momentan an einem Shellskript zur Archivierung von Büchern einer Schülerbücherei. Es sieht bisher so aus, dass man, wenn man es in einer TTY aufruft, mit einem Menü in blauer Schrift auf weißem Hintegrund begrüßt wird, in dem Folgendes zur Option steht:
- Durchblättern
- Suchen
- neuer Eintrag
- Eintrag ändern
- Eintrag löschen
- Beenden
Ich habe das Programm „BiBo-Manager“ genannt, da die Bücherei „BiBo“ – was für „Bibliothek Bornbrook“ steht – heißt. Allerdings treten zur Zeit zwei wesentliche Probleme auf: Erstens bricht der weiße Hintergrund an Zeilenumbrüchen beim Blättern in den Einträgen ab, zweitens – und das ist die drastischere Problematik – funktioniert die Suchfunktion nicht. Ich zeige hier nun einmal das Skript für die Suche:
#!/bin/sh # buch_suchen [Modus] # Suchen von Einträgen anhand eines beliebigen Suchmusters [ -z "$BUCHDB" ] && exit 1 echo "" echo " Bitte geben Sie einen Suchbegriff ein." echo " --> \c" read SUCH echo "" cat $BUCHDB | grep $SUCH > buch.tmp ANZ=`cat buch.tmp | wc -l | tr -d ' '` if [ -z "$ANZ" -o "$ANZ" -eq 0 ] then # kein Eintrag gefunden echo " Für \"$SUCH\" wurde kein Eintrag gefunden. (Enter) \c" read EINGABE else # es wurden Zeilen gefunden ORGDB="$BUCHDB" export BUCHDB=buch.tmp buch_zeilen "$ORGB" "$1" fi
Beim Eingeben eines Stichwortes für die Suche wird auch, wie vorgesehen, das Suchergebnis – und es ist ein zutreffendes – in die temporäre Datei buch.tmp geschrieben, allerdings scheint die formatierte Ausgabe des Ergebnisses aus irgendeinem Grunde – warum auch immer – nicht zu funktionieren. Hier nun noch die Funktion buch_zeilen, die für die Durchführung von buch_suchen relevant ist:
#!/bin/sh # buch_zeilen [Originalbasis] [Modus] # Zeilenweises Auslesen des Archivs [ -z "$BUCHDB" ] && exit 1 DATEI=`cat "$BUCHDB"` ANZ=`echo "$DATEI" | wc -l | tr -d ' '` ZHL=0 while [ "$ZHL" -lt "$ANZ" ] do ZHL=`expr $ZHL + 1` ZEILE=`echo "$DATEI" | head -$ZHL | tail -1` echo "-------------------------------------------" echo "${ZHL}/${ANZ}" AUT=`echo "$ZEILE" | cut -d'#' -f1` TIT=`echo "$ZEILE" | cut -d'#' -f2` KTG=`echo "$ZEILE" | cut -d'#' -f3` VRL=`echo "$ZEILE" | cut -d'#' -f4` ISN=`echo "$ZEILE" | cut -d'#' -f5` INH=`echo "$ZEILE" | cut -d'#' -f6` ANM=`echo "$ZEILE" | cut -d'#' -f7` echo echo "$AUT - \"$TIT\" (${KTG})" echo " Verlag : $VRL" echo " Inhalt : $INH" echo " ISBN : $ISN" echo " Sonstiges : $ANM" echo if [ "$2" = "loeschen" ] then # Löschen echo " Soll dieser Eintrag gelöscht werden? (j/n) \c" read ANTW ; echo "" if [ -f "$1" -a "$ANTW" = "j" ] then # jetzt wird wirklich gelöscht cat $1 | grep -v "$ZEILE" > buch.rest cp buch.rest $1 # rm buch.rest # Quittieren echo "Der Eintrag wurde gelöscht." echo "(Enter)\c" ; read EINGABE fi elif [ "$2" = "aendern" ] then # Datensatz ändern echo " Soll dieser Eintrag geändert werden? (j/n) \c" read ANTW ; echo "" if [ -f "$1" -a "$ANTW" = "j" ] then # ändern heißt löschen ... cat $1 | grep -v "$ZEILE" > buch.rest cp buch.rest $1 rm buch.rest # ...und neu einschreiben export AUT TIT KTG VRL ISN INH ANM # originale Datenbasis export BUCHDB="$1" buch_neu # Quittieren echo "Der Eintrag wurde geändert." echo "(Enter)\c" ; read EINGABE fi else # Einfach nur Blättern echo "(Enter)\c" ; read EINGABE fi done
Ich bitte den, der sich in dem Bereich auskennt, mir, wenn es denn möglich ist, bei der Lösung dieses Problems zu helfen – am besten im Kommentar. Es wäre jedenfalls sehr nett.
Schreibe den ersten Kommentar