PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit test



sky-fox
23-03-2000, 00:06
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?

robert
23-03-2000, 01:29
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

sky-fox
28-03-2000, 20:50
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

robert
29-03-2000, 15:25
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.]

robert
29-03-2000, 16:32
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.]

sky-fox
29-03-2000, 21:54
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