Unterschiede beim Inhalt einer Datei

349
Unix4fun

Ich versuche, zwei Dateien zu vergleichen und den Inhalt zu vergleichen. Wenn sie sich unterscheiden, senden Sie eine E-Mail. Unten ist mein Skript, das ich aus irgendeinem Grund nicht zur Arbeit bekommen kann. Anregungen sind willkommen.

#!/bin/bash # This script alert.sh runs every hour in cron # Created march 15, 2018 Author Dave Taylor  # Variables frm="Datafile-Monitor@mycompany.com"  # For testing email and script recipients="dave@mycompany.com"   # This is the Data file checked every Midnight for website results done by curdata.sh script. Results go to the curfile.fil current=/scripts/results/curfile.fil  # This is the NEW data output file where website is checked every hour done by newdata.sh script. Results go to the datafile.fil new=/scripts/results/datafile.fil  dpd=`cat /scripts/results/datafile.fil` dte=`/bin/date`   # check if the contents of the file has changed since midnight.  if diff $current $new &>/dev/null  then  # Log it echo "$dte" >> /var/log/datapod echo "Data file is $dpd" >> /var/log/datafile  else # Create the message  echo "Current STL Datafile has changed TO:$dpd" > /scripts/results/mesg  # send the email mail -s "Alert Data File has changed" -r "$frm" $recipients < /scripts/results/mesg  sleep 3  #Now we update the current data file with the most up to date info. cat /scripts/results/datafile.fil > /scripts/results/curfile.fil fi 
0
Wie scheitert es? Was haben Sie getan, um es zu debuggen? tripleee vor 6 Jahren 3
Sie benötigen ein "!", Um die Prüfung in der "if" -Anweisung zu negieren, da Sie auf einen Fehlerzustand prüfen. dsstorefile1 vor 6 Jahren 0
Verwenden Sie `set -x`, um` bash` für jeden folgenden Befehl zu drucken. Auf diese Weise wissen Sie, was ausgeführt wird (Hinweis: Der Befehl, um zum normalen Verhalten zurückzukehren, lautet `set + x`, falls Sie dies jemals benötigen). Kamil Maciorowski vor 6 Jahren 0

1 Antwort auf die Frage

-1
Sam

Versuche dies:

#!/bin/bash frm="Datafile-Monitor@mycompany.com" recipients="dave@mycompany.com" current=/scripts/results/curfile.fil new=/scripts/results/datafile.fil log=/var/log/datafile msgfile=/scripts/results/mesg dte=`/bin/date` diff $current $new &>/dev/null if [ $? -eq 0 ]; then echo "$: Data file is: $new " >> $log else echo "Current STL Datafile has changed TO: " > $msgfile cat $new >> $msgfile mail -s "Alert! Data File has changed" -r "$frm" $recipients < $msgfile sleep 3 cat $new > $current echo "$: Data file has changed. Sent mail to $recipients" >> $log fi 
Die Syntax `if diff $ current $ new` ist weit vorzuziehen von` diff; wenn [$? -eq 0] `Das ist also keine wirkliche Verbesserung. Im Allgemeinen sind auch die nicht zitierten Dateinamen ziemlich nervig. Siehe auch http://shellcheck.net/ für Syntaxprüfungen. tripleee vor 6 Jahren 1
Dies scheint eine [Try this!] - Antwort (https://meta.stackexchange.com/a/196188) zu sein. Erklären Sie, warum Sie möchten, dass der Fragesteller das versucht und was Sie geändert haben. Tiago Caldeira vor 6 Jahren 2