Problem: Ich muss überprüfen, ob heute Donnerstag ist, und basierend auf dem Ergebnis dieser Bedingung verschiedene Aktionen ausführen. Ich habe zwei verschiedene Ansätze ausprobiert:
Den Tagesnamen erhalten:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
Den Tag bekommen Num:
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
In beiden Fällen ist der Ausgang NEIN, obwohl er JA sein sollte. Was ist falsch?
shell
shell-script
date
test
Swagatika
quelle
quelle
;
wären erforderlich, wenn Siethen
in der gleichen Zeile mit hättenif
. In diesem Fall sind sie redundant.Antworten:
Das Problem ist das fehlende Leerzeichen.
Der folgende Code funktioniert in Shells, deren
[
eingebauter Befehl==
als Alias für akzeptiert wird=
:Aber denken Sie daran (siehe
help test
inbash
):==
wird nicht offiziell erwähnt, sollten Sie=
für den String-Vergleich verwenden-eq
ist für dezimale arithmetische Tests gedacht (macht hier keinen Unterschieddate +%u
, würde aberdate +%d
zum Beispiel beim Vergleichen04
und4
die numerisch gleich, aber lexikalisch unterschiedlich sind).Ich würde bevorzugen:
Im Allgemeinen sollten Sie den Tag lieber Zahl Ansatz, weil es weniger Abhängigkeit der aktuellen hat locale . Auf meinem System ist die Ausgabe von
date +"%a"
heuteDo
.quelle
Übersehen Sie nicht,
case
was oft ein besserer Weg ist, um solche Dinge zu tun:Beachten Sie auch, dass die Ausgabe von vom
date +%a
Gebietsschema abhängig ist. Wenn Sie also die englischen Namen erwarten, funktioniert Ihr Skript nicht mehr, wenn es beispielsweise von einem französischen oder koreanischen Benutzer aufgerufen wird.Beachten Sie, dass oben einer der seltenen Fälle ist, in denen
$(...)
dies nicht in Anführungszeichen gesetzt werden muss (obwohl Anführungszeichen nicht schaden. Wie invar="$(...)"
).quelle
In der gleichen Idee verwende ich den folgenden Code, um einen Cron vor einer ausgewählten Stunde zu "deaktivieren".
Natürlich würde ich lieber den Crontab selbst ändern ... wenn mir die erforderlichen Rechte für :) gewährt würden
Hier ist ein einfacher Test, der ein Bash-Skript abbricht, es sei denn, wir sind nachts.
quelle
/usr/bin/test
anstelle des integrierten[
Befehls der Shell verwenden ?cron
ausführbare Datei im Gegensatz zur Crontab des Benutzers zu ändern .-a
in veraltet isttest
. Standardmäßig würden Sie Folgendes verwenden:hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ]
(oderhour=`date +%H`
wenn Sie mit der Bourne-Shell kompatibel sein müssten, dh Solaris 10 und älter und möglicherweise einige seltene SCO-Unices heutzutage)Um das Skript am Wochentag zu stoppen, löschen Sie nur die Zeile des Tages:
quelle
if [ "$DAYOFWEEK" -lt 7 ]
besser?Zunächst sollten Sie die Zuordnung DAYOFWEEK = "$ (Datum +% u)" angeben.
Und Sie müssen auf jeder Seite der Klammern [und] Leerzeichen haben.
Das Semikolon am Ende der Zeile ist redundant.
quelle
a=$(echo 1 2 3); echo $a;
a=$(echo "1 2 3"); echo $a
mit mehreren Leerzeichen zwischen den Ziffern (StackExchange lässt mich leider nicht einfach kopieren und einfügen).