Analyse variable correcte et citant en bash

Analyse variable correcte et citant en bash

Une citation incorrecte dans le code source d'origine peut facilement conduire à des bogues lorsque les entrées fournies par les utilisateurs ne sont pas comme prévu ou non uniformes. Au fil du temps, lorsque les scripts bash changent, un effet secondaire imprévu d'une variable mal citée peut conduire à un bogue même dans un code autrement intact. Ceci est encore plus important pour les applications liées à la sécurité qui peuvent être sujettes à des tentatives de piratage. Apprenez à faire correctement la citation et l'analyse / validation variable dès le départ, et évitez bon nombre de ces problèmes! Commençons…

Dans cette série de tutoriels, vous apprendrez:

  • Comment citer correctement vos variables bash
  • Les mises en garde et les résultats d'une citation incorrecte
  • Comment s'assurer que les valeurs variables sont ce qu'elles sont censées être
  • Comment vérifier les valeurs variables vides, numériques et textuelles
Analyse variable correcte et citant en bash

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution Linux
Logiciel Ligne de commande bash, système basé sur Linux
Autre Toute utilité qui n'est pas incluse dans le shell bash par défaut peut être installée en utilisant Sudo Apt-Get Install Utility-Name (ou yum au lieu de Apt-get)
Conventions # - nécessite que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - exige que les commandes Linux soient exécutées en tant qu'utilisateur régulier non privilégié

Exemple 1: citez ces variables!

À moins que vous ne travailliez avec des valeurs numériques, et même dans ce cas parfois, il est sage de toujours citer vos variables textuelles lors de la vérification de l'égalité, etc. Regardons un exemple:

