Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Problem mit test

  1. #1
    sky-fox
    Gast

    Post 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?

  2. #2
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Ok, kleine Nachhilfe in Shell-Scripting...

    Code:
    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:

    Code:
    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

  3. #3
    sky-fox
    Gast

    Question

    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

  4. #4
    Bernhard Koschnick
    Gast

    Smile

    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

  5. #5
    Registrierter Benutzer
    Registriert seit
    21.06.1999
    Beiträge
    677

    Post

    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

  6. #6
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Talking

    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:

    Code:
    [ 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.]

  7. #7
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Smile

    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:

    Code:
    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.]

  8. #8
    sky-fox
    Gast

    Thumbs up

    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •