Tratamento de parâmetros do tipo DATAS dd/mm/YYYY em shell scripts [RESOLVIDO]

13. Re: Tratamento de parâmetros do tipo DATAS dd/mm/YYYY em shell scripts [RESOLVIDO]

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 29/12/2015 - 16:08h


Caro Paulo, o erro que deu foi:
./exec_scritps_cron_intervalo_datas_v2.sh -dt1 01/12/2015 -dt2 27/12/2015
data_ini - 01/12/2015 || data_fim - 27/12/2015
date: data inválida "27/12/2015"
data_ini - 01/12/2015 || data_fim - 27/12/2015

Eu percebi que o comando não funciona qnd a data em $data_ini e $data_fim estiver no formato dd/mm/YYYY.
Baseado nos seus códigos postados e no do seu blog fiz algumas modificações. Eis o código:

function funcao_is_data_valida() {

data="$1"
if ! [[ "$data" =~ ^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/([0-9]{4})$ ]]; then
return
fi
year=${BASH_REMATCH[3]}
month=${BASH_REMATCH[2]}
day=${BASH_REMATCH[1]}

data_aux="$year/$month/$day"
if ! date -d "$year/$month/$day" >/dev/null 2>&1; then
return
fi
echo "$data_aux"
}

#[ "$data_ini" ] || data_ini=$( date +01/%m/%Y )
#[ "$data_fim" ] || data_fim=$( date -d "$( date +%Y-%m-01 ) + 1 month - 1 day" +%d/%m/%Y )

if [ -z "$data_ini" ] || [ -z "$data_fim" ] ; then
data_ini=$( date +01/%m/%Y )
data_fim=$( date -d "$( date +%Y-%m-01 ) + 1 month - 1 day" +%d/%m/%Y )
fi

data_ini_aux=$( funcao_is_data_valida $data_ini );
data_fim_aux=$( funcao_is_data_valida $data_fim );

if [ -z "$data_ini_aux" ] || [ -z "$data_fim_aux" ] ; then
echo -e "Data(s) invalida(s)."
exit 1
fi

n_segundos_data_ini=$( date -d "$data_ini_aux" +%s )
n_segundos_data_fim=$( date -d "$data_fim_aux" +%s )
[ $n_segundos_data_ini -gt $n_segundos_data_fim ] && echo "Erro! Data final é menor do que a Data Inicial." && exit 1

O que acha? Está funcionando nos meus testes.

O tratamento para os parâmetros do script 03 ficou assim:

if [ -z "$mes" ] || [ -z "$ano" ] ; then
mes=$(date +%m)
ano=$(date +%Y)
fi

[ "$mes" -lt 1 -o "$mes" -gt 12 ] && echo "Mês ($mes) com valor fora do intervalo [1, 12]." && exit 1
[ "$ano" -lt 2000 -o "$ano" -gt $(date +%Y) ] && echo "Ano ($ano) com valor fora do intervalo [2000, $(date +%Y)]." && exit 1

data_ini=$( date +01/$mes/%Y )
data_fim=$( date -d "$( date +%Y-$mes-01 ) + 1 month - 1 day" +%d/$mes/%Y )

Parece que funciona bem. Muito obrigado pelos códigos.

Paulo, mais uma pergunta: como eu faço para criar uma biblioteca de funções Shell Script e chamar funções dessa biblioteca a partir de qualquer outro script? Por exemplo, poder chamar a função funcao_is_data_valida() em varios outros scripts sem ter que definir a função novamente.




  


14. Re: Tratamento de parâmetros do tipo DATAS dd/mm/YYYY em shell scripts [RESOLVIDO]

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 29/12/2015 - 16:13h

listeiro_037 escreveu:

Para se comparar se uma data é maior, menor ou igual a outra pode ser feito o seguinte:

- Primeiro uma comparação de string. Se for igual declara-se igual. Senão, próximo passo;
- Compara-se os anos. Se um ano for maior ou menor, declara-se maior ou menor data. Senão próximo passo;
- Compara-se se os meses. Se um mês for maior ou menor, declara-se maior ou menor data. Senão próximo passo;
- Compara-se os dias. Se um dia for maior ou menor que outro, declara-se maior ou menor data. Aqui não pode dar igual por causa do primeiro teste.

Pode-se continuar estas etapas com horas, minutos e segundos.

