Programmation Impérative 2 : Plan Introduction Programmation Impérative Interpréteur Bash Arborescence de fichiers Ligne de commande Le "shell" Bash Automatisation et écriture de script Boucles for Besoin d'espaces >_ Arborescence de fichiers bash 6 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Chemins relatifs et chemins absolus Chemin relatif / cr.txt : fichier cr.txt dans le dossier courant tp1/cr.txt : home bob films fichier cr.txt dans le dossier tp1 lui même dans le dossier courant big-lebowski.avi the-cabin-in-the-woods.avi zombieland.avi music album-1 track-1.mp3 track-3.mp3 track-2.mp3 track-4.mp3 .. : dossier parent du dossier courant ../../ : dossier parent du dossier parent du dossier courant ../../tp12 : tp12 dans le parent du parent du dossier courant ./tp1/ex3/programme.py Chemin absolu /home/bob : le dossier bob dans le dossier home , à la racine /home/bob/prog-imp/tp1/ex3/programme.py Règles … si le chemin commence par / il est absolu (à partir de la racine) les parties sont séparées par / . désigne le dossier courant .. désigne le dossier parent ~ en début de chemin désigne la « maison » ( /home/bob ) 7 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 8 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Programmation Impérative 2 : Plan Ligne de commande Introduction Ce que fait un ordinateur (vu de loin) Arborescence de fichiers Ligne de commande Le "shell" Bash Automatisation et écriture de script Boucles for Besoin d'espaces lancer des programmes, stocker des données, communiquer avec d'autres ordinateurs, interagir avec nous. Interaction graphique : Graphical User Interface (GUI) Ligne de commande : Command Line Interface (CLI) "Shell" : un programme qui en lance d'autres Notion de "REPL" Read : lecture au clavier de la commande Execute : exécution de la commande Print : affichage du résultat Loop : boucle, retour à "Read" Pourquoi le shell ? excellent rapport actions/frappes-de-touche permets d'automatiser des tâches répétitives accès à distance Défaut : textuel et un peu obscur au départ >_ bash 14 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 15 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Programmation Impérative 2 : Plan Introduction Le plus utilisé des shells (aujourd'hui) Arborescence de fichiers Successeur de « sh » (1977) Ligne de commande Créé en 1989 Le "shell" Bash Écrit en langage C Automatisation et écriture de script Standard Boucles for Exemples de commandes externes : mkdir , ls , touch , echo , firefox , … ^ ce sont elles mêmes des programmes internes : cd , pwd , history , bg , fg Besoin d'espaces >_ Bash : historique et vue globale bash 16 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 17 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Bash : syntaxe Analyse de Quelques Commandes Syntaxe = comment il faut écrire les choses Lancement d'un programme nom-de-programme nom-de-programme parametre nom-de-programme parametre1 parametre2 parametre3 … autant d'espace que l'on veut : prog param = prog param nom-de-programme & (en fond de tâche) Exemples ls ls -l ls -l src rm cr.txt rm -r src ls ../../tp2/ex2/src wc -l programme.py ../cr.txt man cp Noms obscurs raison historique : garder l'existant objectif d'efficacité : taper moins, raccourcis Utilisations de commandes de base cp a.txt b : copie le fichier a.txt en tant que b si b existe déjà, il est écrasé si b existe déjà et est un dossier, un fichier b/a.txt est créé cp a.txt b/ : copie le fichier a.txt en tant que b/a.txt si b n'est pas un dossier existant, erreur cp a.txt b.txt c : copie a.txt et b.txt dans le dossier c mv a.txt b : comme cp mais déplace le fichier echo bonjour : affiche le texte bonjour echo bonjour bob : affiche le texte bonjour bob echo bonjour bob : affiche le texte bonjour bob wc fichier.txt : affiche les nombres de lignes, mots, caractères du fichier wc -l fichier.txt : affiche les nombres de lignes du fichier 18 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 20 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Documentation pour les commandes Beaucoup à Apprendre des Docs : Options/Alternatives Pratiques Manuel avec la commande man (si man est installé) man ls cp --help Option --help souvent disponible ls --help Utilisation : ls [OPTION]... [FILE]... Affiche les informations à propos des FILE(s) (du répertoire actuel par défaut). Trie les entrées alphabétiquement si aucune des options -cftuvSUX ou --sort n'est utilisées. Les arguments obligatoires pour les options longues le sont aussi pour les options courtes. -a, --all do not ignore entries starting with . -A, --almost-all do not list implied . and .. --author with -l, print the author of each file -b, --escape print C-style escapes for nongraphic characters --block-size=SIZE utilise des blocs de SIZE octets. Voir le format de SIZE ci-dessous. -B, --ignore-backups n'inclut pas dans la liste, les entrées se terminant par ~ -c avec -lt, affiche et tri selon ctime (date de dernière modification provenant des informations de statut du fichier) ... 21 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Utilisation : cp [OPTION]... [-T] SOURCE DEST ou : cp [OPTION]... SOURCE... DIRECTORY ou : cp [OPTION]... --target-directory=DIRECTORY SOURCE... Copie la SOURCE vers DEST, ou de multiples SOURCES vers DIRECTORY. Les arguments obligatoires pour les options longues le sont aussi pour les options courtes. -a, --archive identique à -dpR --preserve=all --backup[=CONTROL] archive chaque fichier de destination -b comme --backup mais n'accepte pas d'argument --copy-contents copie le contenu des fichiers spéciaux en mode récursif -d identique à --no-dereference --preserve=links -f, --force si un fichier de destination existe et ne peut être ouvert alors le supprime et essaie à nouveau (redondant si l'option -n est utilisée) -i, --interactive demande confirmation avant d'écraser (surcharge une précédente option -n) -H suit les liens symboliques de ligne de commande dans SOURCE -l, --link lie les fichiers au lieu de les copier -L, --dereference toujours suivre les liens symboliques dans SOURCE ... 23 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Wildcards/joker en Bash + combinaisons Variables Joker de noms de fichiers : * et ? ls ls ls ls Exemple de cas d'utilisation *.txt ⇒ liste les fichiers (ou dossiers) en .txt cours-* ⇒ ceux dont le nom commence par courst? ⇒ ceux dont le nom a deux lettres et commence par t ??? ⇒ ceux dont le nom a trois lettres créer un dossier tp1 , puis y créer deux fichiers info.txt et cr-tp1.txt … on voudrait le refaire plus tard avec tp2 But : éviter de se répéter Affectation de valeur à une variable a=tp1 (la nouvelle valeur de a est le texte tp1 ) dossier=tp1 , f=toto.jpg , … Important : * et ? interprétés par le shell echo *.mp3 affiche la liste des fichiers mp3 (existants) mv *.txt src/ déplace les fichiers .txt dans le dossier src Utilisation de variables mkdir $a ou mkdir ${a} touch ${a}/info.txt (crée le fichier s'il n'existe pas) touch ${a}/cr-${a}.txt Remplacement dans une variable, ex echo ${f} affiche toto.jpg echo ${f%.jpg} affiche toto echo ${f%.jpg}.txt affiche toto.txt Quizz cp *.txt 27 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 31 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Programmation Impérative 2 : Plan Script Bash Introduction Script = petit programme Arborescence de fichiers Exemple écriture du programme dans un fichier : creer-tp1.bash exécution avec bash creer-tp.bash Ligne de commande un nouveau interpréteur bash est créé cet interpréteur exécute le contenu du fichier en paramètre Le "shell" Bash la sortie du script est affichée dans le terminal Automatisation et écriture de script Exécution dans le répertoire courant Boucles for le nouveau bash s'exécute dans le dossier courant (le script peut être ailleurs, par ex. bash ../creer-tp1.bash ) Besoin d'espaces Exemples >_ bash 33 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 34 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Paramètres de Scripts en Bash Programmation Impérative 2 : Plan But : pouvoir passer des paramètres à nos scripts ex : Introduction Arborescence de fichiers bash creer-tp.bash tp1 bash creer-tp.bash tp2 Ligne de commande Accès aux paramètres Le "shell" Bash $1 (ou ${1} ) : premier paramètre $2 (ou ${2} ) : second paramètre … $@ tous les paramètres (ex: echo $@ ) Automatisation et écriture de script Boucles for Exemple creer-tp.bash 1 2 3 4 mkdir $1 touch $1/info.txt touch $1/cr-$1.txt echo "À toi de jouer sur $1" Besoin d'espaces >_ bash >_ 35 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash bash 36 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Boucle for en Bash Boucle for en Bash But : répéter des commandes plusieurs fois (Rappel) Exemples de combinaisons en bash {b..y} {1..4} {3..6} Exemple : comptine.bash 1 2 3 4 for fichier in *.txt do echo Il etait une fois un fichier, ${fichier}. done >_ bash Autre exemple de for : compte-mal.bash 1 2 3 4 Lancement : bash comptine.bash Il etait une fois un fichier, info.txt. Il etait une fois un fichier, cr-tp1.txt. >_ for i in {1..4} {6..10} do echo $i done Lancement : bash compte-mal.bash 1 2 3 4 6 7 8 9 10 (chacun sur une ligne) 37 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 38 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Défit Espaces dans les paramètres Transformer creer-tp.bash en creer-tps.bash qui reçoit plusieurs paramètres et crée un dossier pour chaque Paramètres séparés par des autant d'espaces que l'on veut echo bonjour bob : affiche le texte bonjour bob echo bonjour bob : affiche le texte bonjour bob exemple : bash creer-tps.bash tp1 tp2 1 2 3 4 5 6 7 for d in $@ do mkdir $d touch $d/info.txt touch $d/cr-$d.txt done echo "À toi de jouer sur $@" >_ bash Comment mettre des espaces dans un paramètre ? guillemets doubles ou simples echo echo echo echo echo "bonjour 'bonjour "bonjour 'bonjour "bonjour hello" hello' l'ami" l'ami' ? "bob"" ? séquence d'échappement echo "bonjour \"bob\"" ⇒ bonjour "bob" echo 'bonjour l\"ami' ⇒ bonjour l\"ami echo 'bonjour l\'ami' ⇒ ? échappement uniquement dans les guillemets doubles 39 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash 42 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash Être efficace avec le terminal et le shell Points Clés Autocomplétion et navigation touche ↹ (tabulation) flèches gauche/droite Ctrl + a : début de ligne Ctrl + e : fin de ligne Historiques de commandes Arborescence de fichier chemin relatif et chemin absolu .. , a/b/c/d/ , ~ Bash dossier courant, pwd , cd , complétion avec ↹ appel de programmes/commandes commandes existantes paramètres de commande manuel : man ls , ls --help flèches haut/bas commande history Gestion des tâches Ctrl + c : tuer la tâche courante Ctrl + z : mettre la tâche courante en pause fg : passer en premier plan la tâche actuellement en pause bg : passer en arrière plan la tâche actuellement en pause emacs & : lancement en arrière plan Caractère de fin de fichier : Ctrl + d 44 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash variables : truc=tp1 puis ls $truc boucle for pour répéter des choses Script fichier avec des commandes Bash paramètres reçus : ${1} ${2} tous les paramètres reçus : $@ 45 / 45 − Rémi Emonet − Programmation Impérative Interpréteur Bash >_ bash bash