Skip to main content

Guide du débutant à Bash - Conditions et variables

231 -TOUT SAVOIR SUR LE STATIONNEMENT EN CAMPING CAR ! REGLEMENTATION ET INTERDICTION ! | FamilyRoss (Avril 2025)

231 -TOUT SAVOIR SUR LE STATIONNEMENT EN CAMPING CAR ! REGLEMENTATION ET INTERDICTION ! | FamilyRoss (Avril 2025)
Anonim

introduction

Bienvenue dans la troisième partie du "Guide du débutant pour BASH". Si vous avez manqué les deux articles précédents, vous voudrez probablement savoir en quoi ce guide est différent des autres guides de scripts BASH.

Ce guide est écrit par un novice complet pour BASH et vous, lecteur, apprenez comme j'apprends. Bien que je sois novice chez BASH, je viens d’un milieu de développement logiciel bien que la plupart des choses que j’ai écrites soient destinées à la plate-forme Windows.

Vous pouvez voir les deux premiers guides en visitant:

  • Guide du débutant à BASH - Hello World
  • Guide du débutant vers BASH - Paramètres d'entrée

Si vous débutez dans les scripts BASH, je vous recommande de lire les deux premiers guides avant de continuer avec celui-ci.

Dans ce guide, je soulignerai comment utiliser des instructions conditionnelles pour tester les entrées de l'utilisateur et contrôler le fonctionnement d'un script.

Installer rsstail

Pour suivre ce guide, vous devez installer une application en ligne de commande appelée rsstail, utilisée pour lire les flux RSS.

Si vous utilisez une distribution basée sur Debian / Ubuntu / Mint, tapez ce qui suit:

sudo apt-get install rsstail

Pour Fedora / CentOS, etc., tapez ce qui suit:

miam installer rsstail

Pour openSUSE, tapez ce qui suit:

zypper installer rsstail

La déclaration IF

Ouvrez un terminal et créez un fichier appelé rssget.sh en tapant ce qui suit:

sudo nano rssget.sh

Dans l'éditeur nano, entrez le texte suivant:

#! / bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Enregistrez le fichier en appuyant sur CTRL et O, puis quittez en appuyant sur CTRL et X.

Exécutez le script en tapant ce qui suit:

sh rssget.sh

Le script renverra une liste de titres à partir du flux RSS de linux.about.com.

Ce script n’est pas excessivement utile car il récupère simplement les titres d’un flux RSS, mais il évite d’avoir à mémoriser le chemin du flux RSS Linux.about.com.

Ouvrez à nouveau le script rssget.sh dans nano et modifiez le fichier pour qu'il se présente comme suit:

#! / bin / bash

si $ 1 = "verbose"puis rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;Fi

Exécutez à nouveau le script en tapant ce qui suit:

sh rssget.sh verbose

Cette fois, le flux RSS revient avec le titre, le lien et la description.

Analysons le script avec un peu de détail:

Le #! / Bin / bash apparaît dans chaque script que nous écrivons. La ligne suivante examine essentiellement le premier paramètre d’entrée fourni par l’utilisateur et le compare au mot "verbose". Si le paramètre d'entrée et le mot "verbose" correspondent aux lignes entre puis et Fi sont courus.

Le script ci-dessus est évidemment imparfait. Que se passe-t-il si vous ne fournissez pas de paramètre d'entrée? La réponse est que vous obtenez une erreur de la part d'un opérateur inattendu.

L’autre défaut majeur est que si vous ne fournissez pas le mot "verbose", rien ne se passe du tout. Idéalement, si vous ne fournissez pas le mot commenté, le script renverra une liste de titres.

Utilisez à nouveau nano pour modifier le fichier rssget.sh et modifiez le code comme suit:

#! / bin / bash

si $ 1 = "verbose"puis rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml;Fi

Enregistrez le fichier et exécutez-le en tapant ce qui suit:

sh rssget.sh verbose

Une liste de titres, descriptions et liens apparaîtra. Maintenant, relancez-le comme suit:

sh rssget.sh titres

Cette fois, juste une liste de titres apparaît.

La partie supplémentaire du script est à la ligne 4 et présente le autre déclaration. En gros, le script dit maintenant que si le premier paramètre est le mot "verbose", obtenez la description, les liens et les titres du flux RSS, mais si le premier paramètre est différent, obtenez simplement une liste de titres.

Le script s’est légèrement amélioré mais reste imparfait. Si vous ne parvenez pas à entrer un paramètre, vous obtiendrez toujours une erreur. Même si vous fournissez un paramètre, dire simplement que vous ne voulez pas commenter ne signifie pas que vous voulez uniquement des titres. Vous avez peut-être simplement orthographié une erreur verbeuse par exemple ou vous avez peut-être tapé des pigeons, ce qui n'a bien sûr pas de sens.

Avant d'essayer de résoudre ces problèmes, je souhaite vous montrer une commande supplémentaire qui va avec la déclaration IF.

Modifiez votre script rssget.sh pour qu'il se présente comme suit:

#! / bin / bash

si $ 1 = "all"puis rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "description"puis rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml;Fi

