2016-04-22 3 views
0

Ich schreibe ein Shell-Skript, das über mein ./tests-Verzeichnis läuft und den Befehl unix diff verwendet, um .in und .out-Dateien für mein C-Programm miteinander zu vergleichen. Hier ist mein Shell-Skript:Wie gibt man "bestanden" aus, wenn ein Diff-Befehl keinen Unterschied in bash ergibt?

#! /usr/bin/env bash 

count=0 

# Loop through test files 
for t in tests/*.in; do 
echo '================================================================' 
echo '       Test' $count 
echo '================================================================' 
echo 'Testing' $t '...' 

# Output results to (test).res 
(./snapshot < $t) > "${t%.*}.res" 

# Test with diff against the (test).out files 
diff "${t%.*}.res" "${t%.*}.out" 

echo '================================================================' 
echo '       Memcheck 
echo '================================================================' 

# Output results to (test).res 
(valgrind ./snapshot < $t) > "${t%.*}.res" 

count=$((count+1)) 

done 

Meine Frage ist, wie kann ich eine if-Anweisung an das Skript hinzufügen, die Ausgabe ‚bestanden‘, wenn der Befehl diff ergibt keinen Unterschied? z.B.

Pseudocode:

if ((diff res_file out_file) == '') { 
    echo 'Passed' 
} else { 
    printf "Failed\n\n" 
    diff res_file out_file 
} 
+0

Ich habe irgendwo gelesen, for Schleifen sollten nicht verwendet werden, um durch Dateien in einem Verzeichnis zu iterieren. aber ich kann mich nicht erinnern, wo. – sjsam

+0

Wissen Sie, warum oder was wäre das geeignete Werkzeug, um stattdessen zu verwenden? – joshuatvernon

+0

Der Artikel, den ich gelesen habe, schlug eine "while" -Schleife vor. Aber Sie können diese Kommentare vernachlässigen, es sei denn, jemand bestätigt es, oder ich kann die Quelle finden – sjsam

Antwort

3

Erhalten und den Exit-Code aus dem Diff-Befehl überprüfen. diff hat einen Exit-Code von 0, wenn keine Unterschiede gefunden wurden.

diff ... 
ret=$? 

if [[ $ret -eq 0 ]]; then 
    echo "passed." 
else 
    echo "failed." 
fi 
2

Die Antwort von @jstills für mich gearbeitet jedoch geändert ich es leicht und dachte, dass ich mein Ergebnis veröffentlichen würde als zu einer Antwort andere

zu helfen Sobald ich verstand, dass diff einen Exit-Code von 0 hat Ich habe meinen Code dahingehend geändert. Es prüft, ob Diff mit 0 oder> 1 für jeden Unterschied existiert, wenn ich es richtig verstehe. Mein Code sendet dann die Ausgabe von diff an/dev/null, so dass es nicht angezeigt wird, um stdout und ich dann meine Prüfung und Druck bestanden oder fehlgeschlagen, um die stdout und wenn die Unterschiede mit sdiff fehlgeschlagen, die Unterschiede nebeneinander angezeigt.

if diff "${t%.*}.res" "${t%.*}.out" >/dev/null; then 
    printf "Passed\n" 
else 
    printf "Failed\n" 
    sdiff "${t%.*}.res" "${t%.*}.out" 
fi 
+1

Du könntest ''/dev/null' in '>/dev/null 2> & 1' ändern. Im aktuellen Szenario werden Diff-Fehler weiterhin in stdout ausgegeben. Siehe [dies] (http://www.cyberciti.biz/faq/how-to-redirect-output-and-errors-to-devnull/) – sjsam

+0

@sjsam Gute Ergänzung, zu meinem Skript hinzugefügt. – joshuatvernon

Verwandte Themen