Escrevendo um script para verificar se a saída de um comando é “3”

2

Estou tentando escrever um script para executar um comando e, se a saída do comando for 3, o script deverá sair e, se não for 3, o script deverá enviar um email para informar que a contagem não é 3. Eu escrevi este código abaixo, mas por algum motivo, toda vez que eu corro, eu continuo recebendo e-mail dizendo que a saída não é 3, mesmo que seja 3.

#!/bin/bash

Server_Count=""
   nslookup servers | grep -i "Address: 10" | wc -l > /dev/null
   if [ $? == 3 ]; then
       Server_Count="$?"
else
   echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]

fi
    
por Katkota 10.08.2018 / 23:16

2 respostas

4

$? será o código de saída do comando anterior e não o resultado do comando anterior. Portanto, supondo que o comando seja bem-sucedido, $? será 0.

Você quer a substituição de comandos:

#!/bin/bash

server_count=$(nslookup servers | grep -i "Address: 10" | wc -l)
if [[ "$server_count" -ne 3 ]]; then
  echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]
fi

Isso definirá server_count para os resultados de wc -l , portanto, não há necessidade de configurá-lo novamente em sua instrução if. Por isso, neguei a verificação if (se a contagem do servidor não for igual a 3, envie o email, caso contrário, não faça nada).

Além disso, a -ne check está sendo usada aqui, que é a verificação correta para a comparação de números inteiros.

Em uma nota lateral, você estava usando o teste de shell POSIX [ ... ] com um operador de comparação bash == . Isso ainda funcionará em muitos sistemas, mas cuidado ao usar [ ... ] , você deve usar = e, ao usar [[ ... ]] , você pode usar = ou == .

    
por 10.08.2018 / 23:22
0

Como Jesse_b explicou , seu código não funciona porque você está vendo o status de retorno de wc -l em vez dos dados retornados.

if nslookup servers | grep -c -iF "Address: 10" | ! grep -q -xF 3; then
    echo 'Server count is not 3... please check' | mail -s 'Server count issue' [email protected]
fi

Isso elimina a necessidade de salvar coisas em variáveis contando o número de linhas que corresponde à string dada na saída de nslookup , e se essa contagem não for exatamente três, ele enviará um email.

Com -c , grep produzirá o número de linhas que correspondem ao padrão fornecido. A opção -q para grep pára o grep de gerar saída. Aqui, estamos interessados apenas em saber se grep corresponde ou não ao 3 e verificamos isso por seu status de retorno. Com -x forçamos uma correspondência em toda a linha (ou seja, corresponderemos apenas 3 e não 30 ). A opção -F torna grep uma correspondência de cadeia em vez de uma correspondência de expressão regular.

    
por 13.08.2018 / 16:34