2017-09-08 2 views
-5

Ein Programm, das in einer Datei als agument dauert 1 und eine Zeit in Sekunden in Argumente 2, und dann wird das Programm prüfen, ob:Datei Überprüfung Shell-Skript

  1. Die Datei existiert
  2. Wenn Datei wurde geändert

.

#!/bin/bash 
file=$1 
sleeptime=$2 
bool=true 

if [ -e $file ]; then 
    thetime=$(date -r $file "+%s") 
    newtime=$(date -r $file "+%s") 
    while "$bool" = true 
    do 
     sleep $sleeptime 
     newtime=$(date -r $file "+%s") 
     if [ "$thetime" -ne "$newtime" ]; then 
      bool=false 
      echo "Filen $file ble endret" 
     fi 
     if [ ! -e $file ]; then 
      bool=false 
      echo "Filen $file ble slettet" 
     fi 
    done 
fi 
if [ ! -e $file ]; then 
    while "$bool" = true 
    do 
     sleep $sleeptime 
     if [ -e $file ]; then 
      bool=false 
      echo "Filen $file ble opprettet" 
     fi 
    done 
fi 
+4

Sie sollten eine Bash-Referenz dazu lesen, wie 'if' und' while' funktionieren. – Kevin

+7

Bitte fügen Sie Ihren Code in [shellcheck.net] (http://www.shellcheck.net/) ein und adressieren Sie die Fehler und Warnungen, die er identifizieren wird. Wenn Sie danach immer noch Probleme haben oder Ihre Nachrichten nicht verstehen, dann kommen Sie zu SO und stellen Sie eine Frage. – John1024

Antwort

0

, dass etwas so sein würde:

#!/bin/bash 
file=$1 
sleeptime=$2 
while :; do 
    sleep "$sleeptime" 
    if [ -f "$file" ] ; then 
     if [ "$file" -nt ".tag.$file" ] ; then 
      echo "Not removed $file, because it was changed" 
     else 
      rm "$file" 
      rm ".tag.$file" 
      echo "File $file was deleted." 
     fi 
    else 
     touch "$file" 
     touch ".tag.$file" 
     echo "File $file was created." 
    fi 
done 

Hinweise:

  • aufgeräumte einen Teil des Codes.
  • siehe man test.
  • Großbuchstaben Variablen werden normalerweise für Umgebungsvariablen verwendet.
+1

Hier ist noch viel kaputt (fehlende Zitate meist). Könnten Sie versuchen, dies http://shellcheck.net/ zu erreichen? –

+0

Zitieren?Ich habe es auf meiner Linux-Box ausgeführt und nur ein ';' gefehlt (tut mir leid, ich sehe es; ich nehme an, '$ file' enthält keine Leerzeichen) –

1

Bash ist ziemlich schwer zu bekommen, können Sie ein paar Hinweise zu geben:

  • Subbefehle in Bedingungen sind eine etwas heikel, können Sie es in einer Subshell mit Substitution, wenn der Ausdruck in der Regel ausgeführt werden soll enthält Variablen, die von $(), nicht () (explained in this SO question)

  • while getan wird, muss von ifdo, getrennt werden.210 entweder durch ein Semikolon oder durch eine neue Zeile

  • testing conditions in bash ist ein bisschen anders aus anderen Sprachen, in Ihrem Fall -f Operator prüft, um eine normale Datei ist (siehe weiter file testing operators)

  • es in der Regel besser Variablen zu zitieren in Bedingungen und Variablen an Befehle für den Fall übergeben sie Sonderzeichen enthalten (die sonst ausgewertet werden würden)

  • nicht sicher, was sollte die Natur der Datei "wurde nicht geändert" Anspruch, aber wahrscheinlich ist der einfachste Ansatz zu sein testen, wenn es Größe geändert hat, für einen Anfang der -s Betreiber prüft, ob Größe einer Datei mehr als Null

  • ist, wie es in einem Kommentar anwendungsspezifischen Variablen Klein Konvention sein sollte, mit diesen Anpassungen

Ihr Code durch wies darauf hin, ist:

#!/bin/bash 

file=$1 
sleeptime=$2 
while ($(sleep $sleeptime)); do 
    if [ ! -f "$file" ]; then 
     touch $file 
     echo "File $file was created." 
    elif [ ! -s "$file" ]; then 
     rm $file 
     echo "File $file was deleted." 
    fi 
done 
+3

Das Zitieren wird in Argumenten für' touch' und 'rm' benötigt nicht nur zu '['. Und siehe vierten Absatz von http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html re: Namenskonventionen für Variablen (Großbuchstabennamen werden für Variablen mit der Bedeutung für die Shell oder das Betriebssystem verwendet; Kleinbuchstaben sind garantiert sicher für die Anwendung). –

+0

@Charles Duffy fair Punkte, bearbeitet –

Verwandte Themen