shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bulk] Re: [Bulk] Re: [shell-script] teste retorno comando


From: Sidney Souza
Subject: Re: [Bulk] Re: [Bulk] Re: [shell-script] teste retorno comando
Date: Sun, 14 Dec 2014 17:00:53 -0200

Primeiramente gostaria de agradecer tanto ao Paulo quanto ao Julio pelo retorno.

Júlio, quando que dá para comprar seu livro mesmo ?? kkkkkkkkkkkkkkkkkkk.

Quando estou apanhando de alguma regexp eu uso esse cara http://regexpal.com/, mas se não tiver acesso a internet eu to ferrado, kk, e o que me resta é usar o egrep com --color para ver o que está pegando tbm.

Vou implementar as dicas e ver como funciona.

Obrigado a todos mais uma vez e peço desculpas ao amigo Herbert por ter pego carona no seu tópico.


2014-12-14 12:09 GMT-02:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden>:
 

Fala Sidney,
no início dessa thread, eu disse que "Toda vez que vejo um if [ $? -eq ... ], desconfio, quase com certeza que o script está muito mal escrito" repare que eu disse *quase* com certeza. É por pouquíssimos casos como o que vc descreveu que eu usei esta palavra.

Vc precisa de executar uma instrução, cujo retorno terá que ser testado após executar outra, mas veja, mesmo assim vc não usou o famigerado if [ $? == ... ]. Vc teve de salvar o código de retorno.

De qq forma, no seu caso, eu salvaria o código de retorno somente da 1ª instrução, fazendo algo mais ou menos assim:

i=127.0.0.1
response=$(snmpwalk -v 2c -c public $i sysname 2>&1)
snmpExecution=$?

[[ $snmpExecution -ne 0 || response="$response;$(./check_nrpe -H $i)" ]] && echo "$i;$response"

Como vc quer legibilidade no seu código, tirei um monte de chaves ({}) desnecessárias.

Não sei se funcionará pq não conheço a lógica, mas o caminho das pedras é esse, talvez precisando de pequenos ajustes (como trocar && por ||).

Mudando de assunto, vc elogiou o uso de PIPESTATUS. Veja o BASH_REMATCH que é outro vetor do sistema:

$ Hora=54321:012345 # Obviamente é um horário errado
# Agora um condicional com uma Reg Exp aparentemente perfeita
$ if [[ $Hora =~ ([01][0-9]|2[0-3]):[0-5][0-9] ]]
> then
>     echo Horario OK
> else
>     echo O horario informado esta incorreto
> fi
Horario OK

Epa! Isso era para dar errado! Vamos ver o que aconteceu:

$ echo ${BASH_REMATCH[@]}
21:01 21

Ihhh, casou somente com os dois caracteres que estão antes e os dois que estão depois
dos dois-pontos (:). Posso afirmar isso pq o índice zero deste vetor tem o casamento total, isto é, todo o trecho casado pela expressão regular e os índices 1, 2, ... equivalem aos retrovisores, isto é, mantêm guardados os textos que casaram com o 1º grupo, com o 2º, ... (nunca esquecendo que os grupos são formados pelos parênteses).

Então para que isso ficasse perfeito faltou colocar as âncoras das Expressões Regulares, isto é, um circunflexo (^) para marcar o início e um cifrão ($) para marcar o final ou usando bordas que podem ser dois \b ou \< no início e \> no final. Veja:

$ Hora=54321:012345
$ if [[ $Hora =~ \b([01][0-9]|2[0-3]):[0-5][0-9]\b ]]
> then
>     echo Horario OK
> else
>     echo O horário informado esta incorreto
> fi
O horário informado esta incorreto

Algumas vezes, normalmente qdo estou tomando uma surra de uma reg exp, coloco-a dentro de um test para que esse vetor me ajude a descobrir o erro.

Abcs,
Julio
@juliobash
P
róximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 09 a 13/03/15
São Paulo 4Linux 24 a 28/11/14
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.


Em 14 de dezembro de 2014 01:13, Sidney Souza address@hidden [shell-script] <address@hidden> escreveu:

 

Aproveitando o gancho da discussão levantada pelo Júlio, gostaria de saber dos senhores como poderia evitar o uso do $? no script abaixo.

