Anzeige:
Ergebnis 1 bis 10 von 10

Thema: if [ `diff datei1 datei2` ]; funzt nicht

  1. #1
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665

    Question if [ `diff datei1 datei2` ]; funzt nicht

    folgendes shell-script soll etwas tun, sobald zwei dateien unterschiedlich sind:

    Code:
    if [ `diff datei1 datei2` ]; then
    	echo "bla";
    fi
    falls die dateien nun aber unterschiedlich sind, werden alle verschiedenen zeilen in die eckigen klammern gepackt und das wird wegen zu vielen argumenten nicht interpretiert...

    gibt es eine möglichkeit, statt der ausgabe des befehls den rückgabe-wert einzusetzen, oder das irgendwie anders zu lösen?
    Geändert von BLUESCREEN3D (27-06-2003 um 16:18 Uhr)

  2. #2
    Registrierter Benutzer Avatar von pitu
    Registriert seit
    07.06.2002
    Ort
    Nürnberg
    Beiträge
    142
    PHP-Code:
    diff file1 file2 > /dev/null 2>&1
    if [ "$?" "1" ]; then
      
    echo "blah"
    fi 
    gruss,
    pitu
    11 Fehler in Windows, 88 Loesungen, 0 funktionieren.

    Dieser Beitrag steht unter der GNU Free Documentation License.

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.12.2002
    Ort
    Matrix
    Beiträge
    194

    Re: if [ `diff datei1 datei2` ]; funzt nicht

    Original geschrieben von BLUESCREEN3D
    gibt es eine möglichkeit, statt der ausgabe des befehls den rückgabe-wert einzusetzen, oder das irgendwie anders zu lösen?
    klar. geht ganz einfach:

    if diff datei1 datei2 >/dev/null; then
    ...
    fi

    diff hat mehrere rückkehrcodes: 0 = keine unterschiede, 1 = unterschiede, 2 = fehler

    such dir das passende aus.

    -j

  4. #4
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665

    thx

    Original geschrieben von pitu
    PHP-Code:
    diff file1 file2 > /dev/null 2>&
    kann man das nicht mit "diff file1 file2 2> /dev/null" abkürzen

  5. #5
    Registrierter Benutzer Avatar von pitu
    Registriert seit
    07.06.2002
    Ort
    Nürnberg
    Beiträge
    142
    Du hast mehrere ... nennen wir es pipes.

    STDIN ist sozusagen 0
    STDOUT ist 1
    STDERR ist 2

    Wenn du es nur mit 2>/dev/null machst, werden zwar alle Fehlermeldungen (STDERR) nach /dev/null geschrieben, aber nicht die normale Ausgabe (STDOUT).

    Bei diesem Beispiel wird die normale Ausgabe (STDOUT=1) nach /dev/null umgeleitet, da du die ja nicht auf dem Schirm haben willst. die 1 muss man in diesem Fall nicht expliziet angeben, ansonsten hiesse es 1>/dev/null.

    Ausserdem wird SDTERR nach STDOUT umgeleitet (2>&1) damit verschwindet es dann ebenfalls in /dev/null, da STDOUT ja dorthin umgeleitet wird. Das & bedeutet nur, dass du die Augabe nicht in ein File "1" umleitest.

    gruss,
    pitu
    11 Fehler in Windows, 88 Loesungen, 0 funktionieren.

    Dieser Beitrag steht unter der GNU Free Documentation License.

  6. #6
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Jaspers Post hab ich ja ganz übersehen - sowas wollte ich haben ^^

    @pitu, das mit de stdou, stderr usw. kenn ich, aber darum geht es doch garnicht - ich meine nur, dass man deinen befehl auch mit einem einfachen "&>" abkürzen kann...

  7. #7
    Registrierter Benutzer Avatar von pitu
    Registriert seit
    07.06.2002
    Ort
    Nürnberg
    Beiträge
    142
    achso, sorry

    Du hast recht, natuerlich kann man es auch abkuerzen, aber ich persoenlich halte das fuer eine stilfrage, so wie

    PHP-Code:
    for i in *; do 
    PHP-Code:
    for i in *
    do 
    wuensche dir eine gute nacht, man liest sich

    gruss,
    pitu
    11 Fehler in Windows, 88 Loesungen, 0 funktionieren.

    Dieser Beitrag steht unter der GNU Free Documentation License.

  8. #8
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Original geschrieben von pitu
    achso, sorry

    Du hast recht, natuerlich kann man es auch abkuerzen, aber ich persoenlich halte das fuer eine stilfrage
    das kenn ich

    z.B. bei C++ kann ich mir nicht erklären, warum die meisten Leute sowas wie
    Code:
    int main() {
    	cout << "hello, world" << endl;
    	}
    machen, anstatt die zusammengehörigen Klammern eines Blockes übersichtlich untereinander zu setzen:
    Code:
    int main()
    	{
    	cout << "hello, world" << endl;
    	}

  9. #9
    Registrierter Benutzer
    Registriert seit
    26.12.2002
    Ort
    Matrix
    Beiträge
    194
    Original geschrieben von pitu
    PHP-Code:
    diff file1 file2 > /dev/null 2>&1
    if [ "$?" "1" ]; then
      
    echo "blah"
    fi 
    das ist besser:

    if [ $? -eq 1 ]; then
    echo "blah"

    "=" ist für stringvergleiche. dein beispiel klappt zwar meistens, aber halt nicht immer (führende/nachfolgende leerzeichen)

    -j

  10. #10
    Registrierter Benutzer Avatar von pitu
    Registriert seit
    07.06.2002
    Ort
    Nürnberg
    Beiträge
    142
    Original geschrieben von BLUESCREEN3D
    das kenn ich

    z.B. bei C++ kann ich mir nicht erklären, warum die meisten Leute sowas wie
    Code:
    int main() {
    	cout << "hello, world" << endl;
    	}
    machen, anstatt die zusammengehörigen Klammern eines Blockes übersichtlich untereinander zu setzen:
    Code:
    int main()
    	{
    	cout << "hello, world" << endl;
    	}
    Das kann ich dir erklaeren. Das haengt von der logischen Betrachtungsweise des Codes ab.

    Die erste Betrachtungsweise ist dem nachempfunden, wie du es auch selber gesagt hast, dass nach dem "if" entweder ein einzelner Befehl, oder ein gesammter Block kommt. Du fasst also bei dieser Betrachtungsweise den Block als solches in einer logischen, gemeint ist formatier, Strucktur, die dem Kontrollbefehl folgt.. Die Klammer beginnen und schliessen damit den Block.
    Zu vergleichen ist das in etwa mit folgendem Shell-konstrukt:
    PHP-Code:
    for i in *
      do
        
    irgendetwas
      done 
    Hier wird das do vom done geschlossen und entspricht damit deinem zweiten, favorisierten Konstrukt.


    Ich persoenlich favoriesiere das Konstrukt deines erstn Beispiels. Hierbei ist die Sichtweise auf das Kontrollelement ausgerichtet. Das heisst, dass ich mit dem Kontrollelement, wenn es zutrifft, etwas starte und ich daher die durchfuehrung des Kontrollelements schliesse. Dies entspreich folgendem Shellkonstrukt:
    PHP-Code:
    if [ $i -eq 0 ]; then
      irgendetwas
    fi 
    (gruss an jasper )
    Wie du hier sehr leicht sehen kannst, wird hier wirklich das if mit dem fi geschlossen.

    Ich benutzer Syntaxhighlighting, und wenn ich di klammer darueber schreibe, dann habe ich in der Zeile in der der Block anfaengt ein highlighting, und damit einfach von der Sichtweise her die dazugehoerige Kontrollstruktur.

    Oder mit anderen Worten, bei der einen sichtweise gehoeren Kontrollelement und Block untrennbar zusammen und in der anderen Sichtweise folgt der Block einem Kontrollelement.
    Sichtweise rein formatierungstechnisch gesehen.

    gruss,
    pitu
    11 Fehler in Windows, 88 Loesungen, 0 funktionieren.

    Dieser Beitrag steht unter der GNU Free Documentation License.

Lesezeichen

Berechtigungen

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