Statut de sortie dans le script bash

J'essaye de créer un script qui peut me laisser mettre le nombre de port comme paramètre et ensuite find le nom du service pour ce port. Voici le 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 

Tout fonctionne parfaitement mais il y a un problème. Si je tape un port comme 99999 (ou un autre port de fiction) – "exit status" pour grep -E "\W$1\/" /etc/services | awk '{ print $1 }' grep -E "\W$1\/" /etc/services | awk '{ print $1 }' sera aussi 0. De cette façon, tous les résultats de mes scripts seront corrects et l'instruction de mon script ne fonctionnera pas. Que vais-je faire pour find la solution à ce problème et laisser mon else fonctionne bien avec "statut de sortie"?

Vous n'avez pas besoin de grep ici, awk peut faire la correspondance de pattern sur le numéro de port.

awk peut également vérifier si le port a été trouvé ou non et quitter avec un code de sortie approprié.

Par exemple:

 $ 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 

La exit !found fonctionne car les variables awk par défaut à zéro (ou true) si elles n'ont pas été définies auparavant – exit !0 est exit 1 . Donc, si nous définissons found=1 lorsque nous apparaissons, alors exit !found dans le bloc END est exit 0 .

Voici comment utiliser ce script awk avec votre 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 

Vous pouvez aussi le faire comme ceci:

 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 même comme ça:

 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)!" 
 x=$(sed -ne"\|^\([^ ]*\) *\($1\)/.*|!d;h;s//\2/p;g" \ -e's||Found service: \1|w /dev/fd/2' -eq </etc/services) exit "$((!${x:?No service found for: "$1"}))"