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 tuvierathenen 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 testenbash):==no se menciona oficialmente, debe usar=para comparar cadenas-eqestá destinado a pruebas aritméticas decimales (no hará una diferencia aquí,date +%upero lo haría,date +%dpor ejemplo, cuando se trata de comparar04y4que 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
casecuál es a menudo una mejor manera de hacer este tipo de cosas:También tenga en cuenta que la salida de
date +%adepende 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/testlugar del[comando incorporado del shell ?cronejecutable en lugar del crontab del usuario.-aestá 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 $acon múltiples espacios entre los dígitos (StackExchange no me permite convertirlo en un simple copiar y pegar, desafortunadamente).