Problem: Muszę sprawdzić, czy dzisiaj jest czwartek i wykonać różne działania w zależności od wyniku tego warunku. Próbowałem dwóch różnych podejść:
Uzyskiwanie nazwy dnia:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
Uzyskiwanie numeru dnia:
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
W obu przypadkach dane wyjściowe są NIE, mimo że powinny być TAK. Co jest nie tak?
shell
shell-script
date
test
Swagatika
źródło
źródło
;
byłyby one wymagane, gdybyś miałthen
tę samą linięif
. W tym przypadku są zbędne.Odpowiedzi:
Problemem jest brakujące puste miejsce.
Poniższy kod będzie działał w powłokach, których
[
wbudowane polecenie akceptuje==
jako alias=
:Pamiętaj jednak (patrz
help test
wbash
):==
nie jest oficjalnie wspomniany, należy użyć=
do porównania ciągów-eq
jest przeznaczony do dziesiętnych testów arytmetycznych (nie zrobi tu różnicy,date +%u
aledate +%d
na przykład przy porównywaniu04
i4
które są liczbowo takie same, ale leksykalnie różne).Wolałbym:
Zasadniczo powinieneś preferować metodę liczby dni , ponieważ ma ona mniejszą zależność od bieżących ustawień regionalnych . W moim systemie produkcja
date +"%a"
jest dzisiajDo
.źródło
Nie przeocz,
case
który często jest lepszym sposobem na zrobienie tego rodzaju rzeczy:Uważaj również, że wynik działania
date +%a
zależy od ustawień regionalnych, więc jeśli spodziewasz się angielskich nazw, skrypt przestanie działać po wywołaniu na przykład przez użytkownika francuskiego lub koreańskiego.Zauważ, że powyżej jest jednym z rzadkich przypadków, w których
$(...)
nie trzeba go cytować (chociaż cytaty nie zaszkodzą. Tak samo jak wvar="$(...)"
).źródło
W tym samym pomyśle używam następującego fragmentu kodu, aby „wyłączyć” crona przed wybraną godziną.
Oczywiście wolałbym zmodyfikować sam crontab ... gdybym uzyskał niezbędne uprawnienia :)
Oto prosty test, który przerywa skrypt bash, chyba że jesteśmy w nocy.
źródło
/usr/bin/test
zamiast wbudowanego[
polecenia powłoki ?cron
pliku wykonywalnego w przeciwieństwie do pliku crontab użytkownika.-a
jest przestarzałe wtest
. Standardowo użyłbyś :hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ]
(lubhour=`date +%H`
gdybyś musiał być kompatybilny z powłoką Bourne'a, czyli Solaris 10 i starszymi, a może obecnie rzadkimi jednorożcami SCO)Aby zatrzymać skrypt w dniu tygodnia, usuń tylko wiersz dnia:
źródło
if [ "$DAYOFWEEK" -lt 7 ]
lepiej?Po pierwsze, powinieneś zacytować zadanie DAYOFWEEK = "$ (data +% u)"
I musisz mieć spacje po każdej stronie nawiasów [i].
Średnik na końcu linii jest zbędny.
źródło
a=$(echo 1 2 3); echo $a;
a=$(echo "1 2 3"); echo $a
z wieloma spacjami między cyframi (StackExchange nie pozwoli mi uczynić go prostym kopiowaniem i wklejaniem, niestety).