Problema: necesito verificar si hoy es jueves y realizar diferentes acciones en función del resultado de esta condición. Intenté dos enfoques diferentes:
Obteniendo el nombre del día:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
Obteniendo el día Num:
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
En ambos casos, la salida es NO, aunque debería ser SÍ. ¿Qué está mal?
shell
shell-script
date
test
Swagatika
fuente
fuente
;
serían necesarios si tuvierathen
en la misma línea conif
. En este caso son redundantes.Respuestas:
El problema es el espacio en blanco que falta.
El siguiente código funcionará en shells cuyo
[
comando incorporado acepta==
como un alias para=
:Pero tenga en cuenta (ver
help test
enbash
):==
no se menciona oficialmente, debe usar=
para comparar cadenas-eq
está destinado a pruebas aritméticas decimales (no hará una diferencia aquí,date +%u
pero lo haría,date +%d
por ejemplo, cuando se trata de comparar04
y4
que son numéricamente iguales pero léxicamente diferentes).Yo preferiría:
En general, debe preferir el enfoque de número de día , ya que tiene menos dependencia de la configuración regional actual . En mi sistema, la salida
date +"%a"
es hoyDo
.fuente
No pase por alto
case
cuál es a menudo una mejor manera de hacer este tipo de cosas:También tenga en cuenta que la salida de
date +%a
depende de la configuración regional, por lo que si espera los nombres en inglés, su script dejará de funcionar cuando lo invoque un usuario francés o coreano, por ejemplo.Tenga en cuenta que arriba es uno de los raros casos en los que
$(...)
no es necesario citarlo (aunque las citas no dañarán. Igual que envar="$(...)"
).fuente
En la misma idea, uso el siguiente código para "deshabilitar" un cron antes de una hora elegida.
Por supuesto, preferiría modificar el crontab en sí ... si se me otorgan los derechos necesarios para :)
Aquí hay una prueba simple que aborta un script bash a menos que estemos de noche.
fuente
/usr/bin/test
lugar del[
comando incorporado del shell ?cron
ejecutable en lugar del crontab del usuario.-a
está en desuso entest
. De manera estándar, usaría:hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ]
(ohour=`date +%H`
si necesita ser compatible con el shell Bourne, es Solaris 10 y versiones anteriores y tal vez algunos SCO unices raros hoy en día)Para detener el script en el día de la semana, solo elimine la línea del día:
fuente
if [ "$DAYOFWEEK" -lt 7 ]
mejor?En primer lugar, debe citar la tarea DAYOFWEEK = "$ (fecha +% u)"
Y debe tener espacios a cada lado de los corchetes [y].
El punto y coma al final de la línea es redundante.
fuente
a=$(echo 1 2 3); echo $a;
a=$(echo "1 2 3"); echo $a
con múltiples espacios entre los dígitos (StackExchange no me permite convertirlo en un simple copiar y pegar, desafortunadamente).