T
Tallatronic
Gast
Hallo Leute, ich bin der Talle und neu hier im Forum. Ich studiere derzeit online Medieninformatik in Brandenburg und wir beschäftigen uns im Betriebssysteme Kurs mit Shellskripten. Ich habe mich hier im Forum registriert um euch zu meinem shellskript zu befragen.
Die Aufgabe ist folgende:
"Schreiben Sie ein Shell-Skript, mit dem alle mehrfach hintereinander
vorkommenden Kommentarzeilen und Leerzeilen einer Datei durch
jeweils eine Leerzeile ersetzt werden. Das Shell-Skript soll sowohl auf
eine Datei wie auch für einen ganzen Baum angewandt werden können.
Die erzeugte neue Datei soll die Endung .red erhalten. Sofern ein
Verzeichnis angegeben wird, sollen selbstverständlich nur die darin
enthaltenen Textdateien umgewandelt werden. Ein Test, ob es sich um
Textdateien handelt muss vom Skript vorgenommen werden."
Mein Skript funktioniert auch grobgesehen wie beschrieben
Nun will ich aber nicht das mein "grep"-Kommando in Zeile 44 etwas ausspuckt also wollte ich "grep -q" verwenden aber das geht nicht. Im manual steht "-q" als "User Command", womit ich leider nichts anfangen kann. Meine Alternative Idee wäre den output auf dev/null umzuleiten, aber das finde ich etwas umständlich wenn es doch so ein tolles Kommando für grep gibt
Das andere ist das ich eigentlich noch einen Hinweis schreiben wollte wenn es sich beim Übergabeparameter um eine Datei handelt, diese aber keine .txt ist. Kann ich das in der for-Schleife in Zeile 24 implementieren oder muss ich die if-Schleife am Anfang umbauen?
Und zu guter letzt, was sagt ihr zur effizienz des skripts? Ich weiß es ist wahrscheinlich tierisch umständlich geschrieben, mein programmierprof hat mir schon im ersten Semester gesagt das ich sehr "speziell" programmiere
Wo kann ich mir was einsparen?
Ich würde mich über eure Meinungen und Hilfestellungen sehr freuen!
Schöne Grüße,
Talle
Die Aufgabe ist folgende:
"Schreiben Sie ein Shell-Skript, mit dem alle mehrfach hintereinander
vorkommenden Kommentarzeilen und Leerzeilen einer Datei durch
jeweils eine Leerzeile ersetzt werden. Das Shell-Skript soll sowohl auf
eine Datei wie auch für einen ganzen Baum angewandt werden können.
Die erzeugte neue Datei soll die Endung .red erhalten. Sofern ein
Verzeichnis angegeben wird, sollen selbstverständlich nur die darin
enthaltenen Textdateien umgewandelt werden. Ein Test, ob es sich um
Textdateien handelt muss vom Skript vorgenommen werden."
Mein Skript funktioniert auch grobgesehen wie beschrieben
Code:
#!/bin/bash
# Bildschirm wird geleert
clear
# Debugmodus aktiviert
set -x
# variable zeile0 wird fuer ersten Zeilenvergleich initialisiert
zeile0="MT"
# If-Schleife: (if) es wurde ein Parameter uebergebn und dieser ist entweder ein file oder directory
# (elif) es wurde ein Parameter uebergeben, der weder file noch directory ist
# (else) es wurde KEIN Parameter uebergeben
if [ $# != 0 ] && ([ -f $1 ] || [ -d $1 ]);
then
# for-Schleife die alle Dateien im findet die auf Uebergabeparameter 1 zutreffen und die Endung .txt haben
for i in `find $1 -name "*.txt"`
do
# Counter wird mit 1 initialisiert
n=1
echo "Entferne alle doppelten Kommentarzeilen und Leerzeilen im Dokument: $i ..."
sleep 2
# while-Schleife welche die Datei(en) der for-schleife durchgeht und zeilenweise liest
# und in entsprechende Variablen (zeile1, zeile2, ...) speichert
while read line
do
eval "zeile${n}=\"$line\""
# if-Schleife welche die aktuelle Zeile mit der vorherigen vergleicht. Sind sie ungleich wird die Zeile in die
# Datei $1.red hinzugefuegt sind die Zeilen gleich, so wird eine Leerzeile in die .red Datei gehaengt
if ( cat text4.txt | grep '.*#' || [ -z "\$zeile$n" ]) && [ "$(eval echo "\$zeile$n")" = "$(eval echo "\$zeile`expr $n - 1`")" ]
then
echo "" >> ${i}.red
else
echo $line >> ${i}.red
n=`expr $n + 1`
fi
done <$i
n=1
echo "Ergebnis in ${i}.red gespeichert!"
echo ""
done
elif [ $# != 0 ]
then
echo "Der angegebene Parameter ist weder Datei noch Verzeichnis!"
else
echo "Es wurde kein Parameter angegeben!"
fi
Nun will ich aber nicht das mein "grep"-Kommando in Zeile 44 etwas ausspuckt also wollte ich "grep -q" verwenden aber das geht nicht. Im manual steht "-q" als "User Command", womit ich leider nichts anfangen kann. Meine Alternative Idee wäre den output auf dev/null umzuleiten, aber das finde ich etwas umständlich wenn es doch so ein tolles Kommando für grep gibt
Das andere ist das ich eigentlich noch einen Hinweis schreiben wollte wenn es sich beim Übergabeparameter um eine Datei handelt, diese aber keine .txt ist. Kann ich das in der for-Schleife in Zeile 24 implementieren oder muss ich die if-Schleife am Anfang umbauen?
Und zu guter letzt, was sagt ihr zur effizienz des skripts? Ich weiß es ist wahrscheinlich tierisch umständlich geschrieben, mein programmierprof hat mir schon im ersten Semester gesagt das ich sehr "speziell" programmiere
Wo kann ich mir was einsparen?
Ich würde mich über eure Meinungen und Hilfestellungen sehr freuen!
Schöne Grüße,
Talle