J'ai décidé de me débarrasser du mot verbeux et de le remplacer par tous. Ce n'est pas la partie importante. Le script ci-dessus introduit elif ce qui est une façon courte de dire ELSE IF.

Maintenant, le script fonctionne comme suit. Si tu cours sh rssget.sh tous alors vous obtenez des descriptions, des liens et des titres. Si au lieu de cela vous courez sh description de rssget.shvous obtiendrez simplement des titres et des descriptions. Si vous fournissez un autre mot, vous obtiendrez une liste de titres.

Cela introduit un moyen de rapidement créer une liste d'instructions conditionnelles. Une autre façon de faire ELIF consiste à utiliser ce que l’on appelle des instructions IF imbriquées.

Voici un exemple montrant le fonctionnement des instructions IF imbriquées:

#! / bin / bash

si $ 2 = "aboutdotcom"puis si $ 1 = "all" puis rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" puis rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fiautre si $ 1 = "all" puis rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" puis rsstail -d -u http://lxer.com/module/newswire/headlines.rss autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml; FiFi

N'hésitez pas à taper tout cela si vous le souhaitez ou à le copier et le coller dans votre fichier rssget.sh.

Le script ci-dessus introduit un second paramètre qui vous permet de choisir "about.com" ou "lxer.com" dans un flux RSS.

Pour l'exécuter, tapez ce qui suit:

sh rssget.sh tout à propos dedotcom

ou

sh rssget.sh tout lxer

Vous pouvez bien sûr tout remplacer par des descriptions ou des titres pour fournir uniquement des descriptions ou simplement des titres.

Fondamentalement, le code ci-dessus indique si le deuxième paramètre est aboutdotcom, puis examinez la deuxième instruction if, identique au script précédent, si le deuxième paramètre est lxer, examinez à nouveau l'instruction if interne pour décider d'afficher ou non les titres, descriptions. ou tout.

Ce script est fourni uniquement à titre d'exemple d'instruction IF imbriquée et il y a tellement de problèmes avec ce script qu'il faudrait un autre article pour les expliquer tous. Le problème principal est qu'il n'est pas évolutif.

Imaginez que vous souhaitiez ajouter un autre flux RSS tel que Everyday Linux User ou Linux Today? Le script deviendrait énorme et si vous décidiez que vous vouliez changer la déclaration SI interne, vous deviez le changer à plusieurs endroits.

Bien qu'il y ait un moment et un lieu pour un SI imbriqué, ils doivent être utilisés avec parcimonie. Il existe généralement un moyen de refactoriser votre code afin de ne pas avoir besoin du SI imbriqué. Je reviendrai sur ce sujet dans un prochain article.

Voyons maintenant comment régler le problème des personnes entrant dans les paramètres de conduite. Par exemple, dans le script ci-dessus, si l'utilisateur entre autre chose que "aboutdotcom" en tant que deuxième paramètre, une liste d'articles apparaît à partir du flux RSS de LXER, que l'utilisateur ait ou non saisi lxer.

De plus, si l'utilisateur n'entre pas "tout" ou "description" en tant que 1er paramètre, la valeur par défaut est une liste de titres pouvant ou non correspondre à ses intentions.

Examinez le script suivant (ou copiez-le et collez-le dans votre fichier rssget.sh.

#! / bin / bash

si $ 2 = "aboutdotcom" || $ 2 = "lxer"puis si $ 1 = "all" || $ 1 = "description" || $ 1 = "titre" puis si $ 2 = "aboutdotcom" puis si $ 1 = "all" puis rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" puis rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi autre si $ 1 = "all" puis rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" puis rsstail -d -u http://lxer.com/module/newswire/headlines.rss autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi Fi FiFi

La première chose à noter est que le script devient maintenant assez volumineux et vous pouvez rapidement voir à quel point des instructions IF imbriquées peuvent devenir incontrôlables.

Le bit qui est important dans ce script est la déclaration IF || déclaration ALORS section à la ligne 2 et à la ligne 4.

Le || signifie OU. Donc la lignesi $ 2 = "aboutdotcom" || $ 2 = "lxer"vérifie si le deuxième paramètre est égal à "aboutdotcom" ou "lxer". Si ce n'est pas le cas, l'instruction IF est complète car il n'y a pas autre déclaration pour le plus extérieur SI.

De même sur la ligne 4 la ligne si $ 1 = "all" || $ 1 = "description" || $ 1 = "titre"vérifie si le 1er paramètre est égal à "tout" ou "description" ou "titre".

Maintenant, si l'utilisateur exécutepommes de terre sh rssget.shrien n'est retourné alors qu'avant, ils auraient reçu une liste de titres de LXER.

L'opposé de || est &&. L'opérateur && signifie AND.

Je vais faire en sorte que le script ressemble encore plus à un cauchemar, mais cela rend la vérification très importante pour s'assurer que l'utilisateur a fourni 2 paramètres.

#! / bin / bash

si $ # -eq 2puis

si $ 2 = "aboutdotcom" || $ 2 = "lxer" puis si $ 1 = "all" || $ 1 = "description" || $ 1 = "titre" puis si $ 2 = "aboutdotcom" puis si $ 1 = "all" puis rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "description" puis rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi autre si $ 1 = "all" puis rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "description" puis rsstail -d -u http://lxer.com/module/newswire/headlines.rss autre rsstail -u http://z.about.com/6/o/m/linux_p2.xml; Fi Fi Fi FiFi

Le seul élément supplémentaire de ce script est une autre instruction IF externe, comme suit:si $ # -eq 2. Si vous lisez l'article sur les paramètres d'entrée, vous saurez que $ # renvoie le nombre de paramètres d'entrée. Le -q signifie égal. L'instruction IF vérifie donc que l'utilisateur a entré 2 paramètres et si ce n'est pas le cas, elle se ferme sans rien faire. (Pas particulièrement sympathique).

Je suis conscient que ce tutoriel devient assez volumineux. Il n'y a pas grand-chose à couvrir cette semaine, mais je veux aider à ranger le script avant la fin.

La dernière commande que vous devez apprendre sur les instructions conditionnelles est la déclaration CASE.

#! / bin / bash

si $ # -eq 2puis cas 2 $ dans aboutdotcom) cas 1 $ en tout) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; la description) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; Titre) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) cas 1 $ en tout) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; la description) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; Titre) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacFi

L'instruction case est un moyen plus agréable d'écrire IF ELSE IF ELSE IF ELSE IF.

Par exemple cette logique

SI fruit = bananeEnsuite ceciAUTREMENT fruits = orangesEnsuite ceciAUTREMENT fruits = raisinsEnsuite ceciFIN SI

peut être réécrit comme:

cas de fruits dans bananes) fais ça ;; des oranges) fais ça ;; les raisins) fais ça ;;esac

