TP SHELL BASH sous Linux TP 2 CPI1 initiation OS Rappels Les shells Ce sont des programmes ayant plusieurs fonctions: dialogue avec les utilisateurs : lancement des commandes, arrêt et redémarrage, gestion d'un historique, d'éditions de commandes, de synonymes, de fonctions. programmation de séquence de commandes. On dispose de variables, de structures de contrôle, et de toutes les commandes standard Unix (expr, test, sort, grep, awk, sed, tr, diff, comm, cmp, wc, head, tail, cut, paste, ...) Il y a 2 familles: les shells de type Bourne (sh, zsh, bash) et les shells de type C-shell (csh, lcsh, tcsh). La syntaxe de ces derniers est inspirée de la syntaxe du C. Lancement En interactif, le comportement est différent selon que c'est un shell de login (= de démarrage) ou non. sh lit .profile quand il est shell de login, rien sinon Appel Ce peut être un appel: à la main: $ sh mon/fichier o o o o o o le texte est mis dans un fichier que l'on rend exécutable: chmod +x ... dont la première ligne référence le bon interpréteur: #!/bin/sh #!/usr/local/bin/bash et on appelle alors le fichier par son nom.: 1 . Caractères spéciaux Règle : chaque ligne subit des substitutions puis est interprété conformément à la syntaxe du shell. Classe 1 On se base ici sur la liste des noms de fichiers (résultat de la commande ls): ? : ce caractère peut remplacer un seul caractère. Exemples: * : toute suite de caractères ne commençant pas par un . (lire : un point). Exemple: echo a.?ex for i in a.??? echo echo echo echo echo * .* .??* *.* *.??? [a-z] ou [st] : un caractère de la liste. Exemple: echo *.[st]* grep mot *.[ch] read var lit une variable sur l'entrée standard. Exemple Echo ‘entrez un nombre’ read x echo $x 2 les protections : à tester ' : ce qui est entre apostrophes n'est pas interprété. Exemple: echo '*' " : ce qui est entre guillemets est interprété mais reste un seul mot. Exemple: a=toto echo "D$a" echo D$a echo 'D$a' echo D* echo "D*" ` : ce qui est entre apostrophes inverses est remplacé par le résultat de la commande: echo date echo `date` echo `ls –l ` a=`wc -l fichier` Test – Manipulation de chaines de caractères Sélection de caractères dans une chaîne Le shell bash propose un certain nombre d’outils simples pour manipuler une chaîne de caractères. Ainsi, si une variable var1 a pour valeur : abdefghijkl, alors on peut récupérer certaines de ses sous-chaînes avec les commandes suivantes : – – – – echo ${#m} echo ${m:4} echo ${m:4:3} echo ${m#ab} echo ${m%ijkl Les redirections Pour un shell, tout process a une entrée standard (stdin de numéro 0), une sortie standard (stdout de numéro 1), une sortie d'erreur (stderr de numéro 2). Par défaut, l'entrée standard est le clavier, la sortie standard et la sortie d'erreur sont l'écran. Mais on peut rediriger: 3 process < file: lance un process avec en entrée standard le contenu du fichier. process > file : lance le process avec en sortie standard le fichier. Ce fichier est détruit au lancement. process >> file : lance le process avec en sortie standard le fichier mais on concatène au fichier s'il existe déjà. p1 | p2 : la sortie de p1 devient l'entrée de p2. p1 <<MotADefinir : met sur l'entrée standard ce qui vient dans le shell jusqu'à la ligne MotADefinir. cat <<FinDuFinduTexte Ceci est le FinduTexte. La suite. FinDuFinduTexte date # commande executee process 2>file redirige la sortie d'erreur process 2>&1 concatène la sortie d'erreur à la sortie standard. Exemple: commande >file 2>&1 commande 2>&1 >file # bon # mauvais Constantes, types de données Il n'y a pas de constante, tout en shell est chaîne de caractères. 4 1. Introduction Il faut déclarer l'emplacement de l'interpréteur dans l'entête du script : #!/bin/bash Quand on lance un script, on peut utiliser quelques variables : Les variables utiles dans la programmation SHELL Variable Description $1,$2,...,$n Les paramètres sont passés ./script variable_1 variable_2 variable_n $@ Liste des paramètres $# Nombre de paramètres $$ Donne le n° du script (PID) $0 Le nom du script $? Valeur de retour du script (ou d'une fonction) Testez le script suivants : 2. Structure de contrôle Exemple : #!/bin/bash echo -n "Entrez un nombre :" read nombre case $nombre in # Si $nombre = 1 1)echo "Vous avez tapé 1";; # Si $nombre = 2 2)echo "Vous avez tapé 2";; # Pour le reste des valeurs de $nombre *)echo "Vous n'avez tapé ni 1 ni 2";; esac S1-case.txt 5 3. Boucle for Exemple : #!/bin/bash for i in * do echo $i # $i va prendre comme valeur le nom de chaque fichier done S2-for1 #!/bin/bash for i in 'cat liste' ; do ls $i done #!/bin/bash # for ((initial;condition;action)) for ((i=0;i<10;i=i+1)) # $i = 0 au début # A chaque boucle, il s'incrémente (i=i+1) # Il sort de la boucle lorsque la valeur n'est plus bonne (i<10) do echo $i done S2-for2 4. if, then, elif, fi Exemple : #!/bin/bash echo "Entrez un nombre :" read nombre if [$nombre == 1] then echo "Vous avez tapé 1" elif [$nombre == 2]; then echo "Vous avez tapé 2" else echo "Vous n'avez tapé ni 1 ni 2" fi S3-if 6 5. Let Initialisation (ajouter 1 à i) : #!/bin/bash let i=i+1 let "i = i + 1" 6. Read Lecture d'une valeur au clavier : #!/bin/bash echo -n "Entrez votre nom :" read nom echo $nom 7. Select !/bin/bash select CHOIX in "Choix A" "Choix B"; do case $REPONSE in 1) echo "$CHOIX --> $REPONSE";; 2) echo "$CHOIX --> $REPONSE";; *) echo "Vous avez tapé n'importe quoi !";; esac done Le n° du choix est affecté à la variable $REPONSE. Le nom du choix à la variable $CHOIX. 8. Test Test sur les fichier : -d si c'est un répertoire -e si le fichier existe -f si le fichier existe et c'est un fichier standard Exemple : #!/bin/bash if [ -d $1 ]; then echo "$1 est un dossier" fi Test sur les chaînes : s1 == s2 : si les chaînes s1 et s2 sont identiques s1 != s2 : si les chaînes sont différentes 7 Test sur les entiers : n1 n1 n1 n1 n1 n1 -eq n2 : si n1 est égal à n2 -ne n2 : si n1 n'est pas égal à n2 -gt n2 : si n1 est supérieur à n2 -ge n2 : si n1 est supérieur ou égal à n2 -lt n2 : si n1 est inférieur à n2 -le n2 : si n1 est inférieur ou égal à n2 9. Répéter jusqu'à ... Exemple : #!/bin/bash a=0 until [ $a == 10 ]; do let a=a+1 echo $a # On sort de la boucle uniquement quand la condition sera vrai ($a == 10) done 10. Tant que... #!/bin/bash while [ $a -lt 10 ]; do let a=a+1 echo $a # On sort de la boucle uniquement quand la condition n'est plus vrai ($a lt 10) done 8 2.Exercices 2.1. Fonction test Ecrivez un script qui dit si le paramètre passé est : un fichier un dossier n'existe pas Ecrivez un script qui n'affiche que les répertoires Ecrivez un script qui n'affiche que les fichier Ecrivez un script qui donne le nombre de fichiers et de répertoires : 2.2. case En utilisant la structure case, écrire un script qui : affiche le menu demande à l'utilisateur de saisir une option du menu affiche l'option qu'il a choisie 2.3. for En utilisant la structure for, écrire un programme qui donne les valeurs de Y d'une fonction pour les valeurs de X allant de -10 à 10 avec un incrément de 1 Réalisez le traitement pour la fonction y=x^2 Adapter le script afin que les bornes -x et +x soient passées en paramètres au script 2.4. Fonction until En utilisant la structure until...do...done, écrire un script (until.sh) qui : demande à un utilisateur de saisir une commande exécute la commande ou affiche un message d'erreur si la commande ne s'est pas déroulée. répète cette opération tant que l'utilisateur le désire 9 2.5. Fonction while En utilisant la structure while, écrire un script qui : Tant que l'utilisateur n'a pas tapé 9 : affiche un menu demande à l'utilisateur de saisir une option du menu affiche à l'utilisateur le résultat de sa commande 2.6. Fonction select Vous allez à l'aide de la fonction select réaliser un menu à quatre options pour un utilisateur. Le script doit boucler tant que l'utilisateur n'a pas choisi de quitter. Option 1 : Afficher la liste des utilisateurs connectés Option 2 : Afficher la liste des processus Option 3 : Afficher à l'utilisateur son noom, son UID, son GID, son TTY Option 4 : Quitter 10