$ Var1 = "a"; si [$ var1 == "A"]; Puis écho 'Oui!';; fi oui! $ Var1 =; si [$ var1 == "A"]; Puis écho 'Oui!';; fi bash: [: ==: opérateur unary attendu 


Nous avons d'abord défini Var1 à la valeur un et a ensuite vérifié si Var1 égalé un. Cela a fonctionné, et nous pouvons penser que notre code est bien et le laisser tel quel dans notre script. Cependant, quelque temps plus tard et après de nombreux changements de code, nous commençons à voir bash: [: ==: l'opérateur unary attendu - Un message quelque peu cryptique nous disant qu'il y a quelque chose de mal avec notre code.

La raison est montrée dans le deuxième exemple. Si notre variable est vide, je.e. n'a pas été réglé correctement (ou a été effacé depuis le réglage), alors nous serons présentés avec une erreur car Bash le lit effectivement; Si [== "A"] qui est une déclaration qui n'a pas beaucoup de sens, et elle ne calcule pas.

Si nous avons correctement cité notre variable avec des devis doubles ("), cela ne se produirait pas:

$ Var1 =; si ["$ var1" == "A"]; Puis écho 'Oui!';; fi $ 

Cette fois, Bash a lu la déclaration comme Si ["" == "A"] - une déclaration à la fois plus facile sur les yeux et le compilateur bash. Aucune sortie n'est générée comme clairement une chaîne vide ne correspond pas à la lettre un.

Exemple 2: Prendre des citations un peu plus loin

Une fois que vous avez travaillé avec Bash depuis un certain temps, vous apprendrez certains de ses idiomes de langue. Un tel idiome est le - appelons-le privilège (et c'est sûrement une commodité!) - Pour pouvoir citer des variables numériques même si une opération numérique est en cours d'exécution:

$ Var1 = 13; si ["$ var1" -eq 13]; Puis écho 'Oui!';; fi oui! $ Var1 = 7; si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi 

Même si var1 est défini sur une valeur numérique, Bash acceptera le " Citant autour de Var1 et produisez correctement le résultat de l'instruction if en utilisant le est égal (je.e. -égaliseur) opération de comparaison.

Pourtant, nous n'avons pas encore atteint la boucle, car les suivants échouent toujours;

$ Var1 =; si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi bash: [:: Expression entière attendue 

Cette fois, une expression entière est attendue, mais une variable vide (i.e. "" a été passé), et ce n'est certainement pas numérique. Y'a t'il un moyen d'arranger cela? Bien sûr:

Exemple 3: Vérification de la longueur zéro

$ Var1 =; si [-n "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi $ var1 = 13; si [-n "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi oui! 

Ici, nous utilisons un pré-vérification pour voir si la variable n'a pas de longueur de zéro en utilisant l'instruction conditionnelle -n ce qui signifie que La chaîne n'a pas de longueur de zéro. Cela pourrait également être échangé pour l'inverse en utilisant ! -z-z moyens La chaîne a une longueur de zéro et le ! nie la même chose, je.e. Inverse le résultat:

$ Var1 =; si [ ! -z "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi $ var1 = 13; si [ ! -z "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi oui! $ Var1 = 7; si [ ! -z "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi $ 


Nous avons également ajouté le = 7 Exemple ici pour montrer comment le si Fonctions de déclaration correctement. Testez toujours votre si Déclarations et conditions dans une variété de situations, de cas d'utilisation et d'exceptions génériques (mauvaises valeurs, sans valeur, valeurs impaises, etc.) Si vous souhaitez vous assurer que votre code sera exempt de bugs.

Exemple 4: un chèque presque complet

Il y a encore une lacune dans le dernier exemple. L'avez-vous ramassé? Fondamentalement, si nous passons des valeurs textuelles à la chaîne, ou si La déclaration échoue toujours:

$ Var1 = "a"; si [ ! -z "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi bash: [: a: expression entière attendue 

Cela peut être surmonté en utilisant une sous-coquille, grep, Et quelques expressions régulières. Pour plus d'informations sur les expressions régulières, consultez nos articles d'exemples de bash regexps pour les débutants avec des exemples et un bash avancé avec des exemples d'exemples. Pour plus d'informations sur les sous-coquilles bash, consultez nos sous-coquilles Linux pour les débutants avec des exemples et des sous-coquilles Linux avancées avec des exemples d'exemples.

La syntaxe n'est pas trop complexe:

$ Var1 = 7; si ["$ (echo" $ var1 "| grep -o '[0-9] \ +')" == "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi $ var1 = 13; si ["$ (echo" $ var1 "| grep -o '[0-9] \ +')" == "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi oui! $ Var1 = "a"; si ["$ (echo" $ var1 "| grep -o '[0-9] \ +')" == "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; fi $ 

Super. Ici, nous vérifions le contenu de Var1 être numérique en utilisant un grep -o (grep seulement; je.e. grep uniquement la pièce correspondante par la chaîne de recherche, qui est dans ce cas une expression régulière). Nous sélectionnons n'importe quel caractère numéro dans 0-9 et ça une ou plusieurs fois (comme indiqué par le \+ qualificatif au [0-9] Plage de sélection). Ensuite, nous essayons de faire correspondre cela partie correspondante Grep uniquement texte contre la variable d'origine. Est-ce la même chose? Si oui, alors notre variable se compose uniquement de nombres.

Lorsque nous élargissons notre extérieur si déclaration un peu pour inclure un autre clause qui nous dira si une variable n'est pas numérique, et quand nous essayons de passer 'un' En entrée, nous voyons que les différentes entrées sont correctement analysées;

$ Var1 = 7; si ["$ (echo" $ var1 "| grep -o '[0-9] \ +')" == "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; Else Echo 'variable pas numérique!';; fi $ var1 = 13; si ["$ (echo" $ var1 "| grep -o '[0-9] \ +')" == "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; Else Echo 'variable pas numérique!';; fi oui! $ Var1 = "a"; si ["$ (echo" $ var1 "| grep -o '[0-9] \ +')" == "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; Else Echo 'variable pas numérique!';; la variable fi non numérique! 


Alors maintenant, nous avons une ligne parfaite pour notre code, non? Non… nous manquons toujours quelque chose… Voyez-vous quoi?

Exemple 5: un chèque complet

Avez-vous vu le problème? Nous n'avons pas encore vérifié une variable vide!

$ Var1 = "; if [" $ (echo "$ var1" | grep -o '[0-9] \ +') "==" $ var1 "]; alors si [" $ var1 "-eq 13]; puis écho 'Oui!';; Fi; Else Echo 'variable pas numérique!';; Fi bash: [:: Expression entière attendue 

Aie. J'espère maintenant que vous voyez pourquoi je mentionne régulièrement dans mes articles pour toujours vérifier vos créations de code d'une manière ou d'une autre. Bien sûr, Bash se prête à des scripts rapides et faciles, mais si vous voulez vous assurer que les choses continueront à fonctionner correctement lors de la modification de vos scripts ou de l'ajout de code supplémentaire, vous voudrez vous assurer que vos tests, entrées et sorties sont propres et clairement définis. Le correctif est facile:

$ Var1 = "; si [ ! -z "$ var1" -a "$ (echo" $ var1 "| grep -o '[0-9] \ +')" == "$ var1"]; alors si ["$ var1" -eq 13]; Puis écho 'Oui!';; Fi; Else Echo 'variable pas numérique!';; la variable fi non numérique! 

Ici, en utilisant le poing si déclaration, nous ajoutons une condition supplémentaire pour la variable Var1 ne pas (!) être une variable de longueur nulle. Cela fonctionne bien étant donné la configuration actuelle comme la deuxième partie du premier si La déclaration peut toujours se dérouler indépendamment du contenu de Var1.

Conclusion

Dans cet article, nous avons examiné comment citer correctement et analyser / évaluer les variables, et nous avons exploré à quel point il était complexe pour écrire une variable parfaite vérification du code de bash. Apprendre à faire ces choses correctement dès le départ limitera considérablement la quantité de bugs possibles qui peuvent être introduits par accident.

Profitez et doublez-vous de ces variables! 🙂

Tutoriels Linux connexes:

  • Liste des meilleurs outils Kali Linux pour les tests de pénétration et…
  • Gestion de la saisie des utilisateurs dans les scripts bash
  • Boucles imbriquées dans les scripts bash
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Advanced Bash Regex avec des exemples
  • Tutoriel de débogage GDB pour les débutants
  • Masterring Bash Script Loops
  • Variables de bash spéciaux avec des exemples
  • Python Expressions régulières avec des exemples
  • Comment utiliser des sous-coquilles bash à l'intérieur des instructions IF