Fondamentalement, le premier élément après l’affaire est la chose que vous allez comparer (à savoir les fruits). Ensuite, chaque élément avant les crochets est la chose que vous comparez et s'il correspond aux lignes qui précèdent ;; sera couru. Une instruction case est terminée par l'inverse esac (qui est case à l'envers).

Dans le script rssget.sh, l'instruction case supprime une partie de cette imbrication terrible, bien qu'elle ne l'améliore pas suffisamment.

Pour vraiment améliorer le script, je dois vous présenter les variables.

Regardez le code suivant:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = ""

si $ # -lt 2 || $ # -gt 2puis echo "utilisation: rssget.sh tout | description | titre aboutdotcom | lxer"; sortie;Fi

cas 1 $ en tout) display = "- d -l -u" ;; la description) display = "- d -u" ;; Titre) display = "- u" ;;esac

cas 2 $ dans aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ display $ url;

Une variable est définie en lui attribuant un nom, puis en lui attribuant une valeur. Dans l'exemple ci-dessus, les affectations de variables sont les suivantes:

lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = ""

Le script est instantanément plus facile à gérer en utilisant des variables. Par exemple, chaque paramètre est géré séparément et il n'y a donc pas d'instructions IF imbriquées.

La variable d'affichage est maintenant définie selon que vous avez choisi tout, description ou titre et la variable url est définie sur la valeur de la variable aboutdotcom ou sur la valeur de la variable lxer selon que vous avez choisi aboutdotcom ou lxer.

La commande rsstail doit maintenant utiliser les valeurs display et url pour fonctionner correctement.

Alors que les variables sont définies simplement en leur donnant un nom, pour les utiliser, vous devez placer un signe $ devant elles. En d'autres termes, variable = valeur définit variable sur une valeur alors que $ variable signifie me donner le contenu de la variable.

Ce qui suit est le script final de ce tutoriel.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"usage = "usage: rssget.sh tout | description | titre lxer | aboutdotcom | dailylinuxuser | linuxtoday"display = ""url = ""

si $ # -lt 2 || $ # -gt 2puis echo $ usage; sortie;Fi

cas 1 $ en tout) display = "- d -l -u" ;; la description) display = "- d -u" ;; Titre) display = "- u" ;; *) echo $ usage; sortie; ;;esac

cas 2 $ dans aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; Linux aujourd'hui) url = $ linuxtoday; ;; dailylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ usage; sortie;esac

rsstail $ display $ url;

Le script ci-dessus introduit plus de flux RSS et une variable d'utilisation indique à l'utilisateur comment utiliser le script s'il ne saisit pas 2 variables ou s'il entre des options incorrectes.

Résumé

Cet article est épique et est peut-être allé trop loin trop tôt. Dans le prochain guide, je vais vous montrer toutes les options de comparaison pour les instructions IF et il reste encore beaucoup à parler en ce qui concerne les variables.

Il est également possible de faire plus pour améliorer le script ci-dessus et cela sera traité dans les prochains guides au fur et à mesure que nous explorerons les boucles, les expressions grep et régulières.

Consultez la section Comment faire (faites défiler les catégories pour voir la liste des articles) de linux.about.com pour trouver des guides plus utiles, allant de double démarrage Windows à Ubuntu, en passant par la configuration d’une machine virtuelle utilisant des boîtes GNOME.