Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit test
Einen wunderschönen erstmal...
Ich versuche seit kurzem Scripte zu schreiben und bin auf ein Problem gestoßen,wo ich leider nicht weiter weiß:
also mit dem Befehl "test -e Datei" kann man ja feststellen,ob eine Datei vorhanden ist.
Man kann damit ja wunderbar die if Verzweigung steuern.
So weit so gut...wie kann ich es aber benutzen wenn ich feststellen will ob es in einem Verzeichnis mindestens eine Datei mit der Endung z.B. ".tar" vorhanden ist????
Wenn ich es mit "test -e *.tar" versuche bekomme ich eine Meldung "binary operator expected"
Was mir noch aufgefallen ist,wenn in dem Verzeichnis nur eine Detei mit der Endung existiert,dann klappt es ja auch nur wenn es mehrere gibt nicht.
Gibt es etwa einen anderen Befehl um so was zu prüfen,oder muß da ein anderer Schalter gesetzt werden?
Ok, kleine Nachhilfe in Shell-Scripting...
if [ -n "$(ls *.txt)" ]; then
# min 1 Datei vorhanden
else
# keine Datei vorhanden
fi
Die Anweisung
[ -n "$(ls *.txt)" ]
ist das Gleiche wie
test -n `ls *.txt`
Wenn du noch genau wissen willst wieviele Dateien vorhanden sind, dann kannst du dies mit folgender Erweiterung:
Dateien=$(ls *.txt | wc -l | sed 's/.*\([0-9]\).*/\1/')
echo "Anzahl Dateien: $Dateien"
if [ $Dateien > 0 ]; then
echo "Min. 1 Datei vorhanden."
fi
Gruß
Robert
Danke Robert,daß Du mir so schnell geantworten hast.
Tja,die Antwort war,wie es fast immer so ist ganz einfach,ja ja irgendwann habe ich es mit den Skrypten auch mal verstanden :-)
Ein Problem ist da aber noch,und zwar kann ich auf diese Weise feststellen,ob folgende Dateien vorhanden sind,oder nicht und wieviele es sind,aber wenn es keine Dateien gibt,gibt es eine Fehlermeldung und zwar "No such File or Directory".
Es ist mir schon klar,daß es so sein muß (Diese meldung gibt es wenn man "ls" aufruft und keine passende Datei exsistiert)
Kann man es irgendwie umgehen oder anders machen(Damit diese Fehlermeldung erst garnicht auftritt)oder sollte man lieber ein kurzes Programm schreiben und es von dem Skrypt aufrufen.
Ich meine wo man als Übergabeparameter ein Pfad oder Dateiname gibt und das ein Rückgabewert liefert z.B. 0 für keine Datei 1 für eine usw.?
Danke im vorraus Sebastian
Bernhard Koschnick
29-03-2000, 03:18
Hallo Sebastian
Natürlich lässt sich ein Prog so aufbauen. Aber welchen Sinn macht es? Beim Rückgabewert (1) läuft alles, wie es soll. Bei Rückgabewert (o) aber wird gar nichts passieren. Erst wartet der User, dann sein Eindruck: "Das Prog taugt nichts. Es bleibt einfach hängen ohne erkennbaren Anlass. Hier ist doch nicht $Win, hier ist Linux!" Wär das in Deinem Sinne? ... Akzeptier ruhig Fehlermeldungen oder ersetz den Text durch einen anderen. Die Teilchen machen Sinn, auch wenn das "Weckklicken" manchmal lästig scheint.
Gruss
Bernhard
Christoph
29-03-2000, 09:53
Bernhard -
klar möchte Sebastian die Error-Messages von ls nicht haben: er hat ja eine eigene Fehlerroutine im entsprechende if-Zweig.
Sebastian -
leite einfach stderr von ls nach /dev/null mit "ls *.txt 2>/dev/null".
Christoph
Hallo!
Man muß es gar nicht so umständlich machen.
Wenn ls etwas nicht findet, bzw. eine Fehlermeldung zurück gibt, dann kannst du diese entweder direkt auswerten, oder den Status-Wert abfragen.
Das sähe dann so aus:
[ ls *.txt ] | | echo "Keine Datei da..."
oder so
DATEIEN=`ls *.txt`
if [ $? == 0 ]; then
ANZAHL=`echo $DATEIEN | wc -l`
echo "$ANZAHL Dateien da..."
else
echo "Keine Dateien da..."
fi
$? gibt den "Fehler-Status" der letzten Ausführung zurück. Wenn diese 0 ist, ist kein Fehler aufgetreten.
Übrigens, die SED-Anweisung in meinem obigen Beispiel stimmt so nicht. Ich wollte nur die Zahlen ausfiltern, aber das funktioniert so nicht. Muß ich selber noch mal schauen, was ich da übersehen habe.
Gruß
Robert
[Diese Nachricht wurde von robert am 29. März 2000 editiert.]
[Diese Nachricht wurde von robert am 29. März 2000 editiert.]
Sooo.... nach dem ich noch mal in meinen "Sed & Awk" reingeschaut habe, weiß ich wo ich meinen logischen Fehler bei SED gemacht habe...
Also hier noch mal die Anweisung mit SED um auch wirklich nur Zahlen für die Ausgabe zu filtern:
ls *.txt | wc -l | sed -e 's/[^0-9]*\([0-9]*\)[^0-9]*/\1/'
Robert
[Diese Nachricht wurde von robert am 29. März 2000 editiert.]
Ich danke Euch allen für diese Antworten.
Wie man es sieht gibt es wieder mehrere Wege ein Problem zu lösen,ich geh gleich da mal dran und hoffe´,daß ich um eine Erfahrung reicher werde.
Also Bernhard ich weiß ich bin bei Linux und nicht bei Windoof und eben deswegen muß man die Sachen nicht einfach so hinnehmen,wir wissen doch alle unter Linux ist alles möglich und jedes Problem läßt sich lösen.
Deswegen bin ich auch froh,daß es diese Foren gibt,weil,wie heißt es so schön:Warum soll man eine offene Türe gewaltsam aufbrechen,wenn man ein Problem hat,gibt es mit Sicherheit viele andere User,die schon die Antwort darauf wissen,und gerne(hoffe ich) einem helfen,
in diesem Sinne danke und bis zum nächsten Mal
Sebastian
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.