Identificando dias da semana em Shell Script

1. Identificando dias da semana em Shell Script

Alvaro
alvarosoares

(usa Outra)

Enviado em 02/03/2015 - 11:49h

Olá Pessoal,

Ainda sou novato no Linux, mas estou com a missão de desenvolver um shell script que execute uma ação todo terceiro domingo de cada mês.

Sei que dentro do shell terei que botar uma condição usando o date '+%A', mas isso apenas iria identificar o dia da semana e não o dia específico que preciso (terceiro Domingo).

Alguém tem alguma código de exemplo que possa me basear ou me passar alguma dica ?

Obrigado.

Abs





  


2. Re: Identificando dias da semana em Shell Script

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/03/2015 - 15:48h

O terceiro dia X da semana de cada mês é aquele que, além de ser X, está na faixa de dia do mês que vai de 15 a 21.


3. Re: Identificando dias da semana em Shell Script

Alvaro
alvarosoares

(usa Outra)

Enviado em 03/03/2015 - 16:14h

paulo1205 escreveu:

O terceiro dia X da semana de cada mês é aquele que, além de ser X, está na faixa de dia do mês que vai de 15 a 21.



Olá Paulo,
Obrigado pela ajuda, então o trecho de código ficaria dessa forma ?

# é domingo ?
if [ date '+%A' -eq "Sunday"] ;
then
# verifica se está dentro da faixa de 15 a 21 do mês
if [date '+%d' -gt 14] and [date '+%d' -lt 22] ;
then
echo "É o terceiro Domingo do mês"
fi
fi













4. Re: Identificando dias da semana em Shell Script

Danilson
danilsonjr

(usa Outra)

Enviado em 05/03/2015 - 08:38h


Com pequenas modificações funcionou perfeitamente aqui...

if [ "$(date '+%A')" = "sunday" ]; then
if [ $(date '+%d') -ge 15 -a $(date '+%d') -le 21 ]; then
echo "É o terceiro Domingo do mês"
fi
fi



OBS: tem que verificar o retorno do comando date '+%A' para colocar a string de verificação corretamente, exemplo: o meu retorna em portugês domingo.

Se é uma tarefa rotineira, pode usar a cron também:
00 00 15-21 * 0 comando/script 

vai rodar todos os meses, a meia noite, no domingo, entre os dias 15 e 21, ou seja, terceiro domingo do mês


5. Re: Identificando dias da semana em Shell Script

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/03/2015 - 09:48h

danilsonjr escreveu:


Com pequenas modificações funcionou perfeitamente aqui...

if [ "$(date '+%A')" = "sunday" ]; then
if [ $(date '+%d') -ge 15 -a $(date '+%d') -le 21 ]; then
echo "É o terceiro Domingo do mês"
fi
fi



OBS: tem que verificar o retorno do comando date '+%A' para colocar a string de verificação corretamente, exemplo: o meu retorna em portugês domingo.

Se é uma tarefa rotineira, pode usar a cron também:
00 00 15-21 * 0 comando/script 

vai rodar todos os meses, a meia noite, no domingo, entre os dias 15 e 21, ou seja, terceiro domingo do mês


Com relação ao uso com o cron, essa é de fato a melhor solução. Eu só tenho uma ressalva com relação à meia-noite, porque o horário de verão brasileiro costuma começar justamente na meia-noite do terceiro domingo de outubro, e eu não sei como o cron se comporta no momento do salto (nos EUA o salto costuma ser às 02:00). Geralmente, eu prefiro agendar as coisas para rodar lá para umas quatro ou cinco da manhã (nem de 00:00 a 01:00, por causa do Brasil, nem de 02:00 a 03:00, por causa dos EUA), justamente para evitar surpresas. Raciocínio análogo existe para o fim do horário de verão, em que horas como 23:xx:xx (no Brasil, nos EUA seria 01:xx:xx) parecem acontecer duas vezes.

No que diz respeito à identificação pelo shell, eu acho melhor fazer numa tacada só (i.e. invocar o comando externo date só uma vez), e forçando o idioma para algo conhecido (através de variável de ambiente, por exemplo, como LC_ALL).

O bloco abaixo funciona com o bash e o ksh (mas não com o sh tradicional): ele cria um named pipe de entrada (“<(...)”), associa a outra ponta desse pipe à saída do comando date que executa com idioma forçado para o padrão do POSIX, identificado como “C“ (o conteúdo dos parênteses que define o named pipe), e usa o comando interno do shell read para definir de uma só vez duas variáveis, uma para o dia da semana e outra para o dia do mês, a partir das colunas separadas por espaços dos dados recebidos da entrada redirecionada do named pipe criado.

read wday mday < <(LC_ALL=C date "+%a %e")
if [[ "$wday" = "Sun" ]] && (( mday>=15 && mday <=21 )); then
# É o terceiro domingo do mês.
fi







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts