Comment utiliser les tests conditionnels à double crochet sous Linux

0
458
fatmawati achmad zaenuri/Shutterstock.com

Les tests conditionnels ramifient le flux d'exécution des scripts Linux Bash en fonction du résultat d'une expression logique. Les tests conditionnels à double parenthèse simplifient considérablement la syntaxe—mais ont toujours leurs propres pièges.

Parenthèses simples et doubles

Bash fournit la commande de test. Cela vous permet de tester des expressions logiques. L'expression renverra une réponse qui indique une réponse vraie ou fausse. Une vraie réponse est indiquée par une valeur de retour de zéro. Tout autre que zéro indique faux.

Enchaîner les commandes sur la ligne de commande avec le && l'opérateur utilise cette fonction. Les commandes ne sont exécutées que si la commande précédente se termine avec succès.

Si le test est vrai, le mot “Oui” sera imprimé.

test 15 -eq 15 && echo “Oui” test 14 -eq 15 && echo “Oui”

Les tests conditionnels à crochet unique imitent la commande de test. Ils placent l'expression entre crochets “[ ]” et fonctionne exactement comme la commande de test. En fait, il s'agit du même programme, créé à partir du même code source. La seule différence opérationnelle réside dans la manière dont la version de test et la [ version gèrent les demandes d'aide.

Ceci provient du code source :

/* Reconnaît –help ou –version, mais uniquement lorsqu'il est invoqué sous la forme “[“, lorsque le dernier argument n'est pas “]”. Utilisez l'analyse directe, plutôt que parse_long_options, pour éviter d'accepter des abréviations. POSIX permet à “[ –help” et “[ –version” d'avoir le comportement habituel de GNU, mais il faut que “test –help” et “test –version” sortent silencieusement avec le statut 0. */Advertisement

Nous pouvons voir l'effet de cela en demandant de l'aide à test et [ et en vérifiant le code de réponse envoyé à Bash.

test –help echo $? [ –help echo $?

test et [ sont tous deux intégrés au shell, ce qui signifie qu'ils sont intégrés directement dans Bash. Mais il existe également une version binaire autonome de [ .

type test type [ où est [

< p>En revanche, les tests conditionnels à double crochet [[ et ]] sont des mots-clés. [[ et ]] effectuent également des tests logiques, mais leur syntaxe est différente. Parce qu'il s'agit de mots-clés, vous pouvez utiliser des fonctionnalités intéressantes qui ne fonctionneront pas dans la version à support unique.

Les mots-clés à double crochet sont pris en charge par Bash, mais ils ne sont pas disponibles dans tous les autres shells. Par exemple, le shell Korn les prend en charge, mais l'ancien shell simple, sh, ne les prend pas en charge. Tous nos scripts commencent par la ligne :

#!/bin/bash

Cela garantit que nous appelons le shell Bash pour exécuter le script.

CONNEXES : Comment créer et exécuter des scripts shell Bash sur Windows 10

Instruments et mots clés

Nous pouvons utiliser le programme compgen pour lister les éléments intégrés :

compgen -b | fmt -w 70 Advertisement

Sans faire passer la sortie via fmt, nous obtiendrions une longue liste avec chaque fonction intégrée sur sa propre ligne. Il est plus pratique dans ce cas de voir les éléments intégrés regroupés dans un paragraphe.

< p>Nous pouvons voir test et [ dans la liste, mais ] n'est pas répertorié. La [ commande cherche une fermeture ] pour détecter quand elle a atteint la fin de l'expression, mais ] n'est pas une commande intégrée distincte. C'est juste un signal que nous donnons à [ pour indiquer la fin de la liste des paramètres.

Pour voir les mots-clés, nous pouvons utiliser :

compgen -k | fmt -w 70

Les mots clés [[ et ]] sont tous les deux dans la liste, car [[ est un un mot-clé et ]] en est un autre. Ils forment une paire appariée, tout comme if et fi , et case et esac .

Lorsque Bash analyse un script—ou une ligne de commande—et détecte un mot-clé qui a un mot-clé de fermeture correspondant, il rassemble tout ce qui apparaît entre eux et applique le traitement spécial pris en charge par les mots-clés.

Avec une commande intégrée, ce qui suit la commande intégrée lui est transmis exactement comme les paramètres de tout autre programme en ligne de commande. Cela signifie que l'auteur du script doit faire particulièrement attention à des éléments tels que les espaces dans les valeurs des variables.

Shell Globbing

Les tests conditionnels à double crochet peuvent utiliser le shell globbing. Cela signifie l'astérisque “*” se développera pour signifier “n'importe quoi.”

Publicité

Tapez ou copiez le texte suivant dans un éditeur et enregistrez-le dans un fichier appelé “whelkie.sh.& #8221;

#!/bin/bash stringvar=”Whelkie Brookes” if [[ “$stringvar” == *elk* ]]; then echo “Attention contient des fruits de mer” else echo “Sans mollusques” fi

Pour rendre le script exécutable, nous devrons utiliser la commande chmod avec l'option -x (exécuter). Vous devrez le faire pour tous les scripts de cet article si vous voulez les essayer.

chmod +x whelkie.sh

Lorsque nous exécutons le script, nous voyons la chaîne “elk” a été trouvé dans la chaîne “Whelkie”, quels que soient les autres caractères qui l'entourent.

./whelkie.sh

Un point à noter est que nous n'entourons pas la chaîne de recherche de guillemets doubles. Si vous le faites, le globbing ne se produira pas. La chaîne de recherche sera traitée littéralement.

D'autres formes de shell globbing sont autorisées. Le point d'interrogation “?” correspondra à des caractères uniques, et des crochets simples sont utilisés pour indiquer des plages de caractères. Par exemple, si vous ne savez pas quel boîtier utiliser, vous pouvez couvrir les deux éventualités avec une fourchette.

#!/bin/bash stringvar=”Jean-Claude van Clam” if [[ “$stringvar” == *[cC]lam* ]]; puis echo “Avertissement contient des fruits de mer.” else echo “Sans mollusques.” fi

Enregistrez ce script sous le nom “damme.sh” et le rendre exécutable. Lorsque nous l'exécutons, l'instruction conditionnelle devient true et la première clause de l'instruction if est exécutée.

./damme.sh

Citations de chaînes

Nous avons mentionné plus tôt l'encapsulation des chaînes entre guillemets doubles. Si vous le faites, le shell globing ne se produira pas. Bien que la convention indique qu'il s'agit d'une bonne pratique, vous n'avez pas besoin d'envelopper les variables de chaîne entre guillemets lorsque vous utilisez [[ et ]] même si elles contiennent des espaces. Regardez l'exemple suivant. Les variables de chaîne $stringvar et $surname contiennent des espaces, mais aucune n'est citée dans l'instruction conditionnelle.

#!/bin/bash stringvar=”van Damme” surname=”van Damme” if [[ $stringvar = = $nom ]]; puis echo “Les noms de famille correspondent.” else echo “Les noms de famille ne correspondent pas.” fi Publicité

Enregistrez-le dans un fichier appelé “nom.sh” et le rendre exécutable. Exécutez-le en utilisant :

./surname.sh

Malgré les deux chaînes contenant des espaces, le script réussit et l'instruction conditionnelle se résout en vrai. Ceci est utile lorsqu'il s'agit de chemins et de noms de répertoires contenant des espaces. Ici, l'option -d renvoie true si la variable contient un nom de répertoire valide.

#!/bin/bash dir=”/home/dave/Documents/Needs Work” if [[ -d ${dir} ]]; then echo “Répertoire confirmé” else echo “Répertoire introuvable” fi

Si vous modifiez le chemin dans le script pour refléter un répertoire sur votre propre ordinateur, enregistrez le texte dans un fichier appelé “dir.sh&#8221 ; et rendez-le exécutable, vous pouvez voir que cela fonctionne.

./dir.sh

< strong>CONNEXES : Comment travailler avec des variables dans Bash

Filename Globbing Gotchas

Une différence intéressante entre [ ] et [[ ]] concerne les noms de fichiers contenant des globalisations. Le formulaire “*.sh” correspondra à tous les fichiers de script. L'utilisation de crochets simples [ ] échoue à moins qu'il n'y ait un seul fichier de script. La recherche de plus d'un script génère une erreur.

Voici le script avec des crochets conditionnels simples.

#!/bin/bash if [ -a *.sh ]; then echo “A trouvé un fichier de script” else echo “N'a pas trouvé de fichier de script” fi

Nous avons enregistré ce texte dans “script.sh” et l'a rendu exécutable. Nous avons vérifié le nombre de scripts dans le répertoire, puis exécuté le script.

ls ./script.sh

Publicité

Bash renvoie une erreur. Nous avons supprimé tous les fichiers de script sauf un et exécuté à nouveau le script.

ls ./script.sh

Le test conditionnel renvoie vrai et le script ne provoque pas d'erreur. L'édition du script pour utiliser des crochets doubles fournit un troisième type de comportement.

#!/bin/bash if [[ -a *.sh ]]; then echo “A trouvé un fichier de script” else echo “N'a pas trouvé de fichier de script” fi

Nous l'avons enregistré dans un fichier appelé “dscript.sh” et l'a rendu exécutable. L'exécution de ce script dans un répertoire contenant de nombreux scripts ne génère pas d'erreur, mais le script ne reconnaît aucun fichier de script.

L'instruction conditionnelle utilisant des crochets doubles ne se résout en vrai que dans le cas improbable où vous avez un fichier réellement appelé “*.sh” dans le répertoire.

./dscript.sh

ET et OU logiques

Les doubles crochets vous permettent d'utiliser && et || comme opérateurs logiques ET et OU.

Ce script doit résoudre l'instruction conditionnelle en vrai car 10 est égal à 10 et 25 est inférieur à 26.

#!/bin/bash first=10 second=25 if [[ first -eq 10 && deuxième -lt 26 ]]; then echo “Condition remplie” else echo “Condition failed” fi Publicité

Enregistrez ce texte dans un fichier appelé “and.sh”, rendez-le exécutable et exécutez-le avec :

./and.sh

Le script s'exécute comme prévu.

< p>Cette fois, nous utiliserons le || opérateur. L'instruction conditionnelle doit être résolue en vrai car bien que 10 ne soit pas supérieur à 15, 25 est toujours inférieur à 26. Tant que la première comparaison ou la deuxième comparaison est vraie, l'instruction conditionnelle dans son ensemble est résolue en vrai.

Enregistrez ce texte sous le nom “ou.sh” et rendez-le exécutable.

#!/bin/bash first=10 second=25 if [[ first -gt 15 || deuxième -lt 26 ]]; puis echo “Condition remplie.” else echo “La condition a échoué.” fi ./or.sh

Regex

Les instructions conditionnelles à double crochet permettent l'utilisation de l'opérateur =~, qui applique les modèles de recherche regex dans une chaîne à l'autre moitié de l'instruction. Si l'expression régulière est satisfaite, l'instruction conditionnelle est considérée comme vraie. Si l'expression régulière ne trouve aucune correspondance, l'instruction conditionnelle devient fausse.

CONNEXION : Comment utiliser des expressions régulières (regex) sous Linux

Enregistrez ce texte dans un fichier appelé “regex.sh” et rendez-le exécutable.

#!/bin/bash words=”un deux trois” WordsandNumbers=”un 1 deux 2 trois 3″ email=”dave@fabricateddomain.co.uk” mask1=”[0-9]” mask2=”[A-Za -z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}” si [[ $mots =~ $mask1 ]] ; then echo “”$mots” contient des chiffres.” else echo “Aucun chiffre trouvé dans “$mots”.” fi if [[ $WordsandNumbers =~ $mask1 ]] ; then echo “”$WordsandNumbers” contient des chiffres.” else echo “Aucun chiffre trouvé dans “$WordsandNumbers”.” fi if [[ $email =~ $mask2 ]]; alors echo “”$email” est une adresse e-mail valide.” else echo “Impossible d'analyser “$email”.” fi

Le premier ensemble de doubles crochets utilise la variable de chaîne $mask1 comme regex. Il contient le modèle pour tous les chiffres dans la plage de zéro à neuf. Il applique cette expression régulière à la variable de chaîne $words.

Le deuxième ensemble de doubles crochets utilise à nouveau la variable de chaîne $mask1 comme expression régulière, mais cette fois, il l'utilise avec la variable de chaîne $WordsandNumbers.

Publicité

Le dernier ensemble de doubles crochets utilise un masque d'expression régulière plus complexe dans la variable de chaîne $mask2 .

  • [A-Za-z0-9._ %+-]+: Cela correspond à n'importe quel caractère qui est une lettre majuscule ou minuscule, ou n'importe quel chiffre de zéro à neuf, ou un point, un trait de soulignement, un signe de pourcentage ou un signe plus ou moins. Le “+” en dehors du “[]” signifie répéter ces correspondances pour autant de caractères qu'il en trouve.
  • @ : cela correspond au “@” caractère uniquement.
  • [A-Za-z0-9.-]+: Cela correspond à n'importe quel caractère qui est une lettre majuscule ou minuscule, ou n'importe quel chiffre de zéro à neuf, ou un point ou un trait d'union. Le “+” en dehors du “[ ]” signifie répéter ces correspondances pour autant de caractères qu'il en trouve.
  • . : correspond au “.” caractère uniquement.
  • [A-Za-z]{2,4} : correspond à n'importe quelle lettre majuscule ou minuscule. Le “{2,4}” signifie correspondre à au moins deux caractères et au plus quatre.

En mettant tout cela ensemble, le masque regex vérifiera si une adresse e-mail est correctement formée.

Enregistrez le texte du script dans un fichier appelé “regex.sh” et le rendre exécutable. Lorsque nous exécutons le script, nous obtenons cette sortie.

./regex.sh

Le premier conditionnel L'instruction échoue car l'expression régulière recherche des chiffres mais il n'y a pas de chiffres dans la valeur contenue dans la variable de chaîne $words.

La deuxième instruction conditionnelle réussit car la variable de chaîne $WordsandNumbers contient des chiffres.

Publicité

La déclaration conditionnelle finale réussit—c'est-à-dire qu'elle est vraie—car l'adresse e-mail est correctement formatée.

Une seule condition

Les tests conditionnels à double crochet apportent flexibilité et lisibilité à vos scripts. Le simple fait de pouvoir utiliser des expressions régulières dans vos tests conditionnels justifie d'apprendre à utiliser [[ et ]].

Assurez-vous simplement que le script appelle un shell qui les prend en charge, comme Bash.

CONNEXES : 15 caractères spéciaux que vous devez connaître pour Bash

À LIRE SUIVANT

  • › Que signifie “ATM” La moyenne et comment l'utilisez-vous ?
  • › Écoutez, vous n'avez pas besoin d'ouvrir autant d'onglets de navigateur
  • › Pourquoi je suis passé à Garuda Linux
  • › Qu'est-ce que la faille Log4j et comment cela vous affecte-t-il ?
  • › Qu'est-ce que le spam et pourquoi l'appelons-nous ainsi ?
  • › Pourquoi l'avenir est sans mot de passe (et comment commencer)