Ich habe ein Skript, das nach Dateien eines bestimmten Typs in einem angegebenen Verzeichnis sucht und, wenn sie vorhanden sind, eine Datei mit den Basisnamen generiert, bevor ein erstellt wird tar.gz. Nach der Komprimierung überprüfe ich, ob der Tarball alle Dateien enthält, indem ich einen Diff-Check durchführe.Untersuchen eines Diff-Fehlers in einem Bash-Skript, wenn Variablen anstelle von fest codierten Dateinamen verwendet werden
Ich habe ein Paar Variablen erstellt, die die vorkomprimierte Dateiliste und die im Tarball gefundenen sind. Wenn ich eine wenn Anweisung einschließlich diff laufen der Variablen, erhalte ich diesen Fehler:
diff: missing operand after `/my/original/dir/filelist.txt'
diff: Try `diff --help' for more information.
Ich arbeitete dies um, indem sie die Dateien verweisen selbst, anstatt die angelegten Variablen. Wenn ich die if-Anweisung in einem separaten Bash-Skript ausführe, funktioniert es problemlos mit den Variablen, so dass ich völlig verloren bin, was mein Fehler in meinem größeren Skript ist. Im Folgenden stelle ich sowohl das Snippet aus dem großen Skript als auch die diff-Anweisung als eigenes Skript zur Verfügung.
Die if diff in seinem eigenen Skript:
#!/bin/sh
filelist=(filelist.txt)
tarfiles=(tarfiles.txt)
#differences=$(diff filelist.txt tarfiles.txt) #Uncomment if below fails
differences=$(diff $filelist $tarfiles)
if $differences > /dev/null ; then
echo Same
else
echo Different
fi
Die oben funktioniert gut.
einschließlich Nun ist diese am Ende meiner größeren Skript:
TARFILES=$(tar -tzf "$ARCHIVES/tarredfiles.tar.gz" | awk -F/ '{ if($NF != "") print $NF }' > $LOGS/tarfiles.txt)
FILELIST=($LOGS/filelist.txt)
#Check to see if it all worked
DIFF=$(diff $FILELIST $TARFILES)
cd $LOGS #I shouldn't need to do this but I do as a safety mechanism
#if diff filelist.txt tarfiles.txt > /dev/null ; then
if diff $FILELIST $TARFILES > /dev/null ; then
echo "Today's files have been archived and checked."
else
echo "Some or none of today's files have been archived, check the logs to find the error."
echo (diff $TARFILES $FILELIST) > $LOGS/$(date '+%Y%m%d')errors.txt
fi
Ich habe versucht, die Variablen in „“ umschließt und es scheint keinen Unterschied zu machen.
außerhalb Ihres Skripts, haben Sie ein kleines Testverzeichnis dafür erstellt? Haben Sie 'cat filelist.txt tarfiles.txt' gemacht und bestätigt (vorausgesetzt, dass die Dateien korrekt sind), dass diese Listen in der gleichen Sortierreihenfolge sind, dass das Format der Auflistung gleich ist, dass es keine führenden oder nachgestellten Leerzeichen gibt Linien? Zuletzt haben Sie sich die Ausgabe (aus der cmd-Zeile) von 'diff filelst.txt tarfiles.txt' angesehen? Während Ihr Code angemessen aussieht, wissen wir nicht genau, wie Ihr Fehler aussieht UND welche Tests Sie an Ihrem Projekt durchgeführt haben. Viel Glück.! – shellter
Der Fehler msg 'fehlende Operand nach" /my/original/dir/filelist.txt "' zeigt an, dass die Variable für tarfiles nicht in der cmd Zeile erscheint. Verwenden Sie 'set -vx', um zu sehen, dass Code mit Zeilen ausgeführt wird, die mit' + 'beginnen, was anzeigt, dass der exakte Befehl mit allen Variablen ausgeführt wird, die auf ihre Werte erweitert sind. Es tut mir leid, aber ich habe verpasst, dass du deine Fehlermitteilungen klar beschrieben hast, aber das Bestätigen deiner Daten ist immer noch ein wichtiger Schritt. Viel Glück. – shellter
Vielen Dank für die Tipps zur Verwendung von set-vx. Dies wird sehr nützlich für mich sein, wenn ich mehr Skripte schreibe. – FocusedEnergy