Também as datas podem ser convertidas em um formato numérico que conta minutos ou segundos desde a década de 70 (é isto?) e realizar uma comparação direta com valores numéricos sem encher linguiça com essa série de comparações.

Pensei em outro método de ataque ao problema:

Tira-se o separador das datas escritas no formato ano/mês/dia e compara-se como números qual é maior ou menor.
Ex: 08/06/2004 fica 2004/06/08 que fica 20040608. É só comparar as datas neste formato como números.



Vc tem algum codigo pra mostrar, principalmente em relação à última parte?




15. Re: Tratamento de parâmetros do tipo DATAS dd/mm/YYYY em shell scripts

Paulo Dias
di4s

(usa XUbuntu)

Enviado em 29/12/2015 - 16:42h

NewtonJr. escreveu:


Caro Paulo, o erro que deu foi:
./exec_scritps_cron_intervalo_datas_v2.sh -dt1 01/12/2015 -dt2 27/12/2015
data_ini - 01/12/2015 || data_fim - 27/12/2015
date: data inválida "27/12/2015"
data_ini - 01/12/2015 || data_fim - 27/12/2015

Eu percebi que o comando não funciona qnd a data em $data_ini e $data_fim estiver no formato dd/mm/YYYY.
Baseado nos seus códigos postados e no do seu blog fiz algumas modificações. Eis o código:

function funcao_is_data_valida() {

data="$1"
if ! [[ "$data" =~ ^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/([0-9]{4})$ ]]; then
return
fi
year=${BASH_REMATCH[3]}
month=${BASH_REMATCH[2]}
day=${BASH_REMATCH[1]}

data_aux="$year/$month/$day"
if ! date -d "$year/$month/$day" >/dev/null 2>&1; then
return
fi
echo "$data_aux"
}

#[ "$data_ini" ] || data_ini=$( date +01/%m/%Y )
#[ "$data_fim" ] || data_fim=$( date -d "$( date +%Y-%m-01 ) + 1 month - 1 day" +%d/%m/%Y )

if [ -z "$data_ini" ] || [ -z "$data_fim" ] ; then
data_ini=$( date +01/%m/%Y )
data_fim=$( date -d "$( date +%Y-%m-01 ) + 1 month - 1 day" +%d/%m/%Y )
fi

data_ini_aux=$( funcao_is_data_valida $data_ini );
data_fim_aux=$( funcao_is_data_valida $data_fim );

if [ -z "$data_ini_aux" ] || [ -z "$data_fim_aux" ] ; then
echo -e "Data(s) invalida(s)."
exit 1
fi

n_segundos_data_ini=$( date -d "$data_ini_aux" +%s )
n_segundos_data_fim=$( date -d "$data_fim_aux" +%s )
[ $n_segundos_data_ini -gt $n_segundos_data_fim ] && echo "Erro! Data final é menor do que a Data Inicial." && exit 1

O que acha? Está funcionando nos meus testes.

O tratamento para os parâmetros do script 03 ficou assim:

if [ -z "$mes" ] || [ -z "$ano" ] ; then
mes=$(date +%m)
ano=$(date +%Y)
fi

[ "$mes" -lt 1 -o "$mes" -gt 12 ] && echo "Mês ($mes) com valor fora do intervalo [1, 12]." && exit 1
[ "$ano" -lt 2000 -o "$ano" -gt $(date +%Y) ] && echo "Ano ($ano) com valor fora do intervalo [2000, $(date +%Y)]." && exit 1

data_ini=$( date +01/$mes/%Y )
data_fim=$( date -d "$( date +%Y-$mes-01 ) + 1 month - 1 day" +%d/$mes/%Y )

Parece que funciona bem. Muito obrigado pelos códigos.

Paulo, mais uma pergunta: como eu faço para criar uma biblioteca de funções Shell Script e chamar funções dessa biblioteca a partir de qualquer outro script? Por exemplo, poder chamar a função funcao_is_data_valida() em varios outros scripts sem ter que definir a função novamente.



Oi, você ainda consegue melhorar um pouco essa funcao_is_data_valida()... A validação está ocorrendo no segundo if, assim sendo, é possível retirar o primeiro if e pegar o dia, mês e ano com o comando cut.

Para reutilizar funções em outros scripts( fazer import ) use o source. No link do meu blog você encontra informações sobre isso.


Linux Professional Institute - LPIC-1
Novell Certified Linux Administrator - CLA

http://twitter.com/p4ulodi4s
http://www.prminformatica.com.br/



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts