Si Déclarations!
décisions, décisions.
Introduction
Bash si les déclarations sont très utiles. Dans cette section de notre tutoriel Bash Scripting, vous apprendrez comment utiliser les instructions if dans vos scripts Bash pour automatiser les tâches.
les instructions If (et, étroitement liées, les instructions case) nous permettent de prendre des décisions dans nos scripts Bash. Ils nous permettent de décider d’exécuter ou non un morceau de code en fonction des conditions que nous pouvons définir., Les instructions If, combinées avec des boucles (que nous verrons dans la section suivante) nous permettent de créer des scripts beaucoup plus complexes qui peuvent résoudre des tâches plus importantes.
comme ce que nous avons vu dans les sections précédentes, leur syntaxe est très spécifique, alors restez au courant de tous les petits détails.
Instructions If De Base
Une instruction IF de base dit effectivement, si un test particulier est vrai, alors effectuez un ensemble donné d’actions. Si ce n’est pas vrai, n’effectuez pas ces actions., Si suit le format ci-dessous:
if
then
<commands>
fi
Tout ce qui se trouve entre then ET fi (SI en arrière) ne sera exécuté que si le test (entre les crochets) est vrai.
prenons un exemple simple:
if_example.sh
- #!/bin/bash
- # de Base si l’instruction
- si
- ensuite,
- echo Hey que l\’un grand nombre.,
- pwd
- fi
- date
décomposons:
- ligne 4 – voyons si le premier argument de ligne de commande est supérieur à 100
- lignes 6 et 7 – ne sera exécuté que si le test sur la ligne 4 renvoie true. Vous pouvez avoir autant de commandes ici que vous le souhaitez.
- ligne 6 – la barre oblique inverse ( \ ) devant le guillemet simple ( ‘ ) est nécessaire car le guillemet simple a une signification spéciale pour bash et nous ne voulons pas de cette signification spéciale. La barre oblique inverse échappe à la signification spéciale pour en faire une simple citation simple normale.,
- La Ligne 8 – fi signale la fin de l’instruction if. Toutes les commandes après cela seront exécutées normalement.
- ligne 10-parce que cette commande est en dehors de l’instruction if, elle sera exécutée quel que soit le résultat de l’instruction if.
- ./if_example.sh 15
- Ven 5 Fév à 9:06:30 2021
- ./if_example.sh 150
- Hey c’est un grand nombre.
- /home/ryan/bin
- Ven 5 Fév à 9:06:30 2021
Il est toujours bon de tester vos scripts avec entrée qui couvre les différents scénarios possibles.,
Test
Les crochets ( ) dans l’instruction if ci-dessus sont en fait une référence à la commande test. Cela signifie que tous les opérateurs de test peuvent être utilisés ici. Recherchez la page de manuel pour le test pour voir tous les opérateurs possibles (il y en a pas mal), mais certains des plus courants sont répertoriés ci-dessous.
Operator | Description |
---|---|
! EXPRESSION | L’EXPRESSION est fausse. |
-n CHAÎNE | La longueur de la CHAÎNE est supérieure à zéro., |
-Z STRING | la longueur de la chaîne est nulle (c’est-à-dire qu’elle est vide). |
MOT1 = STRING2 | MOT1 est égal à CHAÎNE2 |
MOT1 != STRING2 | MOT1 n’est pas égal à CHAÎNE2 |
INTEGER1 -eq INTEGER2 | INTEGER1 est numériquement égal à INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 est numériquement supérieure INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 est numériquement inférieure INTEGER2 |
-d FICHIER | FICHIER existe et est un répertoire., |
-E fichier | le fichier existe. |
-fichier r | le fichier existe et l’autorisation de lecture est accordée. |
-S fichier | le fichier existe et sa taille est supérieure à zéro (ie. il n’est pas vide). |
-W fichier | le fichier existe et l’autorisation d’écriture est accordée. |
-X FILE | le fichier existe et l’autorisation execute est accordée. |
quelques remarques:
- = est légèrement différente à -eq. retournera false as = fait une comparaison de chaîne (ie., caractère pour caractère identique) alors que-eq fait une comparaison numérique, ce qui signifie que cela retournera vrai.
- lorsque nous nous référons au fichier ci-dessus, nous signifions en fait un chemin. N’oubliez pas qu’un chemin peut être absolu ou relatif et peut faire référence à un fichier ou un répertoire.
- parce que n’est qu’une référence au test de commande, nous pouvons expérimenter et résoudre des problèmes avec test sur la ligne de commande pour nous assurer que notre compréhension de son comportement est correcte.
- test 001 = 1
- echo $?
- 1
- test 001 -eq 1
- echo $?,
- 0
- touch monfichier
- test-s monfichier
- echo $?
- 1
- ls /etc > monfichier
- test-s monfichier
- echo $?
- 0
nous allons le décomposer:
- Ligne 1 – Effectuer une chaîne de caractères en fonction de comparaison. Le Test n’imprime pas le résultat, nous vérifions donc son statut de sortie, ce que nous ferons sur la ligne suivante.
- Ligne 2 – La variable $? contient l’état de sortie de la commande précédemment exécutée (dans ce cas test). 0 signifie vrai (ou succès). 1 = faux (ou échec).,
- Ligne 4 – Cette fois, nous effectuons une comparaison numérique.
- Ligne 7 – Créer un nouveau fichier myfile (en supposant que myfile n’existe pas déjà).
- ligne 8 – la taille de mon fichier est-elle supérieure à zéro?
- ligne 11-rediriger du contenu dans mon fichier afin que sa taille soit supérieure à zéro.
- ligne 12-testez à nouveau la taille de mon fichier. Cette fois, c’est vrai.
indentation
vous remarquerez que dans l’instruction if ci-dessus, nous avons indenté les commandes qui ont été exécutées si l’instruction était true., Ceci est appelé indentation et est une partie importante de l’écriture d’un bon code propre (dans n’importe quelle langue, pas seulement les scripts Bash). L’objectif est d’améliorer la lisibilité et de rendre plus difficile pour nous de faire des erreurs simples et stupides. Il n’y a pas de règles concernant l’indentation dans Bash, vous pouvez donc indenter ou ne pas indenter comme vous le souhaitez et vos scripts fonctionneront toujours exactement de la même manière. Je vous recommande fortement de mettre votre code en retrait (d’autant plus que vos scripts grossissent) sinon vous aurez de plus en plus de mal à voir la structure dans vos scripts.,
instructions if imbriquées
parlant d’indentation. Voici un exemple parfait de quand cela vous facilite la vie. Vous pouvez avoir autant d’instructions if que nécessaire dans votre script. Il est également possible d’avoir une instruction if à l’intérieur d’une autre instruction if. Par exemple, nous pouvons analyser un nombre donné sur la ligne de commande comme suit:
décomposons – le:
- ligne 4-effectuez ce qui suit, uniquement si le premier argument de ligne de commande est supérieur à 100.
- ligne 8 – Il s’agit d’une légère variation sur l’instruction if., Si nous souhaitons vérifier une expression, Nous pouvons utiliser les doubles crochets comme nous l’avons fait pour les variables.
- ligne 10 – n’est exécutée que si les deux instructions if sont vraies.
Yo dawg, je vous rassemble comme des déclarations if, donc je mets une déclaration if dans votre déclaration if.
Xzibit
(Xzibit n’a pas vraiment dit cela, mais je suis sûr qu’il l’aurait fait, s’il avait hébergé Pimp My Bash Script.,)
Vous pouvez imbriquer autant d’instructions if que vous le souhaitez, mais en règle générale, si vous devez imbriquer plus de 3 niveaux de profondeur, vous devriez probablement penser à réorganiser votre logique.
if Else
Parfois, nous voulons effectuer un certain ensemble d’actions si un énoncé est vrai, et un autre ensemble d’actions si elle est fausse. Nous pouvons accommoder cela avec le mécanisme else.,
si
puis
<commandes>
else
<autres commandes>
if
Désormais, on pouvait facilement lire à partir d’un fichier si elle est fournie comme argument de ligne de commande, d’autre lire depuis l’entrée standard.
else.sh
- #!/bin/bash
- # else exemple
- si
- ensuite,
- nl $1
- else
- nl /dev/stdin
- if
Si Elif Else
Parfois, on peut avoir une série de conditions qui peuvent conduire à des chemins différents.,
si
puis
<commandes>
elif
puis
<différentes commandes>
else
<autres commandes>
if
Par exemple, il peut être le cas que si vous avez 18 ans ou plus vous pouvez aller à la fête. Si vous ne l’êtes pas mais que vous avez une lettre de vos parents, vous pouvez y aller mais devez être de retour avant minuit. Sinon, vous ne peut pas aller.
Vous pouvez avoir autant de branches elif que vous le souhaitez. La finale else est également facultative.,
opérations booléennes
parfois, nous ne voulons faire quelque chose que si plusieurs conditions sont remplies. D’autres fois, nous aimerions effectuer l’action si l’un des plusieurs condition est remplie. Nous pouvons les accueillir avec des opérateurs booléens.
- et &&
- ou – ||
Par exemple, peut-être que nous ne voulons effectuer une opération si le fichier est lisible et a une taille plus grande que zéro.
and.sh
- #!,/bin/bash
- # et exemple
- si &&
- ensuite,
- echo Ce fichier est utile.
- if
Peut-être que nous voudrions effectuer quelque chose de légèrement différent si l’utilisateur est bob ou andy.
or.sh
- #!/bin/bash
- # ou par exemple
- si ||
- ensuite,
- ls -alh
- else
- ls
- if
Cas des États
Parfois, nous souhaitera peut-être prendre des chemins différents, basés sur une variable correspondant à une série de motifs., Nous pourrions utiliser une série de déclarations if et elif, mais cela deviendrait bientôt inutile. Heureusement, il existe une déclaration de CAs qui peut rendre les choses plus propres., It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac
Here is a basic example:
case.sh
- #!,/bin/bash
- # exemple de cas
- cas 1 $
- démarrage)
- echo de départ
- ;;
- stop)
- echo stopper
- ;;
- redémarrer)
- echo redémarrage
- ;;
- *
- echo don\’t savoir
- ;;
- esac
nous allons le décomposer:
- Ligne 4 – Cette ligne commence la casemechanism.
- ligne 5-Si $1 est égal à ‘start’, effectuez les actions suivantes. l’ ) signifie la fin de la répétition.,
- ligne 7 – nous identifions la fin de cet ensemble d’instructions avec un double point-virgule ( ;; ). La suite c’est le prochain cas à considérer.
- Ligne 14 – Rappelez-vous que le test pour chaque cas est un modèle. * Représente n’importe quel nombre de caractères. Il est essentiellement un fourre-tout si pour si aucun des autres cas correspondent. Il n’est pas nécessaire, mais est souvent utilisé.
- ligne 17-esac est à l’envers et indique que nous sommes à la fin de l’instruction case. Toutes les autres instructions après cela seront exécutées normalement.
- ./case.sh commencer
- départ
- .,/case.sh restart
- redémarrage
- ./case.sh bla
- ne sais pas
Maintenant, regardons un exemple légèrement plus complexe où les modèles sont utilisés un peu plus.
Résumé
Activités
Maintenant, nous allons prendre certaines décisions.
- créez un script Bash qui prendra 2 nombres comme arguments de ligne de commande. Il imprimera à l’écran le plus grand des deux nombres.,
- créez un script Bash qui acceptera un fichier comme argument de ligne de commande et l’analysera de certaines manières. par exemple. vous pouvez vérifier si le fichier est exécutable ou inscriptible. Vous devez imprimer un certain message si vrai et un autre si faux.
- créez un script Bash qui imprimera un message en fonction du jour de la semaine (par exemple. « Happy hump day » pour le jour du mariage, « TGIF » pour le vendredi, etc.).