PROBLÈME AVEC UN SCRIPT bash DONT JE NE PEUX TRAITER LE RETOUR DES FONCTIONS

Bonjour, comme vous le savez pour certains d’entre vous ,j 'ai un niveau qui se respecte en bash mais je n’ai jamais prétendu être un expert, c’est pourquoi je vais vous exposer mon probleme ; Il s’agit d’un tout petit script qui va me rendre le service de vérifier la connectivité du réseau et contrôler l’état de l’imprimante.

#!/bin/bash
########## donc jarrête mon pare-feu, je lance l'interface qui va communiquer avec l'imprimante#######
systemctl stop nftables.service
interface=$(ip link show | grep ": enp" | awk '{ print $2}' | sed -e "s/://")
ifconfig $interface 192.168.0.141 netmask 255.255.255.0 up
STATUS=$(ip link show | grep ": enp" | awk '{ print $9}');

if [ "$STATUS" == "UP" ]; then
	echo "interface UP"                           #<- la carte réseau est UP c'est cool, 
                                                                            # mais l'imprimante... est-elle allumée ?
else
	echo "interface DOWN"
	exit 2
fi

filtre=$(echo "global "$interface)                                            #ici je reformule la presentation de l'adresse ip
                                                                                                               # de telle façon que je puis déterminer si elle est                                                                                                                                                        
IP=$(ip a | grep "$filtre" | cut -d '/' -f1 | cut -d ' ' -f6)        # ok

function valid_ip()
{
    local  IPA1=$1
    local  stat=1

    if [[ $IPA1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]];
    then
        OIFS=$IFS # Save the actual IFS in a var named OIFS
        IFS='.'   # IFS (Internal Field Separator) set to .
        ip=($ip)  # ¿Converts $ip into an array saving ip fields on it?
        IFS=$OIFS # Restore the old IFS

        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]  # If $ip[0], $ip[1], $ip[2] and $ip[3] are minor or equal than 255 then

        stat=$? # $stat is equal to TRUE if is a valid IP or FALSE if it isn't

    fi # End if

    return $stat  # Returns $stat
}

valid_ip $IP
if [ $? -eq 1 ];then
	exit 2
else
	echo "IP vérifiée et correcte : $IP"
fi

function pause()
       {
       read -p "$*"
       }
ifconfig
systemctl status nftables
 
result=$(ping -c1 -I enp4s0 192.168.0.199 | grep "received" | awk -F ' ' '{ print $1 }' );
echo $result


############ C'EST ICI QUE ÇA SE CORSE !!!! LE SIMPLE TEST SUIVANT NE PREND JAMAIS LA VALEUR SOUHAITÉ ET JE NE COMPRENDS PAS POURQUOI !!!
resultat=$(($result)) # <-ai tenté de formater le résultat en chiffre, on sait jamais...

case $resultat in
	"1")
		echo "OK";;                                                                                                                                  
	"0")                                                             
		echo "NON";;
	*)
		echo "par défaut";;
	esac

ifconfig $interface 192.168.0.141 netmask 255.255.255.0 down
exit 2

→ qu’il se passe c’est quelque soit le test effectué, j’ai essayé avec un if then else fi, idem, on dirait que la valeur lue est « neutre » , comment dire … sans valeur quoi ! du coup dans case , il prend toujours la valeur par defaut que l’imprimante soit allumée ou non.
Il y a dans ce programme quelque chose que j’ignore : est-ce un pb avec bash ? est-ce le traitement du retour du ping ? franchement je ne vois pas !
si qqn a la solution, franchement merci !

Salut,
Pour vérifier la connectivité du réseau un simple ping suffit.

Pas besoin pour resultat, utilise result directement ca marched très bien

 res=`ping -c1 192.168.1.254 | grep "received" | awk -F ' ' '{ print $1 }'`
root@dsrvbull01:~# echo $res
1
root@dsrvbull01:~# case $res in
> "1) echo "c'est bon";;
> "0") echo "pas bon";;
> *) echo "par defaut"
> esac
> ^C
root@dsrvbull01:~# case $res in "1") echo "c'est bon";;
"0") echo "pas bon";;
*) echo "par defaut"
esac
c'est bon

Bonjour

Puisque c’est du bash
je te propose quelques idées de simplification :

mic@deb12:~$ interface=$(ip -br link show | awk '/^enp/{print $1}')
mic@deb12:~$ status=$(ip -br link show | awk '/^'$interface'/{print $2}')
mic@deb12:~$ filtre="global $interface"
mic@deb12:~$ 
mic@deb12:~$ echo -e "interface : $interface\nstatus    : $status\nfiltre    : $filtre"
interface : enp0s25
status    : UP
filtre    : global enp0s25
mic@deb12:~$ 

L’idée, c’est que quand ça devient trop compliqué,
c’est qu’on a peut-être oublié d’utiliser une option qui rendrait les choses plus simples.

Bonjour

d’abord merci pour vos réponses et/ou améliorations. Grace à vous j’ai fini par trouver mon erreur ! je faisais le test sur le résultat du paquet transmis tandis que je chercher à réaliser le test sur le paquet transmis… ha c’est ballot !!!

donc pour corriger mon script c’est dans la variable $result qu’il fallait agir :

result=$(ping -c1 -I enp4s0 192.168.0.199 | grep "received" | awk -F ' ' '{ print $4 }' ); echo $result

là c’est OK

Tu peux aussi utiliser le code de retour de la commande ping

if ping -c1 -I enp4s0 192.168.0.199 >/dev/null; then 
    echo "OK"
  else
    echo "NON"
fi