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

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

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


From: Julio C. Neves
Subject: Re: [Bulk] Re: [shell-script] teste retorno comando
Date: Sun, 14 Dec 2014 12:09:20 -0200

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]