 programmation en shell bash sous linux but de ce document ce document me sert de mémo sur la programmation en shell bash il liste sans entrer dans le détail les principales possibilités en programmation bash premier script avec votre éditeur de texte préféré saisir ces deux lignes dans le fichier  testsh  bin bash echo bonjour le monde  remarques  l rsquo extension du fichier sh en l rsquo occurrence n rsquo a pas d rsquo importance il est même possible de ne pas en mettre la première ligne est obligatoire car elle permet d rsquo indiquer au shel qui va exécuter le script qu rsquo il doit utiliser le bash pour faire fonctionner ce script il faut commencer par le rendre exécutable chmod x testsh et nous pouvons le tester testsh bonjour le monde les variables affecter une valeur à une variable x toto ou en utilisant des guillemets pour protéger les espaces et les caractères spéciaux x toto et tutu  remarque  il ne faut pas mettre d rsquo espace de chaque coté du signe égale cette commande permet d rsquo initialiser la variable avec la valeur indiquée seulement si celleci est vide x x valeur par défaut  récupérer le résultat d rsquo une commande x ls etc ou x ls etc  afficher le contenu d rsquo une variable echo x ou echo x  les tableaux affecter une valeur à un tableau tab 0 toto lire le contenu du tableau echo tab 0  remarque  dans ce cas il est obligatoire d rsquo utiliser les accolades pour lire le contenu protection des expressions le  backslash  permet de protéger tous les caractères spéciaux y compris lui même echo le  guillemet double  permet de protéger tous les caractères sauf lui même qu rsquo il faut protéger avec un  backslash  et le ce qui permet d rsquo interpréter le contenu des variables echo x x x toto l rsquo apostrophe permet de protéger tous les caractères sauf elle même echo x x x x les calculs addition a 10 b 20 c a b echo a b c a b 30 multiplication et division a 10 b 20 c 2 d a b c echo a b c d a b c 100 le traitement des chaînes de caractères concaténation de chaînes de caractères a toto b tutu c a et b echo c toto et tutu supprime les 5 premiers caractères de la chaîne fich testtargz echo fich 5 targz extrait 3 caractères à partir du cinquième tony etch fich testtargz echo fich 53 tar le signe permet de supprimer le plus petit suffixe correspond à l rsquo expression régulière fich testtargz echo fich testtar le signe permet de supprimer le plus grand suffixe correspond à l rsquo expression régulière fich testtargz echo fich test le signe permet de supprimer le plus petit préfixe correspond à l rsquo expression régulière fich testtargz echo fich targz le signe permet de supprimer le plus grand préfixe correspond à l rsquo expression régulière fich testtargz echo fich gz remplace la première souschaîne trouvée par celle proposée fich testtargz echo fich targz tgz testtgz remplace toutes les souschaînes trouvées par celle proposée fich testtargztargz echo fich targz tgz testtgztgz la commande suivante permet de retrouver la longueur d rsquo une chaîne fich testtargz echo fich 11 utilisation des pipelines le caractère permet d rsquo envoyer la sortie d rsquo une commande sur l rsquo entrée de la commande suivante exemple df h tail 1 sed s g cut d f 4 42g la même chose avec  awk  df h tail 1 awk print 4 42g l rsquo enchaînement de commandes sur une même ligne ces commandes sont exécutées les unes derrières les autres echo debut echo fin debut fin la dernière commande est exécuté uniquement si la commande précédente c rsquo est exécutée avec succès echo debut true echo fin debut fin la dernière commande est exécuté uniquement si la commande précédente a retourné une erreur echo debut false echo fin debut fin les redirections envoie la sortie standard dans le fichier lstxt ls etc lstxt envoie la sortie standard à la fin du fichier lstxt ls etc lstxt envoie la sortie d rsquo erreur dans le fichier lserr ls toto 2 lserr redirection de la sortie standard et de la sortie d rsquo erreur dans deux fichiers séparés ls etc lstxt 2 lserr envoie la sortie d rsquo erreur et la sortie standard dans le fichier lstxt ls toto 2 1 lstxt la même chose en plus court ls toto lstxt redirige le résultat de deux commandes dans lstxt ls etc ls toto lstxt opérateur de test  l rsquo opérateur de test retourne vrai si la condition est vrai et faux dans le cas contraire donc cette ligne exécutera la commande  echo  seulement si le fichier existe f testsh echo ok arguments les plus courant de l rsquo opérateur option vrai si e fichier le fichier indiqué existe d répertoire le répertoire indiqué existe f fichier le fichier indiqué est un fichier régulier h fichier le fichier indiqué est un lien symbolique chaine1 chaine2 les deux chaînes sont identiques val1 eq val2 les deux valeurs sont égales val1 ge val2 val1 val2 val1 gt val2 val1 val2 val1 le val2 val1 val2 val1 lt val2 val1 val2 val1 ne val2 val1 val2 condition ifelsefi  syntaxe générale if condition then else fi cette instruction s rsquo utilise en générale avec l rsquo opérateur de test détaillé au chapitre précédent exemple if f testsh then echo ok fi ou sur une seule ligne if f testsh then echo ok fi condition caseesac  syntaxe générale case expression in motif1 commande 1 motif2 commande 2 esac le motif peut contenir n rsquo importe quelle chaîne de caractères n rsquo importe quel caractère abc alternance de caractères az suite de caractères ou permettant de combiner plusieurs motifs exemple bin bash while n 1 do ping c 1 w 1 1 dev null 2 1 case in 0 echo e 1 t ok 1 echo e 1 t injoignable 2 echo e 1 t inexistant esac shift done boucle whiledone  syntaxe générale while condition do done exemple i 0 while i lt 5 do i i 1 echo i done la même chose sur une ligne i 0 while i lt 5 do i i 1 echo i done un autre exemple en utilisant l rsquo instruction  break  permettant de sortie de la boucle i 0 while true do echo i avec break i i 1 i eq 5 break done boucle untildone  syntaxe générale until condition do done boucle fordone  le fonctionnement de cette boucle est très différent de celui des autres langages syntaxe for variale in listedemots do done exemple for var in a b c d do echo var done renommer une série de fichiers for i in tgz do mv i i tgz targz done boucle selectdone permet de réaliser des listes de choix exemple select var in a b c do echo var done 1 a 2 b 3 c  fonctions voici la syntaxe générale d rsquo une fonction function nomdelafonction  passage d rsquo arguments  0 contient le nom du script 1 premier argument 2 deuxième argument  10  dixième argument attention 10 retourne le premier argument suivi de 0 tous les arguments mais sans protéger les espaces et caractères spéciaux tous les arguments mais en protégeant les espaces et caractères spéciaux nombre d rsquo arguments de la fonction la commande  shift  permet de décaler les variables le contenu de 1 est remplacé par celui de 2 cela permet par exemple de lire le contenu de toute les variables while n 1 do echo 1 shift done affiche la lites des arguments passés au script for i in do echo i done la même chose en plus court for i do echo i done traitement des options dans un script traitement des options sans arguments l rsquo instruction  getopts  permet de traiter les options passées en ligne de commande dans cet exemple nous avons comme options a b et ou c l rsquo ordre des options n rsquo a pas d rsquo importance et il est possible de les coller ou pas while getopts abc option do case option in a echo option a b echo option b c echo option c esac done test traiteargumentssh c ab option c option a option b traitement des options avec argument si une option nécessite un argument il faut la faire suivre du signe et la valeur de l rsquo argument sera accessible dans la variable optarg exemple while getopts abc d option do case option in a echo option a b echo option b c echo option c argument optarg d echo option d argument optarg esac done test traitearguments2sh c toto ab d tutu option c argument toto option a option b option d argument tutu traitement des erreurs pour gérer les erreurs il faut ajouter dans la liste des options possibles cela permettra de traiter les options sans arguments et pour traiter les options inconnues  getopts  retourne qu rsquo il suffit de traiter dans le script while getopts abc d option do case option in a echo option a b echo option b c echo option c argument optarg d echo option d argument optarg echo argument manquant pour l option optarg echo option optarg inconnue esac done traitement des options longues sans arguments par défaut  getopts  ne sais pas traiter les options longues mais une petite astuce permet de contourner ce problème pour les options sans argument pour cela il suffit de d rsquo ajouter dans les options et de traiter en premier le cas des options longues while getopts hv option do if option then case optarg in help option h version option v echo option optarg inconnue esac fi case option in h echo option h v echo option v echo option optarg inconnue esac done test traitearguments3sh version h a option v option h option a inconnue pour avoir plus d rsquo informations pour avoir plus d rsquo explications sur la programmation en bash mais également avec sed awk perl tcl tk python ruby je vous conseille la lecture de cet excellent livre dont deux chapitres sont disponibles au format pdf  http wwweditionseyrollescom livre 9782212110289 langagesdescriptssouslinux historique des modifications version date commentaire 01 140808 création par tony galmiche   programmation  