Como eu uso uma consulta If-Else baseada no dia da semana?

8

Problema: preciso verificar se hoje é quinta-feira e executar ações diferentes com base no resultado dessa condição. Eu tentei duas abordagens diferentes:

Obtendo o nome do dia:

DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"]; 
then   
   echo YES
else
    echo NO
fi

Obtendo o número do dia:

DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK

if ["$DAYOFWEEK" == 4]; 
then
   echo YES
else
   echo NO
fi

Em ambos os casos, a saída é NO, embora deva ser SIM. O que está errado?

    
por Swagatika 07.03.2013 / 13:31

5 respostas

11

O problema é a falta de espaço em branco.

O código a seguir funcionará em shells cujo comando [ builtin aceita == como um alias para = :

if [ "$DAYOFWEEK" == 4 ];  then    echo YES; else    echo NO; fi

Mas lembre-se (consulte help test in bash ):

  • == não é oficialmente mencionado, você deve usar = para comparação de strings
  • -eq é destinado a testes aritméticos decimais (não fará diferença aqui para date +%u , mas para date +%d , por exemplo, quando se trata de comparar 04 e 4 , que são numericamente iguais, mas lexicamente diferentes) .

Eu preferiria:

 if [ "${DAYOFWEEK}" -eq 4 ];  then    echo YES; else    echo NO; fi

Geralmente você deve preferir a abordagem do dia número , porque tem menos dependência do locale . No meu sistema, a saída de date +"%a" é hoje Do .

    
por 07.03.2013 / 13:36
2

Não ignore case , que geralmente é uma maneira melhor de fazer esse tipo de coisa:

Tenha também em atenção que a saída de date +%a é dependente da localidade, por isso, se esperar os nomes em inglês, o seu script deixará de funcionar quando for invocado por um utilizador francês ou coreano, por exemplo.

case $(LC_ALL=C date +%a) in
   (Mon) echo first day of the week;;
   (Thu) do-something;;
   (Sat|Sun) echo week-end;;
   (*) echo any other day;; # last ;; not necessary but doesn't harm
esac

Observe que acima é um dos raros casos em que $(...) não precisa ser citado (embora as citações não sejam prejudiciais. O mesmo que em var="$(...)" ).

    
por 22.11.2017 / 15:50
0

Na mesma ideia, eu uso o seguinte trecho de código para "desabilitar" um cron antes de uma hora escolhida.
É claro que eu prefiro modificar o próprio crontab ... se eu recebesse os direitos necessários para:)

Aqui está um teste simples que aborta um script bash a menos que estejamos à noite.

# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if  /usr/bin/test 'date '+%H'' -gt 2 -a 'date '+%H'' -lt 7; then
  echo LETS_START_PROCESSING;
else
  exit;
fi

#Put job here
    
por 22.11.2017 / 15:23
0

Para interromper o script no dia da semana, exclua apenas a linha do dia:

DAYOFWEEK=$(date +"%u")
echo "$DAYOFWEEK";
if [ "$DAYOFWEEK" == 1 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 2 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 3 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 4 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 5 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 6 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 7 ]; then exit; else echo; fi
    
por 21.05.2018 / 20:42
-1

Primeiramente, você deve citar a tarefa DAYOFWEEK="$ (date +% u)"

E você precisa ter espaços em cada lado dos colchetes [e].

O ponto e vírgula no final da linha é redundante.

    
por 07.03.2013 / 13:59