Introduction aux systèmes d`exploitation TP 5 – script bash 1 Le
Transcription
Introduction aux systèmes d`exploitation TP 5 – script bash 1 Le
Introduction aux systèmes d’exploitation TP 5 – script bash 1 Le premier Script Un script bash est un fichier texte, qui commence toujours par #!/bin/bash ou #!/bin/sh, et qui doit être rendu exécutable pour pouvoir s'exécuter. Exercice 1: 1. Ouvrez votre éditeur de texte préféré et copiez-y les lignes ci-dessous que vous enregistrerez dans le fichier mon_script.sh : #!/bin/bash echo "Bonjour" 2. Exécutez ce fichier en tapant : ./mon_script.sh Remarque : pour inclure des commentaires dans votre script, vous devez faire précéder la ligne du symbole #. 2 Interprétation d’une ligne de commande bash découpe normalement les lignes de commande aux caractères « espace ». Ainsi la ligne cat fic1 fic2 fic3 est découpée en cat fic1 fic2 fic3 Un certain nombre de caractères sont spéciaux pour bash : Caractères Exemple { } ba{ba,bu} → baba babu \ \"\’\$\{\ \A B → "’${ A B $ $HOME → /home/roger ${...} ${HOME} → /home/roger ${HOME#/home} → /roger ${HOME%ger} → /home/ro $(...) $(which true) → /bin/true `...` `which true` → /bin/true $((...)) $((12 + 4 * 2)) → 20 3 "..." " a $HOME $((1+1)) ' " → a /home/roger 2 ’ '...' ' a $HOME $((1+1)) " ' → a $HOME $((1+1)) " Variables et paramètres On peut définir des variables locales dans le script par MA_VARIABLE='truc', et pour les manipuler il faut les préfixer du symbole $, par exemple : #!/bin/bash message='Bonjour' echo $message Pour initialiser et pour utiliser un tableau en bash, voici la syntaxe : mon_tableau[index]=variable # instanciation ${mon_tableau[index]} # appel d'un élément ${mon_tableau[*]} # appel de l'ensemble du tableau L'index du tableau doit être un nombre. Exemple : #!/bin/bash nom[0]='Bonjour' nom[1]='Monsieur' echo ${nom[0]} #affiche 'Bonjour' echo ${nom[*]} #affiche 'Bonjour Monsieur' Exercice 2 : Utiliser la commande echo pour écrire les lignes suivantes : A B L’ensemble {1, 2, 3} est inclus dans N Elle s’écria : "Ciel mon mari !" $HOME = /home/roger 10 * 2 = 20 où /home/roger est la valeur de la variable HOME et 20 est le résultat de l'évaluation de la multiplication de 10 par 2. 4 Tests Le TP2 introduisait l’utilisation de && et || pour enchaîner des commandes de façon conditionnelle. De façon plus générale, on peut écrire : if cmd ; then cmd1 ; cmd2 ; ... ; else cmd3 ; cmd4 ; ... ; fi qui exécute la commande cmd puis : exécute cmd1 ; cmd2 ; ... ; si la valeur de retour de cmd est 0 ; exécute cmd3 ; cmd4 ; ... ; dans les autres cas. Il existe trois commandes très particulières que l’on peut utiliser comme cmd : true cette commande réussit toujours (donc renvoie la valeur 0) ; false cette commande échoue toujours (donc renvoie la valeur 1 ) ; test cette commande permet d’effectuer de nombreux tests ; test fait partie des commandes qui sont directement interprétées par bash. La syntaxe des opérations possibles est donc donnée dans la page de manuel de bash dans les explications de test mais aussi dans l’explication sur les expressions de conditions. Voici trois exemples pour expliciter l’utilisation de la commande test : if test f mon_fichier; then echo "le fichier existe" fi if [ f mon_fichier ]; then echo "le fichier existe" fi if [ ./ma_commande ]; then echo "la commande s'est terminée avec succès" fi Remarque : il faut toujours ajouter un espace après le crochet ouvert « [ » et avant le crochet fermé « ] », sinon erreur de syntaxe. Quelques comparaisons utiles : -f teste l'existence d'un fichier -d teste l'existence d'un répertoire -x teste si le fichier existe et est exécutable -r teste si le fichier existe et est ouvert en lecture -w teste si le fichier existe et ouvert en écriture -s teste si le fichier existe et a une taille supérieur à 0 octet 5 Structures conditionnelles imbriquées if cmd ; then cmd1 ; elif cmd2 ;then cmd3;else cmd4;fi 6 6.1 Structures itératives La boucle for : for variable in liste_de_cas ; do cmd ; done for (( expr1 ; expr2 ; expr3 )) ; do cmd; done On utilise fréquemment for pour énumérer des noms de fichiers, comme dans cet exemple : for fichier in /etc/rc* do if [ d "$fichier" ] then echo "$fichier (repertoire)" else echo "$fichier" fi done Lorsqu'on veut passer une liste on écrit la liste sans parenthèse, les noms les uns à la suite des autres. En revanche une commande utile lorsqu'on désire faire une simple boucle sur une liste de valeurs entières est la fonction ''seq'' qui prend en arguments 2 entiers et renvoie la liste de tous les entiers compris entre ces 2 bornes. 6.2 La boucle while : while comd1; do cmd2; done Exemple: i=0 while ((i <= 10)) do echo $i ((i += 1)) done Exercice 3 : if 1. Ecrire un script bash qui vérifie si le fichier « Fichier1 » existe, si oui il le renomme en « Fichier2 » sinon il affiche, « Fichier1 n’existe pas ». 2. Ecrire un script bash qui vérifie si le répertoire « Test » existe, si oui il affiche « répertoire existant » sinon « répertoire inexistant ». 3. Ecrire un script bash qui teste deux entiers nb1 et nb2 et affiche « nb1 est supérieur à nb2 » si c’est le cas et « nb1 est inférieur ou égal à nb2 » sinon. 4. Ecrire un script bash qui permet de vérifier si deux chaînes sont identiques (prenez par exemple S1="Bash" et S2= "Script"). Essayer ensuite avec S1=''Bash" et S2= "Bash*". 5. Un script est une commande qui peut récupérer son nom dans la variable '$0', et les paramètres passés ensuite sont stockés dans les variables '$1', '$2', … Grâce à ces variables spécifiques, réécrivez les exercices précédents en passant en paramètres du script le(s) nom(s) (ou les valeurs) sur le(s)quel(s) on fait les tests. Exercice 4 : for et while Dans les questions suivantes vous écrirez le script de 2 manières différentes, une avec la commande 'for' et l'autre avec la commande 'while'. 1. Ecrire un script bash qui permet d’afficher à l’écran les nombres de 4 à 10 2. Même que 1, mais de 10 à 2 3. Ecrire un script bash qui multiplie par 2, les entiers de 1 à 5 4. Ecrire un script bash qui crée un tableau de 3 éléments, et afficher le contenu du tableau avec une boucle for 5. Reprendre les questions 1 et 2 et écrire un seul script qui affiche la séquence de nombre comprise entre les valeurs passées en arguments de votre commande. Exercice 5 1. Ecrire un script bash qui permet d’afficher tous les fichiers d’extension '.txt' du répertoire courant. 2. Ecrire un script bash qui permet d'afficher tous les fichiers qui vous appartiennent et qui ont comme extension '.txt'. Vous donnerez en plus le nombre de fichiers. Vous gérerez les fichiers dont le nom comporte un ou plusieurs espaces. Exercice 6 1. Ecrire un script bash qui remplace tous les fichiers ayant l’extension .JPG dans votre répertoire courant par l’extension .jpg. Les noms des fichiers ne comporteront pas d'espace. 2. Réécrire un script bash qui permet de renommer aussi les fichiers ayant un espace dans leur nom.