i=127.0.0.1
response=$( snmpwalk -v 2c -c public $i sysname 2>&1 )
snmpExecution=$?

response="${response};$( ./check_nrpe -H $i )"
nrpeExecution=$?
   
[ ${snmpExecution} -ne 0 -a ${nrpeExecution} -ne 0 ] && echo "${i};${response}"

Sei que o if testa instruções, mas me pergunto se colocar as duas instruções dentro do if não ficaria ainda pior para ler o código.

Essa do PIPESTATUS mudou a minha vida.. nunca ia imaginar que isso existia.. Julio, c é d+ cara.

2014-12-13 20:19 GMT-02:00 Jonathan Lessa address@hidden [shell-script] <address@hidden>:
 

Sim, tive receio de falar errado justamente por ter algum tempo que não uso essa sintaxe rsrssrsrs
Agora é o && e || logo após o "comando"

Em 13/12/2014 19:11, "'Julio C. Neves' address@hidden [shell-script]" <address@hidden> escreveu:

 

Falou certo Jonathan, o test que vc aplicou (aritmético) é muito mais veloz que o convencional, o problema é que qdo vejo um [ $? == ... ], ou um [[ $? == ... ]], ou até (($? ==...)), sinto dor de barriga e olha que minha barriga é muuuuito grande.

Inscreva-se vc tb na CPDEC - Campanha Para Desestimular Essa Construção ;). Isso é um horror, é um pleonasmo, é o mesmo que subir para cima, descer para baixo ou entrar para dentro. E eu sempre aviso aos que insistem nessa redundância: cuidado para não dar uma marcha a ré para trás... ;)

Abcs,
Julio
@juliobash
P
róximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 09 a 13/03/15
São Paulo 4Linux 24 a 28/11/14
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.


Em 13 de dezembro de 2014 19:45, Jonathan Lessa address@hidden [shell-script] <address@hidden> escreveu:
 

Se não me engano, em um curso que fiz com o Julio, vi que o ideal para testar comparações numéricas é com parênteses e não com colchetes.

(( $? == 0 ))  && echo igual || echo diferente

Julio, desculpe se falo errado... Kkkk

Em 13/12/2014 18:37, "'Julio C. Neves' address@hidden [shell-script]" <address@hidden> escreveu:
 

Fala Herbert,
acho que vc está misturando um monte de conceitos.

1 - Toda vez que vejo um if [ $? -eq ... ], desconfio, quase com certeza que o script está muito mal escrito.

A função do if é testar instrução, então não tem por que c executar a instruçõ e testar o seu retorno. Otimize isso assim:

if who | grep usuario &> /dev/null
then
    echo "logado"
else
    echo "não logado"
fi

Mas o erro não está aí, estou só te mostrando como otimizar e programar limpo.

2 - &> só passou a funcionar no bash 4.0. Se vc estiver abaixo dessa versão, já era!

3 - Existe um vetor do sistema que te devolve o $? de cada um dos componentes de uma linha com pipes (|) é o PIPESTATUS, veja:

$ who | grep usuario &> /dev/null
$ echo ${PIPESTATUS[@]}
0 1

Isso significa que o who foi bem sucedido e o grep deu zebra.

4 - Como o grep não dá erro caso não case com ninguém, basta mandar a saída primária para /dev/null, ou usar a facilidade que o próprio grep oferece:

$ who | grep -q usuario


Abcs,
Julio
@juliobash
P
róximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 09 a 13/03/15
São Paulo 4Linux 24 a 28/11/14
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.


Em 13 de dezembro de 2014 14:12, Herbert Parentes Fortes Neto (hpfn) address@hidden [shell-script] <address@hidden> escreveu:
 

olá,

estou com uma dúvida bem básica. dá até vergonha de dizer.

se faço: who | grep usuario &> /dev/null || echo "nao logado"
tenho o retorno esperado.

mas isso não está funcionando:

who | grep usuario &> /dev/null

if [ $? ] # tanto faz o valor de $? - 0 ou 1. estou sempre logado
then
echo "logado"
else
echo "não logado"
fi

o que está errado ?

abraço,
--
Herbert Parentes Fortes Neto (hpfn)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]