4 votes

Déclaration conditionnelle utilisant rexep avec bash

Je souhaite utiliser la structure "regexp conditionnelle" de bash, présente depuis la troisième version de bash (circa 2004). C'est censé se passer comme suit :

if [[ $string =~ $regexp ]]; then
#do smthg
else
#do somthg else
fi

Voici donc mon code, qui suit cette structure, et dont le rôle est de vérifier si le nom contenu dans SSID est présent dans la sortie de iw dev wlan0 link :

if [[ $(iw dev wlan0 link) =~ $SSID+ ]]; then 
    #do sthming 
else
    echo "wrong network"

fi

Pour une raison que je n'arrive pas à déchiffrer, cette déclaration fonctionne assez bien si je la lance directement dans le shell bash, comme par exemple

if [[ $(iw dev wlan0 link) =~ $SSID+ ]]; then echo found; else echo not found; fi

Mais si je l'exécute à l'intérieur du script qu'il contient, il se recrachera :

scripts/ssidchecker.sh: 22: [[: not found

22 étant la ligne du mot-clé "fi". Le plus étrange est qu'il exécute toujours le code contenu dans l'instruction "else".

Est-ce que "not found" est censé m'indiquer que la regexp n'a rien trouvé dans cette chaîne ? S'agit-il d'un véritable message d'erreur ?

4voto

Samveen Points 1996

Note de départ : la réponse a été élaborée à partir des commentaires sur la question, en particulier en réponse au dernier commentaire.

Tout d'abord, qu'est-ce que [[ ? Il s'agit d'un mot-clé du shell.

samveen@maverick:~$ type [[
[[ is a shell keyword

Cela signifie que [[ est un mot-clé interne à bash, pas une commande, et ne fonctionnera donc pas avec d'autres shells. Ainsi, votre sortie d'erreur

scripts/ssidchecker.sh: 22: [[: not found

signifie que l'interpréteur de commandes que vous utilisez est probablement

  • Pas de bash
  • Une version de bash antérieure à la version 2.02 ( [[ introduite dans Bash-2.02)

Etant donné que la version 2.02 est vraiment très ancienne (avant l'an 2000), tout ceci indique simplement que le shell que vous utilisez pour exécuter le script n'est probablement pas /bin/bash au lieu d'être probablement /bin/sh qui est le chemin le plus couramment utilisé pour les scripts de l'interpréteur de commandes Bourne. shebang (le #! ).

Veuillez le remplacer par /bin/bash ou exécuter explicitement bash scripts/ssidchecker.sh et vous êtes prêt à partir.

Quant à la raison pour laquelle la else a toujours été exécutée, la section [[ n'est pas trouvée est la même chose qu'un échec (valeur de retour non-nulle), du point de vue de if . Ainsi, le else est exécutée.

samveen@maverick:~$ /bin/whosyourdaddy
-bash: /bin/whosyourdaddy: No such file or directory
samveen@maverick:~$ echo $?
127

En ce qui concerne la portabilité, le wiki des hackers de bash indique également ce qui suit à propos de l'option [[ mot-clé :

Parmi les principaux "langages POSIX-shell superset" (à défaut d'un langage de type meilleur terme) qui ont [[ La commande composée de l'expression de test est la suivante l'une des fonctionnalités non-POSIX les plus portables. A l'opérateur La quasi-totalité des caractéristiques principales sont les mêmes entre Ksh88, Ksh93, mksh, Zsh et Bash. Ksh93 ajoute également un grand nombre de fonctionnalités uniques de uniques non supportées par les autres interpréteurs de commandes, notamment le support de plusieurs dialectes de regex différents, qui sont invoqués en utilisant une syntaxe différente de celle de Bash. une syntaxe différente de celle de Bash =~ mais =~ est toujours soutenu et prend par défaut la valeur ERE.

Ainsi, votre script échouera probablement sur la page =~ même si la coquille supporte [[ au cas où la coquille ne serait pas bash mais soutient [[ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X