Problema no script data

1. Problema no script data

Rhuan
rhuangpc

(usa Ubuntu)

Enviado em 03/05/2017 - 14:46h

Olá, este é meu primeiro post, estou com um problema em um trecho do código, ele não é meu, estou apenas usando e está apresentando erro.
Gostaria de saber se alguém poderia me ajudar por gentileza.

Ubuntu 14.04.5 LTS
date = Qua Mai 3 14:40:06 BRT 2017

erro apresentado:
date: data inválida “Mai 04, 2017”
/bin/mudardata: linha 17: [: 20170503: esperado operador unário
date: data inválida “Mai 04, 2017”

trecho do código:
do
expire="$(chage -l $user | grep -E "Account expires" | cut -d ' ' -f3-)"
if [[ $expire == "never" ]]
then
nunca="Nunca"
printf ' %-30s%s\n' "$user" "Nunca"
else
databr="$(date -d "$expire" +"%Y%m%d")"
hoje="$(date -d today +"%Y%m%d")"
if [ $hoje -ge $databr ] <<<---------------- está é a linha 17
then
datanormal="$(date -d"$expire" '+%d/%m/%Y')"
printf ' %-30s%s' "$user" "$datanormal" ; tput setaf 1 ; tput bold ; echo " (Expirado)" ; tput setaf 3
echo "exp" > /tmp/exp
else
datanormal="$(date -d"$expire" '+%d/%m/%Y')"
printf ' %-30s%s\n' "$user" "$datanormal"
fi
fi
done

tentei mudar o %m com %d de lugar (invertendo)
remover alguns trechos do código...

Mas o problema se manter, então se tiver experiencia nesse caso e me ajudar, ficaria imensamente grato.


  


2. Re: Problema no script data

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 03/05/2017 - 15:06h

rhuangpc escreveu:

Olá, este é meu primeiro post, estou com um problema em um trecho do código, ele não é meu, estou apenas usando e está apresentando erro.
Gostaria de saber se alguém poderia me ajudar por gentileza.

Ubuntu 14.04.5 LTS
date = Qua Mai 3 14:40:06 BRT 2017

erro apresentado:
date: data inválida “Mai 04, 2017”
/bin/mudardata: linha 17: [: 20170503: esperado operador unário
date: data inválida “Mai 04, 2017”

trecho do código:
do
expire="$(chage -l $user | grep -E "Account expires" | cut -d ' ' -f3-)"
if [[ $expire == "never" ]]
then
nunca="Nunca"
printf ' %-30s%s\n' "$user" "Nunca"
else
databr="$(date -d "$expire" +"%Y%m%d")"
hoje="$(date -d today +"%Y%m%d")"
if [ $hoje -ge $databr ] <<<---------------- está é a linha 17
then
datanormal="$(date -d"$expire" '+%d/%m/%Y')"
printf ' %-30s%s' "$user" "$datanormal" ; tput setaf 1 ; tput bold ; echo " (Expirado)" ; tput setaf 3
echo "exp" > /tmp/exp
else
datanormal="$(date -d"$expire" '+%d/%m/%Y')"
printf ' %-30s%s\n' "$user" "$datanormal"
fi
fi
done

tentei mudar o %m com %d de lugar (invertendo)
remover alguns trechos do código...

Mas o problema se manter, então se tiver experiencia nesse caso e me ajudar, ficaria imensamente grato.


substitua a linha 16 e v se da certo
hoje=`date +%Y%m%d`

_______________________________________________________________
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"


3. Re: Problema no script data

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/05/2017 - 16:57h

Sua pergunta não tem nada a ver com C ou C++, mas vamos à resposta.

O problema é que a opção -d do comando date não está aceitando a forma da data em Português. Você poderia obter a data em Inglês na hora de extrair data de expiração com o chage -l.

Aliás, talvez fosse mais prodente trabalhar com o script todo em Inglês (ou melhor, na locale “C”), sempre que depender de comandos externos. Sendo assim, um “export LC_ALL=C” no começo do arquivo poderia ajudar.


4. Re: Problema no script data

Rhuan
rhuangpc

(usa Ubuntu)

Enviado em 03/05/2017 - 19:42h

Olá amigos, testei ambas sugestões sem sucesso.
Irei continuar tentando, e se tiver outras possíveis soluções, me ajude por favor.


5. Re: Problema no script data

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/05/2017 - 00:19h

A mensagem de erro que você postou na primeira mensagem dizia claramente qual o erro, que eu apontei na minha resposta anterior. Se você realmente tentou a solução que eu propus, a mensagem de erro tem de ter mudado. O que está sendo indicado agora?


6. Re: Problema no script data

Rhuan
rhuangpc

(usa Ubuntu)

Enviado em 05/05/2017 - 11:20h

Olá amigos, perdão pela demora em responder

--paulo1205
databr="$(date chage -l "$expire" +"%Y%m%d")" <<<------ inserindo o chage -l
hoje="$(date chage -l today +"%Y%m%d")" <<<------ inserindo o chage -l

erro:
date: opção -- 'l' inválida
Try 'date --help' for more information.

*Como informei, o código não é de minha autoria, ao usar estou recebendo esse erro, creio não ter conhecimento técnico para fazer a alteração geral no código.

--Mauriciodez
substituindo apenas o trecho informado

erro:
date: data inválida “Mai 04, 2017”
/bin/mudardata: linha 17: [: 20170505: esperado operador unário



7. Re: Problema no script data

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/05/2017 - 13:10h

rhuangpc escreveu:

Olá amigos, perdão pela demora em responder

--paulo1205
databr="$(date chage -l "$expire" +"%Y%m%d")" <<<------ inserindo o chage -l
hoje="$(date chage -l today +"%Y%m%d")" <<<------ inserindo o chage -l


Mas por que você fez isso? chage é um comando, e date é outro. Não vai funcionar se você misturá-los.

Releia minha mensagem. O que eu disse foi que o chage está devolvendo uma data em Português, e que o comando date com a opção -d espera receber uma data em Inglês. E a sugestão que eu dei foi alterar o script de modo que todas as ferramentas trabalhem com datas em Inglês, o que se faz através de uma definição de variável de ambiente (LC_ALL) no início da execução do script.

Segue uma explicação detalhada do que ocorria.

A data de expiração é obtida por meio de comando chage com opção -l, e essa data é salva na variável expire. Como provavelmente o seu sistema está configurado para trabalhar com idioma Português do Brasil, as rotinas internas do comando chage acabam seguindo a configuração do sistema na hora de formatar a data. Por isso, o valor colocado na variável expire fica com um formato em Português (e.g. “Mai 04, 2017” -- note que está “Mai” com “i”, não “May” com “y”; aliás, esse formato de mês abreviado antes do dia e com o ano no final e separado por vírgula é uma tradução bem porquinha, porque ninguém escreve datas em Português assim).

Algumas linhas abaixo, o script precisa reformatar a data para um formato que facilite a comparação, a fim de comparar a data de expiração (na variável datebr, reformatada a partir do valor de expire) com o dia corrente (variável hoje). Ele tenta fazer essa reformatação através do comando date com opção -d.

O comando date normalmente trabalha com a data e hora correntes, mas isso pode ser alterado por meio da opção -d, que permite informar um instante qualquer no tempo, em vez de o momento atual. O problema é que a implementação da opção -d tem uma gramática fixa, que aparentemente só funciona em Inglês (ou que não foi devidamente traduzida/adaptada para reconhecer Português). Quando o valor de expire, em Português, é passado ao date -d, falha a tentativa do programa de reconhecer o momento do tempo a ser considerado, e ele aborta sua execução com uma mensagem de erro (a primeira).

Uma vez que o comando falha, a variável databr fica com um valor vazio. Esse valor vazio acaba sendo considerado como inexistente pelo comando [ (sim, o nome do comando é “[”), pois o operador -ge precisa de dois argumentos, não apenas um. Você acaba chamando o comando como “[ algum_valor -ge ]”, em lugar de “[ algum_valor -ge outro_valor ]”, como seria de se esperar. Isso explica a segunda mensagem de erro.

Pouco abaixo, o script tenta reformatar a data de expiração com date -d uma segunda vez, para imprimi-la no formato “dd/mm/aaaa”, e de novo se esbarra no problema de o valor do argumento estar em Português, causando a terceira mensagem de erro.


8. Re: Problema no script data

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 05/05/2017 - 13:14h

Velho ... acho q seria uma de vc no mínimo explicar pra gente o que esse script faz ... ou o q vc quer q ele faça ... acho q é mais funcional te ajudar dessa forma do q tentar remendar esse aí
_______________________________________________________________
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"


9. Re: Problema no script data

Rhuan
rhuangpc

(usa Ubuntu)

Enviado em 05/05/2017 - 13:58h

Prezados, esse arquivo/trecho gerencia quais usuários terão acesso ao sistema até uma determinada data, pré-cadastrada em outro comando.

a questão do formato de data não é importante, mais importante para eu seria a não apresentação do erro, gostaria apenas que aparecesse o nome do usuário e a data (não importando o formato):

usuario1 02/06/2017
usuario2 06/02/2017
usuario3 mai 05 2017 (expirado)

se alguma alteração no script aparecer em qualquer um dos formatos mencionados eu já ficaria imensamente grato.


10. Re: Problema no script data

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/05/2017 - 14:15h

rhuangpc escreveu:

a questão do formato de data não é importante


Eu concordaria com você se fosse mera questão de formato de exibição. Mas o formato é relevante porque ele está sendo usado internamente para fornecer informações a ferramentas que têm requisitos de formatação estritos.

Eu expliquei detalhadamente a você tudo o que está acontecendo e como resolver o problema que você está enfrentando. Se você se recusa a aceitar uma explicação correta, não há mais o que eu possa fazer por você.


11. Re: Problema no script data

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 05/05/2017 - 14:16h

olha só ... esse pequeno script faz o q vc quer ... é só vc adaptar às suas necessidades ... ele compara a data em um arquivo ( no caso o arquivo eu fiz só com uma linha, vc tem q adaptar
#!/bin/bash
data_exp=`grep mauricio arquivo.txt | cut -d' ' -f2
data=`date +%Y%m%d`
if [ $data_exp -gt $data ];then
echo "Data válida"
else
echo "Data Expirada"
fi


texto do arquivo.txt
mauricio 20170506 

_______________________________________________________________
" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"


12. Re: Problema no script data

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/05/2017 - 19:35h

rhuangpc escreveu:

Olá, este é meu primeiro post, estou com um problema em um trecho do código, ele não é meu, estou apenas usando e está apresentando erro.
Gostaria de saber se alguém poderia me ajudar por gentileza.

Ubuntu 14.04.5 LTS
date = Qua Mai 3 14:40:06 BRT 2017

erro apresentado:
date: data inválida “Mai 04, 2017”
/bin/mudardata: linha 17: [: 20170503: esperado operador unário
date: data inválida “Mai 04, 2017”

trecho do código:
do
expire="$(chage -l $user | grep -E "Account expires" | cut -d ' ' -f3-)"
if [[ $expire == "never" ]]
then
nunca="Nunca" #Pra que isso????
printf ' %-30s%s\n' "$user" "Nunca"
else
databr="$(date -d "$expire" +"%Y%m%d")"
hoje="$(date -d today +"%Y%m%d")"
if [ $hoje -ge $databr ] <<<---------------- está é a linha 17
then
datanormal="$(date -d"$expire" '+%d/%m/%Y')"
printf ' %-30s%s' "$user" "$datanormal" ; tput setaf 1 ; tput bold ; echo " (Expirado)" ; tput setaf 3
echo "exp" > /tmp/exp
else
datanormal="$(date -d"$expire" '+%d/%m/%Y')"
printf ' %-30s%s\n' "$user" "$datanormal"
fi
fi
done

tentei mudar o %m com %d de lugar (invertendo)
remover alguns trechos do código...

Mas o problema se manter, então se tiver experiencia nesse caso e me ajudar, ficaria imensamente grato.


Boa noite.
A linha abaixo faz parte do script?
date = Qua Mai 3 14:40:06 BRT 2017
Se faz, tem erro. . .

Transformando o Mês EM PTBR P/ INGLêS
sed 'y/vbigoz/bpyugc/;s/ut/ct/;s/gb/ov/' <<< "Mai 01 2018"
May 01 2018
marcelo oliver








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts