wie sich der Befehl diff in einer if-Anweisung in einem Shell-Skript verhält

642
Yuvaraj

Ich habe folgenden Code ausprobiert ..

if diff f1.sh f2.sh; then echo Same else echo Different fi 

Hier .. In meinem Fall sind sowohl f1.sh als auch f2.sh unterschiedliche Dateien. Wenn also die Anweisung Different druckt (wie erwartet), wird jedoch die Bedingung falsch und die Steuerung ändert sich in eine andere Anweisung ... Wie geschieht das? Wie Bedingung ? wird falsch ..? Wie sich diese diff-Befehle hier verhalten .. Bitte erläutern Sie den Vorgang ausführlich .. Vielen Dank im Voraus (sorry, wenn mein Englisch zu schlecht ist ..)

0
Schauen Sie sich die Dokumentation von diff an, Ihre Verteilung sollte in / usr / share / docs oder gleichem Speicherort liegen. diff -a würde das tun und ist skriptfähig wie folgt: diff -a f1.sh f2.sh | cmd2 .... linuxdev2013 vor 7 Jahren 0
Ich habe mir die Dokumentation des Diff-Befehls angesehen und den Exit-Status gelesen. Ich wurde mit dem Exit-Status und den booleschen Werten verwirrt. Ich bin mir also nicht klar, wie es speziell für meinen oben genannten Fall funktioniert .. das ist ein Ort, um na zu wissen .. !! aber immer noch negative Stimmen für die Frage bekommen :( lächerlich Yuvaraj vor 7 Jahren 0

1 Antwort auf die Frage

4
jlliagre

Dies ist beabsichtigt. Wenn Sie sich die diffManual-Seite ansehen, sehen Sie folgende Aussage:

Der Beendigungsstatus ist 0, wenn die Eingänge gleich sind, 1, wenn unterschiedlich, 2, wenn es Probleme gibt.

Exit-Status 0bedeutet truefür die Shell, daher wird "Same" angezeigt. In beiden anderen möglichen Status wird "Anders" angezeigt, wenn nichts anderes als Null ist false.

Das ifVerhalten ist in der Shell-Manpage beschrieben, hier zum Beispiel bash:

if list; then list; [ elif list; then list; ] ... [ else list; ] fi 
  • Die if-Liste wird ausgeführt. Wenn der Beendigungsstatus null ist, lautet die Liste dann hingerichtet. Andernfalls wird jede Elif-Liste nacheinander ausgeführt, und falls vorhanden, wird sie beendet Status ist Null, die entsprechende Liste wird ausgeführt und der Befehl vervollständigt. Andernfalls wird die else-Liste ausgeführt, sofern vorhanden. Der Ausgangsstatus ist der Beendigungsstatus des zuletzt ausgeführten Befehls oder Null, wenn keine Bedingung vorliegt getestet wahr.
Hinzufügen einer ausführlichen Antwort von @jllagre mit einem allgemeinen Tipp, der möglicherweise nützlich ist. Wenn die Dinge nicht wie erwartet funktionieren, versuchen Sie, Ihren Code so umzuwandeln, dass er so wörtlich wie möglich ist. Das heißt, anstatt auf die Mindestanzahl von Zeichen hinzusteuern, um das beabsichtigte Ergebnis zu erzielen, gehen Sie in die entgegengesetzte Richtung. Zum Beispiel hätten Sie das wahrscheinlich schnell gelöst, wenn Sie den Code folgendermaßen umgeschrieben hätten: `diff f1.sh f2.sh> / dev / null 2> & 1; ret = $ ?; if ["$ ret" == "0"]; dann <... Zeug ...>; elif ["$ ret" == "1"]; dann <... anderes Zeug ...>; else <... Fehlerhandler-Typ stuff ...>; fi` Argonauts vor 7 Jahren 1
Das Dienstprogramm 'cmp' könnte für diesen Anwendungsfall eine bessere Wahl sein. Auf diese Weise erhalten Sie nicht den gesamten Spam-Spam (kann reduziert, aber nicht gelöscht werden, wenn Sie nicht nach / dev / null sichern). `cmp -s` gibt nichts an stdout aus. Das Ergebnis ist im Rückgabewert und verwendet die gleichen 3 Werte wie diff (0 ist gleich, 1 Diff, 2 ist Fehler). Argonauts vor 7 Jahren 1
Vielen Dank an alle .. Ich bin neu im Shell-Skript, also wurde ich gerade mit dem Exit-Statuswert und der Bewertung nach Booleschen Werten verwechselt. Jetzt bin ich klar .. Wirklich vielen Dank :) Yuvaraj vor 7 Jahren 0