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 dia Num:
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
Nos dois casos, a saída é NÃO, mesmo que deva ser SIM. O que está errado?
shell
shell-script
date
test
Swagatika
fonte
fonte
;
seriam necessárias se você tivessethen
na mesma linha queif
. Nesse caso, eles são redundantes.Respostas:
O problema está em branco em falta.
O código a seguir funcionará em shells cujo
[
comando interno aceita==
como um alias para=
:Mas lembre-se (veja
help test
embash
):==
não é mencionado oficialmente, você deve usar=
para comparar seqüências-eq
destina-se a testes aritméticos decimais (não fará diferença aqui,date +%u
mas faria,date +%d
por exemplo, quando se trata de comparar04
e4
que são numericamente iguais, mas lexicamente diferentes).Eu preferiria:
Geralmente, você deve preferir a abordagem do número do dia , porque ela tem menos dependência do local atual . No meu sistema, a saída de
date +"%a"
hoje é hojeDo
.fonte
Não negligencie
case
qual é a melhor maneira de fazer esse tipo de coisa:Lembre-se também de que a saída de
date +%a
depende da localidade; portanto, se você espera os nomes em inglês, seu script deixará de funcionar quando chamado por um usuário francês ou coreano, por exemplo.Observe que acima é um dos casos raros em que
$(...)
isso não precisa ser citado (embora as aspas não sejam prejudiciais. O mesmo que emvar="$(...)"
).fonte
Na mesma idéia, eu uso o seguinte trecho de código para "desativar" um cron antes de uma hora escolhida.
É claro que prefiro modificar o próprio crontab ... se me forem concedidos os direitos necessários para :)
Aqui está um teste simples que interrompe um script do bash, a menos que estejamos à noite.
fonte
/usr/bin/test
vez do[
comando embutido do shell ?cron
executável, em vez do crontab do usuário.-a
está obsoleto emtest
. Standardly, você usaria:hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ]
(ouhour=`date +%H`
se for necessário para ser compatível com o shell Bourne, que é Solaris 10 e unices SCO mais velhos e talvez alguns raros hoje em dia)Para parar o script no dia da semana, exclua apenas a linha do dia:
fonte
if [ "$DAYOFWEEK" -lt 7 ]
melhor?Primeiro, 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.
fonte
a=$(echo 1 2 3); echo $a;
a=$(echo "1 2 3"); echo $a
com vários espaços entre os dígitos (StackExchange não permitirá que eu faça um simples copiar e colar, infelizmente).