Utilisation de Bash pour faire des scripts. - Capa-IUP
Transcription
Utilisation de Bash pour faire des scripts. - Capa-IUP
Utilisation de Bash pour faire des scripts. Support des TPs de Système d'Exploitation, écrit par Stanislas Oger ([email protected]) Bash est le shell du projet GNU, c'est celui par défaut sur la plupart des distributions linux. Un shell est une interface utilisateur en mode texte qui permet de piloter le système d'exploitation. Dans un shell Bash on tape des commandes qui sont exécutées par le système. Bash permet également d'écrire des scripts, qui sont des suites de commandes, et met à disposition des utilisateurs plusieurs structures de contrôle. Ecrire un script bash Un script bash est un fichier texte dont l'extension est par convention « .sh » et qui commence par un shebang indiquant au système de quel type de script il s'agit. Le shebang est une ligne commencant par « #! » suivi du chemin vers l'interpréteur correspondant au script. Par exemple pour bash, le shebang est « #!/bin/bash ». Voici un script bash minimaliste affichant « coucou » : #!/bin/bash echo « coucou » Executer un script bash Si votre script s'appelle toto.sh, alors pour le lancer il faut taper dans une console : bash toto.sh Recupérer les paramètres passés à un script Dans un script bash, les paramètres passés au programme sont enregistrés dans les variables $1, $2, etc. La variable $# contient le nombre de paramètres passés au programme. Par exemple, pour vérifier qu'on a bien passé un paramètre à un script et mettre le paramètre dans une variable $toto : #!/bin/bash if [ $# -ne 1 ] then echo « Vous programme. » exit fi devez passer exactement un paramètre au toto=$1 echo « Vous avez passé le paramètre $toto au programme » Les variables Pour affecter une valeur a une variable on utilise la syntaxe suivante : ma_variable=ma_valeur Pour l'utiliser ensuite on utilise son nom précédé d'un caractère '$'. Par exemple pour afficher la valeur d'une variable en utilisant la commande echo : echo «ma variable vaut $ma_variable » Pour affecter a une variable la valeur d'une autre variable, il faut faire : ma_nouvelle_variable=$mon_ancienne_variable Les structures de contrôle Le test conditionnel if <condition> then faire quelque chose else faire autre chose fi La boucle while while <condition> do faire quelque chose done La boucle for for i in 1 2 3 4 do faire quelque chose done la condition La condition (« <condition> » dans les exemples précédents) peut être de plusieurs forme : 1 - Encadré par des crochets : test de chaine de caractère : [ « $ma_variable » == « toto » ] teste si la variable « ma_variable » vaut « toto ». L'opérateur != signifie différent. comparaison de nombres : [ $mon_nombre -lt 3 ] teste si la variable mon_nombre vaut moins que 3. Les opérateurs de comparaison suivant peuvent être utilisés : • -lt (less than) : strictement inférieur à • -gt (greater than) : strictement supérieur à • -eq (equal) : égal à • -ne (not equal) : différent • -ge (greater or equal) : supérieur ou égal • -le (less or equal) : inférieur ou égal Pour plus d'informations consulter le manuel de test (en console tapez « man test ») Exemple : if [ $toto -le 2 ] then echo « la variable toto est inférieure ou égale à 2 » fi 2 - Directement une commande Par exemple pour faire quelque chose si la commande « who | wc -l » fonctionne : if who | wc -l do faire quelque chose done Recupérer la sortie d'une commande Il faut exécuter la commande dans l'environnement $(). Par exemple pour récupérer la sortie de la commande « who » dans une variable $toto : toto=$(who) Rediriger la sortie d'une commande dans un fichier Pour écrire la sortie d'une commande dans un fichier il faut utiliser les opérateurs de redirection de flux. Par exemple, pour rediriger la sortie de la commande « who » dans un fichier toto.txt, il faut faire : who > toto.txt Il existe plusieurs opérateurs de redirection, les deux principaux sont '>' et '>>'. Le premier redirige la sortie vers un fichier et écrase son contenu, alors que le second ajoute la sortie à la fin du fichier. Enchainer plusieurs commandes Pour enchainer plusieurs commandes, c'est à dire fournir en entrée d'une commande la sortie d'une autre, on utilise le caractère pipe : '|'. Par exemple pour utiliser la commande cut pour découper la sortie de la commande who, on peut faire : who | cut -f1 -d' ' Où trouver les utilisateurs du système Le fichier /etc/passwd contient la liste des utilisateurs du système avec des informations les concernant. Pour plus d'infos, lire le man 5 le concernant : « man 5 passwd » Où trouver les groupes du système Le fichier /etc/group contient la liste des groupes du système avec des informations les concernant. Pour plus d'infos, lire le man 5 le concernant : « man 5 group » Quelques commandes Pour toutes les commandes présentées ici vous pouvez avoir plus d'information en lisant la page de man les concernant. Pour cela il faut taper dans une console la commande suivante : « man <le nom de la commande> », avec « <le nom de la commande > » le nom de la commande en question. Exemple : pour avoir l'aide de la commande « cat », on tape « man cat ». Lire la documentation d'une commande doit être un réflexe pour vous, c'est le seul moyen de vous en sortir face à de nouvelles situations et c'est ce que l'on vous demandera dans le milieu professionnel : de l'autonomie. Commande « echo » Affiche une chaine de caractère. Par exemple pour afficher « la variable toto vaut <valeur_de_toto> » : echo « la variable toto vaut $toto » Commande « cat » Affiche le contenu d'un fichier. Commande « who » Affiche les utilisateurs actuellement connectés sur l'ordinateur. Commande « groups » Affiche le groupe d'un utilisateur. Exemple « groups toto » affiche le groupe de l'utilisateur « toto ». Commande « cut » Permet de ne conserver que certaines parties d'une ligne grâce à l'option « -f ». Par exemple « echo titi toto tata | cut -f2 -d' ' » affichera le second champ (option -f2) de la ligne « titi toto tata » en utilisant le caractère ' ' comme séparateur (option -d' '), ce qui donne « toto ». Commande « date » Affiche la date. Commande « whoami » Affiche l'utilisateur avec lequel vous êtes connecté Commande « history » Affiche la liste des commandes que vous avez tapé jusqu'à maintenant. Commande « grep » Permet de ne conserver que les lignes qui contiennent une chaine de caractère passée en paramètre. Commande « df » Affiche les disques du système avec leur taille et l'espace occupé. Commande « lsof » Affiche la liste des fichiers ouverts avec le nom du programme et l'utilisateur qui est en train de le faire. Commande « tar » Créé une archive tar optionnellement compressée. Par exemple la commande « tar cfz toto.tar.gz le_repertoire_toto » va compresser (option c) le répertoire « le_repertoire_toto » en tar.gz (option z) dans le fichier « toto.tar.gz » (option f). Commande « find » Recherche des fichiers dans un répertoire suivant différent critères. Par exemple « find repertoire_titi -readable » va afficher tous les fichiers accessibles en lecture (option -readable) se trouvant dans le répertoire « repertoire_titi ». Commande « read » C'est une commande interne à bash qui permet de mettre le contenu d'une ligne dans des variables. Cette commande est très utile lorsqu'on veut lire le contenu d'un fichier ou la sortie d'une commande ligne par ligne. Par exemple, pour lire ligne par ligne la sortie de la commande « who » on fait : who | while read ligne do echo « $ligne » done Si la commande ou le fichier est structuré, il est possible d'affecter chaque champ à une variable différente grâce à la commande read. Par exemple la commande who renvoie une sortie structurée de la forme : <utilisateur> <terminal> <date> <heure> On peut donc directement faire l'affectation dans des variables : who | while read utilisateur terminal date heure do echo « L'utilisateur $utilisateur est dans le terminal $terminal depuis le $date à $heure » done Quelques références Pour avoir plus d'informations sur l'utilisation de base et sur le scripting, vous pouvez consulter les documentations suivantes : en console : man bash sur le Web : http://www.trustonme.net/didactels/148.html http://fr.wikipedia.org/wiki/Bourne-Again_shell http://marcg.developpez.com/ksh/ etc. ou plus généralement : http://www.google.fr/#q=bash