Saisie au clavier et arithmétique

Accueil |

Précédent | Contenu | Suivant

Jusqu’à présent, nos scripts n’étaient pas interactifs. C’est-à-dire qu’ils n’acceptaient aucune entrée de la part de l’utilisateur. Dans cette leçon, nous allons voir comment nos scripts peuvent poser des questions, et obtenir et utiliser des réponses.

Lire

Pour obtenir une entrée à partir du clavier, nous utilisons la commande read. La commande read prend les entrées du clavier et les affecte à une avariable. Voici un exemple:

# !/bin/bashecho -n « Entrez du texte >read texteecho « Vous avez entré : $texte »

Comme nous pouvons le voir, nous avons affiché une invite à la ligne 3. Notez que « -n« donné à la commande echo lui fait garder le curseur sur la même ligne ; c’est-à-dire, elle n’affiche pas de saut de ligne à la fin de l’invite.

Puis, nous invoquons la commande read avec « text » comme argument. Ce que cela fait, c’est attendre que l’utilisateur tape quelque chose suivi de la touche Entrée, puis assigner ce qui a été tapé à la variable text.

Voici le script en action:

$ read_demo.bashEntrez du texte >this is some textVous avez entré : voici du texte

Si nous ne donnons pas à la commande read le nom d’avariable pour affecter son entrée, elle utilisera la variable d’environnementREPLY.

La commande read possède plusieurs options de ligne de commande.Les trois plus intéressantes sont -p-t et-s.

L’option -p nous permet de spécifier une invite qui précède la saisie de l’utilisateur. Cela évite l’étape supplémentaire consistant à utiliser un écho pour inviter l’utilisateur. Voici l’exemple précédent réécrit pour utiliser l’option -p:

# !/bin/bashread -p « Saisissez du texte >  » texteecho « Vous avez saisi : $text »

L’option -t suivie d’un nombre de secondes fournit un délai d’attente automatique pour la commande read. Cela signifie que la commande read abandonnera après le nombre de secondes spécifié si aucune réponse n’a été reçue de l’utilisateur.Cette option pourrait être utilisée dans le cas d’un script qui doit continuer (peut-être en recourant à une réponse par défaut) même si l’utilisateur ne répond pas aux invites.Voici l’option -t en action:

# !/bin/bashecho -n « Dépêche-toi de taper quelque chose ! ». >if read -t 3 response ; thenecho « Super, vous êtes arrivé à temps ! »elseecho « Désolé, vous êtes trop lent ! »fi

L’option -s fait en sorte que la frappe de l’utilisateur ne soit pas affichée.Cela est utile lorsque nous demandons à l’utilisateur de taper un mot de passe ou d’autres informations confidentielles.

Arithmétique

Puisque nous travaillons sur un ordinateur, il est naturel de s’attendre à ce qu’il puisse effectuer quelques calculs arithmétiques simples. Le shell fournit des fonctionnalités pour l’arithmétique des nombres entiers.

Qu’est-ce qu’un nombre entier ? Cela signifie des nombres entiers comme 1, 2, 458, -2859. Cela ne signifie pas les nombres fractionnaires comme 0,5, 0,333 ou 3,1415. Pour traiter les nombres fractionnaires, il existe un programme séparé appelé bc qui fournit un langage de calcul de précision arbitraire. Il peut être utilisé dans les scripts shell, mais il dépasse le cadre de ce tutoriel.

Disons que nous voulons utiliser la ligne de commande comme une calculatrice primitive. Nous pouvons le faire comme ceci :

$ echo $((2+2))

Lorsque nous entourons une expression arithmétique avec les doubles parenthèses, le shell effectuera une expansion arithmétique.

Notez que les espaces blancs sont ignorés:

$ echo $((2+2))echo $(( 2+2 ))echo $(( 2 + 2 ))4

Le shell peut effectuer une variété d’opérations arithmétiques courantes (et moins courantes). Voici un exemple:

# !/bin/bashfirst_num=0second_num=0read -p « Entrez le premier nombre –>  » first_numread -p « Entrez le second nombre ->  » second_numecho « premier nombre + second nombre = $((premier_num + second_num)) »echo « premier nombre – second nombre = $((premier_num – second_num)) »echo « premier nombre * second nombre = $((premier_num * second_num)) »echo « premier nombre / second nombre = $((premier_num * second_num)) »echo « premier nombre / second nombre = $((first_num / second_num)) »echo « premier nombre % second nombre = $((first_num % second_num)) »echo. « premier nombre élevé à la »echo « puissance du deuxième nombre = $((premier_num ** deuxième_num)) »

Vous remarquerez comment le « $ » de tête n’est pas nécessaire pour référencer des variablesà l’intérieur de l’expression arithmétique comme « first_num +second_num« .

Essayez ce programme et observez comment il gère la division (n’oubliez pas qu’il s’agit d’une division en nombres entiers) et comment il gère les grands nombres. Les nombres qui deviennent trop grands débordent comme l’odomètre d’une voiture lorsqu’il dépasse le nombre de kilomètres qu’il a été conçu pour compter. Il recommence, mais en passant d’abord par tous les nombres négatifs, en raison de la façon dont les nombres entiers sont représentés en mémoire. La division par zéro (qui n’est pas mathématiquement valide) provoque effectivement une erreur.

Les quatre premières opérations, l’addition, la soustraction, la multiplication et la division, sont facilement reconnues mais la cinquième peut être peu familière. Le symbole « % » représente le reste (également connu sous le nom de modulo).Cette opération effectue une division mais au lieu de renvoyer un quotient comme la division, elle renvoie le reste. Bien que cela puisse ne pas sembler très utile, il s’agit en fait d’une grande utilité pour l’écriture de programmes. Par exemple, lorsque l’opération aremainder renvoie zéro, cela indique que le premier nombre est un multiple exact du second. Cela peut être très pratique :

# !/bin/bashnumber=0read -p « Entrez un nombre >  » nombreecho « Le nombre est $nombre »if ;thenecho « Le nombre est pair »elseecho « Le nombre est impair »fi

Or, dans ce programme qui formate un nombre arbitraire de secondes en heures et minutes :

#!/bin/bashseconds=0read -p « Entrez le nombre de secondes >  » secondshours=$((seconds / 3600))seconds=$((seconds % 3600))minutes=$((seconds / 60))seconds=$((seconds % 60))echo « $hours heure(s) $minutes minute(s) $secondes seconde(s) »
Top | Previous | Contents | Next

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *