Sair do status no script bash

6

Estou tentando criar um script que me permita colocar o número de porta como parâmetro e, em seguida, encontrar o nome do serviço para essa porta. Aqui está o script:

#!/bin/bash

grep -E "\W$1\/" /etc/services | awk '{ print $1 }'
if [ $? -eq 0 ]; then 
echo "Service(s) is(are) found correctly!"
else
echo "There is(are) no such service(s)!"
fi

Tudo funciona perfeitamente, mas há um problema. Se eu digitar essa porta como 99999 (ou outra porta de ficção) - "status de saída" para grep -E "\W$1\/" /etc/services | awk '{ print $1 }' também será 0. Dessa forma, todos os resultados dos meus scripts estarão corretos e else no meu script não funcionará . O que eu farei para encontrar a solução para esse problema e deixar meu else funcionar bem com "status de saída"?

    
por fuser 02.12.2015 / 09:34

2 respostas

6

Você não precisa de grep aqui, awk pode fazer a correspondência de padrões no número da porta.

awk também pode acompanhar se a porta foi encontrada ou não e sair com um código de saída apropriado.

Por exemplo:

$ port=23
$ awk  '$2 ~ /^'"$port"'\// {print $1 ; found=1} END {exit !found}' /etc/services 
telnet
$ echo $?
0

$ port=99999
$ awk  '$2 ~ /^'"$port"'\// {print $1 ; found=1} END {exit !found}' /etc/services 
$ echo $?
1

O exit !found funciona porque as variáveis awk assumem o padrão como zero (ou verdadeiro) se não tiverem sido definidas anteriormente - exit !0 is exit 1 . Portanto, se definirmos found=1 quando correspondermos, então exit !found no bloco END será exit 0 .

Veja como usar o script awk com seu if / then / else.

#!/bin/bash

awk  '$2 ~ /^'"$1"'\// {print $1 ; found=1} END {exit !found}' /etc/services 
if [ $? -eq 0 ]; then 
    echo "Service(s) is(are) found correctly!"
else
    echo "There is(are) no such service(s)!"
fi

Você também pode fazer assim:

if awk  '$2 ~ /^'"$1"'\// {print $1;found=1} END{exit !found}' /etc/services ; then 
    echo "Service(s) is(are) found correctly!"
else
    echo "There is(are) no such service(s)!"
fi

Ou até mesmo assim:

awk  '$2 ~ /^'"$1"'\// {print $1 ; found=1} END {exit !found}' /etc/services \
  && echo "Service(s) is(are) found correctly!" \
  || echo "There is(are) no such service(s)!"
    
por 02.12.2015 / 09:51
0
x=$(sed -ne"\|^\([^ ]*\) *\($1\)/.*|!d;h;s///p;g" \
        -e's||Found service: |w /dev/fd/2' -eq </etc/services)
exit "$((!${x:?No service found for: "$1"}))"
    
por 02.12.2015 / 13:33