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