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"}))"