Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/12/2015, à 11:44

Gaara

[BASH] boucle while en testant une chaine (résolu)

Salut à tous,

Je cherche à comparer une chaine de caractère avec une autre, en faisant une boucle:

Tant que "mot" est dans ma chaine, attendre et refaire le test.
J'ai donc écrit ça mais ça ne semble pas fonctionner:

while [ "$CHAINE" == "mot" ]
do
   sleep 2
   test (récupération nouvelle chaine)
done

Qu'est ce qui ne va pas?

Merci

Dernière modification par Gaara (Le 10/12/2015, à 13:08)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#2 Le 10/12/2015, à 12:12

Watael

Re : [BASH] boucle while en testant une chaine (résolu)

salut,

« ça ne semble pas fonctionner » = « ça marche pas »
-> c'est pas la description la plus précise de ce que tu attends, et de ce qui se passe sad


d'abord == n'est pas POSIX; bash le tolère (ça ne provoque pas de faute, contrairement à dash) avec la commande test, mais, àmha, il ne devrait être utilisé qu'avec [[.

dans un test simple ( [ ... ] ), la chaîne à droite doit être identique à celle de gauche, et non incluse/comprise dedans.
il faudrait utiliser un test avancé ( [[ ... ]] )

motif="*mot*"
[[ "chaîne avec mot dedans" == $motif ]] && echo ok || echo ko
ok

et puis, il faut qu'à un moment $chaine soit modifiée pour sortir de la boucle.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 10/12/2015, à 12:15

pingouinux

Re : [BASH] boucle while en testant une chaine (résolu)

Bonjour,
Déjà, test est une commande qui existe.
Si tu ne modifies pas CHAINE dans la boucle, soit tu n'y passes pas, soit tu n'en sors jamais.

Hors ligne

#4 Le 10/12/2015, à 12:17

Gaara

Re : [BASH] boucle while en testant une chaine (résolu)

@Watael:
oui désolé, en fait le script sort de la boucle même si "mot" est dans la chaine.
Je vais tester ça, merci

@pingouinux
oui le test modifie bien la chaine en question (avec un sleep 2), et la boucle continue ainsi jusqu'à ce que "mot" n'apparaisse plus
J'ai modifié mon premier message.

Dernière modification par Gaara (Le 10/12/2015, à 12:47)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#5 Le 10/12/2015, à 12:51

Gaara

Re : [BASH] boucle while en testant une chaine (résolu)

Bon, je ne m'en sort pas tongue
Je met mon code réel, ça teste si je suis connecté en VPN avant de lancer un logiciel

IP=$(wget http://ipinfo.io/ip -qO -)
LIEU=$(/usr/bin/host $IP)
motif=*$LIEU*
while [[ "fr" == $motif ]]
do
   sleep 2
   IP=$(wget http://ipinfo.io/ip -qO -)
   LIEU=$(host $IP)
   echo $LIEU
   motif=*$LIEU*
done
notify-send "$LIEU"

Mais ça ne fonctionne toujours pas, il sort de la boucle alors qu'il ne devrait pas sad
Ah désolé j'ai vu une erreur je remodifie -> ça ne fonctionne toujours pas

Dernière modification par Gaara (Le 10/12/2015, à 12:56)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#6 Le 10/12/2015, à 13:01

pingouinux

Re : [BASH] boucle while en testant une chaine (résolu)

Si tu veux tester si $motif contient fr, tu dois faire ceci

while [[ $motif =~ fr ]]

Hors ligne

#7 Le 10/12/2015, à 13:07

Gaara

Re : [BASH] boucle while en testant une chaine (résolu)

Ah oui ! Merci bcp, ça fonctionne maintenant.
Comme toujours tu me sauves la mise.

résolu !


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#8 Le 10/12/2015, à 13:24

tiramiseb

Re : [BASH] boucle while en testant une chaine (résolu)

Petite remarque en passant : à ta place, je regarderais les routes plutôt que de regarder l'IP publique... c'est moins lourd et ça ne fait pas un timeout si le net est injoignable.

Hors ligne

#9 Le 10/12/2015, à 13:29

Gaara

Re : [BASH] boucle while en testant une chaine (résolu)

Oui, merci tiramiseb, je n'y avait pas pensé, à part la seconde partie.
Pour le moment, si le net est injoignable, je fais ça:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
   code précédent
else
   sleep 10
   //puis je relance le script
   exit 0
fi

Pour tester les routes, je ne sais pas trop faire. (je ne sais même pas ce que c'est, mais je vais étudier ça!)

Merci

Dernière modification par Gaara (Le 10/12/2015, à 13:30)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#10 Le 10/12/2015, à 13:31

tiramiseb

Re : [BASH] boucle while en testant une chaine (résolu)

Tu fais "ip route | grep ^default"

Hors ligne

#11 Le 10/12/2015, à 13:35

Gaara

Re : [BASH] boucle while en testant une chaine (résolu)

ah oui smile
effectivement c'est plus simple!
merci


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne