Bash while-Schleife, die zwischen zwei Zeiten
Ich versuche, mich zum schreiben eines bash-Skripts, die Schleife, wenn die Uhrzeit wird nach einer bestimmten Zeit und bis zu einem gewissen Zeitpunkt. Hier ist, was ich habe, aber es gibt mir eine Fehlermeldung;
#!/bin/bash
while [ date +"%T" -gt '06:00:00' && date +"%T" -lt '21:00:00'];
do
##echo `php mainstatquery.php`
echo "Hello World";
sleep 5;
done
- und dies ist der Fehler,
./timer.sh: line 3: [: missing `]'
Wenn jemand könnte mich in die richtige Richtung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine einfache Möglichkeit, zu verstehen, Ihre
while
Probleme:Den
[
ist eine wirkliche Unix-Befehl. Tunls /bin/[
und du wirst sehen. Es ist ein link zu der/bin/test
Befehl. Tunman test
von der Befehlszeile aus und sehen Sie die verschiedenen tests, die getan werden kann.Was die
while
führt der Befehl, den Sie geben, und wenn es gibt eine null exit status, diewhile
Aussage wird als wahr und die Anweisung wird fortgesetzt. Sie können Dinge wie diese:Alle
test
Befehl tut, ist eine Art von Prüfung (Datei-tests, tests der Gleichheit, etc.) und eine null, wenn die Aussage wahr ist und null sonst:Werfen Sie einen Blick auf die manpage für
test
und du wirst sehen, alle gültigen tests. Diese:ist das gleiche wie
Let ' s gehen über ein paar Dinge hier:
test
Befehl.Den
test
Befehl nicht ausführen Befehl intern. Was Sie tun müssen, ist, die diesen Befehl in$(..)
und wahrscheinlich verwenden Sie Anführungszeichen, um es zu spielen sicher. Also:&&
ist kein Gültiger operator in dertest
Befehl. Was Sie wahrscheinlich wollen, ist-a
ist die und konjunktive für das Zusammenfügen von zwei tests intest
.Diese geben Ihnen:
Gibt es zwei separate größer als test-Operatoren für Vergleiche. Eine für Saiten und eine für Integer-zahlen. Die
-gt
ist der test für Ganzzahlen. Da bist du im Umgang mit Zeichenfolgen, die Sie verwenden müssen>
:while test "$(date +"%T")" > '06:00:00' -a "$(date +"%T")" < '21:00:00'
Als alternative, Sie hätte auch die
&&
Konjunktiv statt-a
, aber jede Seite des&&
müsste separaten test-Aussagen:Nun, lasst uns wandeln die
test
syntax zurück[...]
da ist es einfacher auf die AugenODER
Durch die Art und Weise, die internen
[[...]]
ist besser-vor allem mit den>
Zeichen, weil es interpretiert werden kann, die von der shell als eine Datei umleiten.ODER
Kann man nicht vergleichen eine ganze Stunde so.
Als Sie nur die überprüfung der Stunde (6<=x<=21), verwenden Sie
date "+%H"
zu tun:Berücksichtigen auch, dass die
date
Ausdruck aufgerufen werden, mit$()
zu machen, das Ergebnis zu erhalten. Und IhreSchließlich, der logische Zustand ist nicht gut geschrieben. Die besten POSIX empfohlen Weg ist:
%T
- format, mit führenden Nullen Hinzugefügt einstellige Stunden.while [ $(date +"%T") -gt "06:00:00" ] && [ $(date +"%T") -lt "21:00:00" ];
erhalten Sie eine./a: line 3: [: 00:12:27: integer expression expected
-lt
als ein string-Vergleich, was es nicht ist. Wenn Sie vergleichen wollen%T
's müssen Sie etwas weniger tragbar wie[[ $(date +%T) > 06:00:00 ]]
$ if [[ $(date +%T) < 06:00:00 ]]; then echo yes; fi yes
. So ein Interessantes Verhalten, gut zu wissen @WumpusQ.WumbleySieht es aus wie Sie nur die Sorge um die Stunde so:
Den
]
schließt eine[
Befehl muss ein separates argument. Setzen Sie ein Leerzeichen vor dem.