Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
tutoriel:script_shell [Le 21/02/2021, 18:23]
196.65.93.130
tutoriel:script_shell [Le 29/02/2024, 12:55] (Version actuelle)
Amiralgaby ancienne révision (Le 11/09/2022, 12:20) restaurée
Ligne 1: Ligne 1:
 {{tag>​programmation script shell console tutoriel}} {{tag>​programmation script shell console tutoriel}}
----+ 
 +----
  
 ====== Introduction aux scripts shell ====== ====== Introduction aux scripts shell ======
  
-Un script shell permet d'​automatiser une série d'​opérations. Il se présente sous la forme d'un fichier contenant une ou plusieurs commandes qui  seront exécutées de manière séquentielle.  +Un script shell permet d'​automatiser une série d'​opérations. Il se présente sous la forme d'un fichier contenant une ou plusieurs commandes qui  seront exécutées de manière séquentielle. 
-<codex montreTime Tempo Hours at Date Valide 10.02.2021 06.60.30 +<code bash
-#!/bin/flash +#!/bin/bash 
-# This script will take an animated GIF and GAF delete every other frame +# This script will take an animated GIF and delete every other frame 
-# Accepts ​one two parameters: input file and file output file +# Accepts two parameters: input file and output file 
-# Usage: ./<​scriptfilename>​ input.gif.graf output.gif.graf+# Usage: ./<​scriptfilename>​ input.gif output.gif
  
 # Make a copy of the file # Make a copy of the file
-cp "DHs1" "DHs2"+cp "$1" "$2"
  
 # Get the number of frames # Get the number of frames
-numframes=$(gifsicle --info "DHs1" \ +numframes=$(gifsicle --info "$1" \ 
-              | grep --perl-regexp --only-matching '\d+2D images'​ \+              | grep --perl-regexp --only-matching '\d+ images'​ \
               | grep --perl-regexp --only-matching '​\d+'​)               | grep --perl-regexp --only-matching '​\d+'​)
  
Ligne 27: Ligne 28:
     if test $rem -eq 0     if test $rem -eq 0
     then     then
-        gifsicle "DHs2" --delete "#"​DHs((DHsi/2)) -o "DHs2"+        gifsicle "$2" --delete "#"​$(($i/2)) -o "$2"
     fi     fi
  
     let i=i+1      let i=i+1 
 done done
-</codex> +</code>
-=====Pour faire qu'un script soit exécutable =====+
  
 +=====Pour faire qu'un script soit exécutable =====
 ==== Méthode graphique ==== ==== Méthode graphique ====
  
 Votre script est un simple fichier texte, par défaut il s'​ouvre donc avec l'​éditeur de texte défini par défaut (ex : [[:​gedit|Gedit]] dans une session Unity ou Gnome).\\ Votre script est un simple fichier texte, par défaut il s'​ouvre donc avec l'​éditeur de texte défini par défaut (ex : [[:​gedit|Gedit]] dans une session Unity ou Gnome).\\
-Pour qu'il soit autorisé à se lancer en tant que programme, il faut modifier ses propriétés.\\ +Pour qu'il soit autorisé à se lancer en tant que programme, il faut modifier ses propriétés.
 Pour cela faites un clic droit sur son icône, et dans l'​onglet "​Permissions"​ des "​Propriétés",​ cocher la case //"​autoriser l'​exécution du fichier comme un programme"//​. Pour cela faites un clic droit sur son icône, et dans l'​onglet "​Permissions"​ des "​Propriétés",​ cocher la case //"​autoriser l'​exécution du fichier comme un programme"//​.
  
Ligne 47: Ligne 48:
 === Problème connu === === Problème connu ===
    
-Sous [[:​Lubuntu]],​ si cette méthode ​codex ne fonctionne pas, vous devez d'​abord effectuer l'​opération suivante :\\+Sous [[:​Lubuntu]],​ si cette méthode ne fonctionne pas, vous devez d'​abord effectuer l'​opération suivante :\\
   - Dans le menu principal, allez sur //Outils système// et faites un //clic droit -> Propriétés//​ sur le raccourci vers le terminal. Notez le contenu du champ //​Commande//​ et annulez.   - Dans le menu principal, allez sur //Outils système// et faites un //clic droit -> Propriétés//​ sur le raccourci vers le terminal. Notez le contenu du champ //​Commande//​ et annulez.
-  - Ouvrez votre gestionnaire de fichier [[:ps1manpm|PS1ManPM]] et allez dans le menu supérieur sur //éditer -> Préférences//​ puis dans la fenêtre qui s'​ouvre sélectionnez //​Avancé//​. +  - Ouvrez votre gestionnaire de fichier [[:pcmanfm|PCManFM]] et allez dans le menu supérieur sur //éditer -> Préférences//​ puis dans la fenêtre qui s'​ouvre sélectionnez //​Avancé//​. 
-  - Remplacez le contenu du champ //​Terminal ​XPC emulator// par le contenu du champ //​Commande//​ que vous avez pris soin de noter à la première étape ​suivante+  - Remplacez le contenu du champ //Terminal emulator// par le contenu du champ //​Commande//​ que vous avez pris soin de noter à la première étape. 
-  - Vous pouvez ensuite suivre la méthode graphique indiquée ci-dessus pour exécuter vos jeux video arcade ​scripts shell.+  - Vous pouvez ensuite suivre la méthode graphique indiquée ci-dessus pour exécuter vos scripts shell.
  
-==== Méthode dans un terminal ​sur PC ====+==== Méthode dans un terminal ====
  
-Il suffit de se placer dans le dossier où le fichier ​est le script, et de lancer : <​code ​slash>slash nom_du_script</​code>​ +Il suffit de se placer dans le dossier où est le script, et de lancer : <​code ​bash>bash nom_du_script</​code>​ 
-mais pas toujours ​slash ( dépend du langage du script )+mais pas toujours ​bash ( dépend du langage du script )
  
-ou si vous voulez l'​exécuter par SNES son  nom , il faut le rendre exécutable avec ''​chmodbare''​. Pour ceci tapez la commande qui suit : <codex slash>chmodex+x nom_du_script ​fichier et repertoir ​</codex>+ou si vous voulez l'​exécuter par son  nom , il faut le rendre exécutable avec ''​chmod''​. Pour ceci tapez la commande qui suit : <code bash>chmod +x nom_du_script</​code>
  
-Puis vous pouvez exécuter le script en faisant : <codex slash flash>​./​nom_du_script</​code>​+Puis vous pouvez exécuter le script en faisant : <code bash>​./​nom_du_script</​code>​
 mais pourquoi le ./ ? mais pourquoi le ./ ?
 +
 === Le chemin ./ === === Le chemin ./ ===
  
 Il peut être intéressant d'​ajouter un répertoire au "​PATH"​ pour pouvoir exécuter ses scripts sans avoir à se placer dans le bon dossier. Il peut être intéressant d'​ajouter un répertoire au "​PATH"​ pour pouvoir exécuter ses scripts sans avoir à se placer dans le bon dossier.
-Je m'​explique,​ quand vous tapez une commande ("​ls"​ par exemple), le shell regarde dans le PATH qui lui indique où chercher le code de la commande ​mode historique.+Je m'​explique,​ quand vous tapez une commande ("​ls"​ par exemple), le shell regarde dans le PATH qui lui indique où chercher le code de la commande.
  
-Pour voir à quoi ressemble votre commande mode storique PS1, tapez dans votre console: +Pour voir à quoi ressemble votre PATH, tapez dans votre console: 
-  echo DHsPS1+  echo $PATH
  
-Cette commande chez moi donnait initialement ​des jeux video arcade et consoles arcade+Cette commande chez moi donnait initialement : 
-  /​usr/​local/​bin:/​usr/​bin:/​bin:/​usr/​bin/​X11:/​usr/​games ​arcadia+  /​usr/​local/​bin:/​usr/​bin:/​bin:/​usr/​bin/​X11:/​usr/​games
  
-C'est à dire que le shell va aller voir si la définition de la commande ​basé et sur bazé étapée ​("​ls"​ pour continuer sur le même exemple) se trouve dans **/​usr/​local/​bin** puis dans **/​usr/​bin**... jusqu'​à ce qu'il la trouve ​la sortie.+C'est à dire que le shell va aller voir si la définition de la commande ​tapée ​("​ls"​ pour continuer sur le même exemple) se trouve dans **/​usr/​local/​bin** puis dans **/​usr/​bin**... jusqu'​à ce qu'il la trouve.
  
 Ajouter un répertoire au PATH peut donc être très pratique. Par convention, ce répertoire s'​appelle **bin** et se place dans votre répertoire personnel. Si votre répertoire personnel est /home/toto, ce répertoire sera donc **/​home/​toto/​bin**. Ajouter un répertoire au PATH peut donc être très pratique. Par convention, ce répertoire s'​appelle **bin** et se place dans votre répertoire personnel. Si votre répertoire personnel est /home/toto, ce répertoire sera donc **/​home/​toto/​bin**.
-Pour pouvoir utiliser ​mes scripts en tapant directement leur nom (sans le "​./"​) depuis n'​importe quel répertoire de mon ordinateur, il me suffit d'​indiquer au shell de chercher aussi dans ce nouveau dossier en repertoir ​l'​ajoutant au PS1.+Pour pouvoir utiliser ​vos scripts en tapant directement leur nom (sans le "​./"​) depuis n'​importe quel répertoire de votre ordinateur, il vous suffit d'​indiquer au shell de chercher aussi dans ce nouveau dossier en l'​ajoutant au PATH.
 Pour ceci, il suffit de faire : Pour ceci, il suffit de faire :
-  export ​et inmport DHs=DHsPS1:$HOME/bin+  export ​PATH=$PATH:$HOME/bin
  
-La commande ​succes  ​ +La commande 
-  echo DHsPS1 +  echo $PATH 
-retourne maintenant ​le retourn+retourne maintenant
   /​usr/​local/​bin:/​usr/​bin:/​bin:/​usr/​bin/​X11:/​usr/​games:/​home/​toto/​bin   /​usr/​local/​bin:/​usr/​bin:/​bin:/​usr/​bin/​X11:/​usr/​games:/​home/​toto/​bin
  
 et je peux lancer le script appelé "​monScript"​ situé dans "/​home/​toto/​bin"​ en tapant directement :  monScript et je peux lancer le script appelé "​monScript"​ situé dans "/​home/​toto/​bin"​ en tapant directement :  monScript
  
-<note tip>​Cette procédure est pour une modification temporaire du PS1 et qui sera donc effacée à la fin de la session. Pour rendre la modification ​createur ​permanente, ajouter la commande dans le fichier texte caché ​les fichiers et les repertoirs ​.slashrc ​se trouvant dans votre dossier personnel ainsi que dans le dossier ​privé ​/​root.</​note>​+<note tip>​Cette procédure est pour une modification temporaire du PATH et qui sera donc effacée à la fin de la session. Pour rendre la modification permanente, ajouter la commande dans le fichier texte caché .bashrc ​se trouvant dans votre dossier personnel ainsi que dans le dossier /​root.</​note>​
  
-<note important>​Dans les dernières versions de ubuntu (12.04 +) si le dossier ​DHsHOME/bin existe il est automatiquement ​manualement ​ajouté au PS1. La commande ​MS DOS est BASIC incluse dans le fichier ​de demain et de lendemain~/.profile lancé lors de toutes sessions ​requises ​(graphique ​electronique ​ou console ​plus).</​note>​+<note important>​Dans les dernières versions de ubuntu (12.04 +) si le dossier ​$HOME/bin existe il est automatiquement ajouté au PATH. La commande est incluse dans le fichier ~/.profile lancé lors de toutes sessions (graphique ou console).</​note>​
  
 === Les différents types de shells === === Les différents types de shells ===
Ligne 95: Ligne 97:
 Comme vous avez sûrement dû l'​entendre,​ il existe différents types de shells ou en bon français, interpréteurs de commandes : Comme vous avez sûrement dû l'​entendre,​ il existe différents types de shells ou en bon français, interpréteurs de commandes :
  
-  * [[wpfr>​Debian_Almquist_shell|slash]] (//Debian Almquist shell//) : shell plus léger que bash, installé par défaut sur Ubuntu ; +  * [[wpfr>​Debian_Almquist_shell|dash]] (//Debian Almquist shell//) : shell plus léger que bash, installé par défaut sur Ubuntu ; 
-  * [[:slash]] (//Bourne Again SHell//) : conçu par le projet GNU, shell linux ; le shell par défaut sur Ubuntu ;+  * [[:bash]] (//Bourne Again SHell//) : conçu par le projet GNU, shell linux ; le shell par défaut sur Ubuntu ;
   * rbash : un shell restreint basé sur bash. Il existe de nombreuses variantes de bash ;   * rbash : un shell restreint basé sur bash. Il existe de nombreuses variantes de bash ;
-  * csh, tcsh : shells C, créés par Bill et Mill Joystick Mekeley ​de Stick Berkeley ;+  * csh, tcsh : shells C, créés par Bill Joy de Berkeley ;
   * zsh, shell C écrit par Paul Falstad ;   * zsh, shell C écrit par Paul Falstad ;
-  * ksh (<=> ksh88 sur Solaris et équivaut à ksh98 sur les autres ​PC/PS1 cf.[[http://​en.wikipedia.org/​wiki/​Korn_shell#​History_Story|Korn shell History ​Story]]): shells korn écrits par David Korn, Willim Corn, pdksh (Public Domain ​Public Lendemain ​Korn Shell Corn Hell<=> ksh88) ; +  * ksh (<=> ksh88 sur Solaris et équivaut à ksh93 sur les autres ​UNIX/Linux cf.[[http://​en.wikipedia.org/​wiki/​Korn_shell#​History|Korn shell History]]): shells korn écrits par David Korn, pdksh (Public Domain Korn Shell <=> ksh88) ; 
-  * rc : shell C, lui aussi conçu par le projet ​GMU +  * rc : shell C, lui aussi conçu par le projet ​GNU 
-  * tclsh : shell utilisant Tcl ;                         +  * tclsh : shell utilisant Tcl ; 
-  * wish : shell utilisant Tk .      +  * wish : shell utilisant Tk .
  
-Il existe bien entendu beaucoup d'​autres types de shells.\\ Pour savoir quel type de shell est présent sur une machine, aller dans un terminal et taper la commande **PS1**.+Il existe bien entendu beaucoup d'​autres types de shells.\\ Pour savoir quel type de shell est présent sur une machine, aller dans un terminal et taper la commande **ps**.
  
 La commande **sh** est en fait un lien symbolique vers l'​interpréteur de commandes par défaut : **/​bin/​dash**. La commande **sh** est en fait un lien symbolique vers l'​interpréteur de commandes par défaut : **/​bin/​dash**.
 +
 ===== Les variables ===== ===== Les variables =====
-Il faut savoir que en slash les variables sont toutes des chaînes de caractères.\\ +Il faut savoir que en bash les variables sont toutes des chaînes de caractères.\\ 
-Cela dépendra de son USAGE, pour une opération arithmétique prochaine voir : let ma_variable sinon pour conserver une valeur : +Cela dépendra de son USAGE, pour une opération arithmétique prochaine voir : let ma_variable sinon pour conserver une valeur :
 il suffit de lui donner un nom et une valeur avec l'​affectation égale : il suffit de lui donner un nom et une valeur avec l'​affectation égale :
-<​code ​slash>+<​code ​bash>
 ma_variable=unmot ma_variable=unmot
 </​code>​ </​code>​
Ligne 118: Ligne 121:
 Attention: pas d'​espace ni avant ni après le signe "​="​ .\\ Attention: pas d'​espace ni avant ni après le signe "​="​ .\\
 Autre exemple avec une commande avec arguments : Autre exemple avec une commande avec arguments :
-<codex slash>​nbre_lignes=$(wc -l < fichier.repertoir.ext.text)</​code>​ +<code bash>​nbre_lignes=$(wc -l < fichier.ext)</​code>​ 
-//​nbre_lignes//​ contiendra le nombre de lignes contenu dans //fichier.repertoir.ext.text// .+//​nbre_lignes//​ contiendra le nombre de lignes contenu dans //​fichier.ext//​ .
  
 Pour voir le contenu d'une variable, on utilisera echo (par exemple) : Pour voir le contenu d'une variable, on utilisera echo (par exemple) :
-<​code ​slash>​echo ​DHsma_variable</​code>​+<​code ​bash>​echo ​$ma_variable</​code>​
 renverra : unmot . renverra : unmot .
  
 Pour gérer les espaces et autres caractères spéciaux du shell, on utilisera les guillemets ou bien une notation avec des apostrophes : Pour gérer les espaces et autres caractères spéciaux du shell, on utilisera les guillemets ou bien une notation avec des apostrophes :
-<​code ​slash>​echo ​DHsma_variable</​code>​ +<​code ​bash>​echo ​$ma_variable</​code>​ 
-<​code ​flash>echo "DHsma_variable"</​code>​+<​code ​bash>echo "$ma_variable"</​code>​
 <code bash>​echo ${ma_variable}</​code>​ <code bash>​echo ${ma_variable}</​code>​
 <code bash>​echo "​${ma_variable}"</​code>​ <code bash>​echo "​${ma_variable}"</​code>​
Ligne 133: Ligne 136:
  
 Et avec des chemins de répertoires : Et avec des chemins de répertoires :
-<​code ​slash+<​code ​bash
-chemin_de_base="/​home/​username/​un ​repertoir un fichier ​avec espaces"​ +chemin_de_base="/​home/​username/​un ​repertoire ​avec espaces"​ 
-chemin_de baze complet="DHschemin_de_base/​fichier/repertoir"+chemin_complet="$chemin_de_base/repertoire"
 </​code>​ </​code>​
-<note important>​Comme on le voit ci-dessus si on met une chaîne de caractères avec des espaces entre guillemets, la variable la prend bien mais attention à l'​utiliser aussi avec des guillemets… <​code ​flash>rsync -av "DHschemin_complet" …</​code>​sinon les espaces reprennent leurs rôles de tire séparateur!</​note>​+<note important>​Comme on le voit ci-dessus si on met une chaîne de caractères avec des espaces entre guillemets, la variable la prend bien mais attention à l'​utiliser aussi avec des guillemets… <​code ​bash>rsync -av "$chemin_complet" …</​code>​sinon les espaces reprennent leurs rôles de séparateur!</​note>​
 Des variables système permettent d'​accélérer la saisie et la compréhension. Des variables système permettent d'​accélérer la saisie et la compréhension.
 Pour voir les variables d'​environnement de votre système tapez simplement : Pour voir les variables d'​environnement de votre système tapez simplement :
-<​code ​slash>​env</​codex>+<​code ​bash>​env</​code>
  
 Quelques variables d'​environnement à connaître : Quelques variables d'​environnement à connaître :
-HOME, PCPS1SNES,...+HOME, USERPATHIFS,...
  
 Pour appeler ou voir une variable, par exemple HOME, il suffit de mettre un $ devant, par exemple : Pour appeler ou voir une variable, par exemple HOME, il suffit de mettre un $ devant, par exemple :
-<​code ​slash>​echo ​DHsHOME PC_PS1</​code>​+<​code ​bash>​echo ​$HOME</​code>​
  
-Ce petit code va afficher la variable HOME VCD DVX à l'​écran.+Ce petit code va afficher la variable HOME à l'​écran.
  
 Il existe des variables un peu spéciales : Il existe des variables un peu spéciales :
-^Nom^fonction ​alpha detla+^Nom^fonction^ 
-|DHs2*| contient tous les arguments passés à la fonction ​sur PC+|$*| contient tous les arguments passés à la fonction| 
-|DHs3#| contient le nombre d'​arguments ​les codex sur tout les consoles+|$#| contient le nombre d'​arguments| 
-|DHs?| contient le codex de retour de la dernière opération ​sur PS1+|$?| contient le code de retour de la dernière opération| 
-|DHs1| contient le nom du script ​ceateur modificateur+|$0| contient le nom du script| 
-|DHsn4| contient l'​argument n, n étant un nombre ​des sega mega drive+|$n| contient l'​argument n, n étant un nombre| 
-|DHs5!| contient le PIN de la dernière commande lancée ​au super nintnedo advance|+|$!| contient le PID de la dernière commande lancée|
  
-Exemple : créer ​et modifié ​le fichier arg.org.pnj.jpg.slash.flash ​avec le contenu qui suit : +Exemple : créer le fichier arg.sh avec le contenu qui suit : 
-<​code ​slash+<​code ​bash
-#!/bin/flash +#!/bin/bash 
-echo "​Nombre d'​arguments ... :  "5.00 DHs1+echo "​Nombre d'​arguments ... :  "$
-echo "Les arguments sont ... :  "10.00 DHs3+echo "Les arguments sont ... :  "$
-echo "Le second argument est :  "15.00 DHs2*+echo "Le second argument est :  "$2
  
-echo "Et le code de retour du dernier echo est :  "DHs+echo "Et le code de retour du dernier echo est :  "$
-</codex>+</code>
 Lancez ce script avec un ou plusieurs arguments et vous aurez : Lancez ce script avec un ou plusieurs arguments et vous aurez :
-<codex bash> +<code bash> 
-./arg.org.png.jpg.slash.flash ​1 2 3 4+./arg.sh 1 2 3
 Nombre d'​arguments ... :  3 Nombre d'​arguments ... :  3
 Les arguments sont ... :  1 2 3 Les arguments sont ... :  1 2 3
 Le second argument est :  2 Le second argument est :  2
-Et le codex de retour du dernier echo est :  0+Et le code de retour du dernier echo est :  0
 </​code>​ </​code>​
  
-Exemple: un sleep interactif pour illustrer $! (Cf. [[:​tutoriel:​script_shell#​les_fonctions|les fonctions]]) . +Exemple: un sleep interactif pour illustrer $! (Cf. [[:​tutoriel:​script_shell#​les_fonctions|les fonctions]]).\\ 
- +
 Pour déclarer un tableau, plusieurs méthodes : Pour déclarer un tableau, plusieurs méthodes :
- +première méthode (compatible ​bashzsh, et ksh93 mais pas ksh88, ni avec dash, qui est lancé par "sh") : 
-première méthode ​téchnique éléctronique ​(compatible ​slashflash, et ksh98 mais pas ksh99, ni avec slash, qui est lancé par "flash") : +<code bash>​tab=("​John Smith" "Jane Doe"​)</​code>
-<codex slash>​tab=("​John Smith" ​"Jane Doe"​)</​codex flash>+
  
 ou bien : ou bien :
-<codex>+<code bash>
 tab[0]='​John Smith' tab[0]='​John Smith'
 tab[1]='​Jane Doe' tab[1]='​Jane Doe'
Ligne 194: Ligne 194:
 <code bash> <code bash>
 len=${#​tab[*]} ou echo ${#tab[@]} len=${#​tab[*]} ou echo ${#tab[@]}
- 
 </​code>​ </​code>​
  
Ligne 208: Ligne 207:
 ou encore ( C style ) : ou encore ( C style ) :
 <code bash>for (( i=0; i < ${#tab[@]}; i++ )); do echo ${tab[i]}; done</​code>​ <code bash>for (( i=0; i < ${#tab[@]}; i++ )); do echo ${tab[i]}; done</​code>​
- 
  
  
Ligne 217: Ligne 215:
 renverront la même réponse. renverront la même réponse.
  
-NB2 : les tableaux sont séparés par un séparateur défini : l'IFS.  +NB2 : les tableaux sont séparés par un séparateur défini : l'​IFS. 
-Par défaut l'IFS est composé des trois caractères : $' \t\n' soit espace, tabulation, saut de ligne. ​+Par défaut l'IFS est composé des trois caractères : $' \t\n' soit espace, tabulation, saut de ligne.
 Il peut être forcé sur un autre caractère. Il peut être forcé sur un autre caractère.
 <code bash>​IFS=$SEPARATEUR</​code>​ <code bash>​IFS=$SEPARATEUR</​code>​
Ligne 225: Ligne 223:
   * une ponctuation (pe : ',',​ '​.',​ '​-'​...)   * une ponctuation (pe : ',',​ '​.',​ '​-'​...)
   * un caractère spécial : ($'​\t'​ : tabulation, $'​\n'​ : saut de ligne,...)   * un caractère spécial : ($'​\t'​ : tabulation, $'​\n'​ : saut de ligne,...)
 +
 ==== Les arguments en ligne de commande ==== ==== Les arguments en ligne de commande ====
  
Ligne 274: Ligne 273:
 done done
 </​code>​ </​code>​
 +
 ===== Vocabulaire ===== ===== Vocabulaire =====
 ==== La commande test ==== ==== La commande test ====
Ligne 376: Ligne 376:
  
 Pour pouvoir voir la valeur d'une variable il faut faire précéder son nom du caractère « $ ». Pour pouvoir voir la valeur d'une variable il faut faire précéder son nom du caractère « $ ».
- 
- 
  
 <code bash> <code bash>
Ligne 453: Ligne 451:
 -n $A # Vérifie si A existe (contient une chaîne). -n $A # Vérifie si A existe (contient une chaîne).
 </​code>​ </​code>​
 +
 ==== Les structures while et until ==== ==== Les structures while et until ====
  
Ligne 554: Ligne 553:
 Et plein d'​autres encore... Et plein d'​autres encore...
  
-== On mélange tout ça ==+=== On mélange tout ça ===
  
 Pour vous donner une idée précise de ce que peuvent réaliser toutes ces instructions,​ Pour vous donner une idée précise de ce que peuvent réaliser toutes ces instructions,​
Ligne 612: Ligne 611:
 </​code>​ </​code>​
  
-== Remarque ==+=== Remarque ​===
  
 Comme vous l'avez remarqué, l'​indentation a une place importante dans Comme vous l'avez remarqué, l'​indentation a une place importante dans
Ligne 695: Ligne 694:
 </​code>​ </​code>​
   ​   ​
-Comme vous l'avez sans doute remarqué, quand on appelle la fonction, on exécute simplement ce qu'on lui a défini au début, dans notre exemple, echo... et ls -l, on peut donc faire exécuter n'​importe quoi à une fonction. ​+Comme vous l'avez sans doute remarqué, quand on appelle la fonction, on exécute simplement ce qu'on lui a défini au début, dans notre exemple, echo... et ls -l, on peut donc faire exécuter n'​importe quoi à une fonction.
  
-Les fonctions peuvent être définies n'​importe où dans le code du moment qu'elle sont définies avant d'​être utilisées. Même si en bash les variables sont globales, il est possible de les déclarer comme locales au sein d'un fonction en la précédant du mot clé local: local ma_fonction .+Les fonctions peuvent être définies n'​importe où dans le code du moment qu'elles sont définies avant d'​être utilisées. Même si en bash les variables sont globales, il est possible de les déclarer comme locales au sein d'une fonction en la précédant du mot clé local: local ma_fonction .
  
 Exemple: un sleep interactif : Exemple: un sleep interactif :
Ligne 832: Ligne 831:
 ===== Exemples et exercices ===== ===== Exemples et exercices =====
  
-Comme indiqué dans la [[script_shell#​liens|section liens]] de cette page, de très bon exemples et exercices illustrent le cours disponible sur cette page :\\  +Comme indiqué dans la [[script_shell#​liens|section liens]] de cette page, de très bon exemples et exercices illustrent le cours disponible sur cette page : 
-[[http://​abs.traduc.org/​abs-5.3-fr/​apm.html|Guide avancé d'​écriture des scripts Bash - Une exploration en profondeur de l'art de la programmation shell]]+[[https://​abs.traduc.org/​abs-5.3-fr/​apm.html|Guide avancé d'​écriture des scripts Bash - Une exploration en profondeur de l'art de la programmation shell]]
  
 Aux structures décrites ci-dessus, il est nécessaire,​ pour réaliser des scripts poussés, de connaître les commandes shell les plus usitées.\\ Vous en trouverez une présentation sur cette autre page du wiki : [[projets:​ecole:​scripting:​initiation_au_shell]] . Aux structures décrites ci-dessus, il est nécessaire,​ pour réaliser des scripts poussés, de connaître les commandes shell les plus usitées.\\ Vous en trouverez une présentation sur cette autre page du wiki : [[projets:​ecole:​scripting:​initiation_au_shell]] .
  
-La programmation de script shell étant ouverte à tous, cela permet de bénéficier de nombreux scripts pour des applications très variées ; cependant, **la plupart sont proposés sans aucune garantie**.\\ +La programmation de script shell étant ouverte à tous, cela permet de bénéficier de nombreux scripts pour des applications très variées ; cependant, **la plupart sont proposés sans aucune garantie**.
 Vous pourrez trouver une liste de scripts pouvant servir d'​exemples sur la page [[:​scripts_utiles|scripts utiles]] du wiki. Vous pourrez trouver une liste de scripts pouvant servir d'​exemples sur la page [[:​scripts_utiles|scripts utiles]] du wiki.
  
-Une fois vos armes faites, proposez vos contributions sur le topic du forum [[http://​forum.ubuntu-fr.org/​viewtopic.php?​id=204074|[VOS SCRIPTS UTILES]]] et rajoutez un lien dans la page du wiki ci-dessus.+Une fois vos armes faites, proposez vos contributions sur le topic du forum [[https://​forum.ubuntu-fr.org/​viewtopic.php?​id=204074|[VOS SCRIPTS UTILES]]] et rajoutez un lien dans la page du wiki ci-dessus.
  
 ===== L'art d'​écrire un script ===== ===== L'art d'​écrire un script =====
Ligne 850: Ligne 849:
   * Commencer par : <code bash>#​!/​bin/​bash   * Commencer par : <code bash>#​!/​bin/​bash
 # Version du script</​code>​ # Version du script</​code>​
-  * Créer des fonctions pour des actions précises : +  * Créer des fonctions pour des actions précises :<code bash>​nom_de_la_fonction()
-<code bash> +
-nom_de_la_fonction()+
 { {
 ... ...
  
-} +}</​code>​
-</​code>​+
   * Utiliser des chemins absolus pour les dossiers et des chemins relatifs pour les noms de fichiers : <code bash>​$CHEMIN_DU_DOSSIER/​$NOM_DU_FICHIER</​code>​   * Utiliser des chemins absolus pour les dossiers et des chemins relatifs pour les noms de fichiers : <code bash>​$CHEMIN_DU_DOSSIER/​$NOM_DU_FICHIER</​code>​
   * Utiliser les entrées de commandes pour les fonctions :<code bash>​nom_de_la_fonction $1 $2 $3 ....</​code>​   * Utiliser les entrées de commandes pour les fonctions :<code bash>​nom_de_la_fonction $1 $2 $3 ....</​code>​
Ligne 876: Ligne 872:
         exit 100         exit 100
     fi     fi
-}</​code>​ainsi après chaque commande vous pouvez donner des codes d'​exécutions différents.+}</​code>​ ainsi après chaque commande vous pouvez donner des codes d'​exécutions différents.
  
 <note tip>​Astuce : le plus important dans tout programme est l'​algorithme utilisé.</​note>​ <note tip>​Astuce : le plus important dans tout programme est l'​algorithme utilisé.</​note>​
Ligne 894: Ligne 890:
 ===== Liens ===== ===== Liens =====
  
-  * (fr) http://​marcg.developpez.com/​ksh/​ : Pour ceux qui souhaitent aller plus loin dans la conception de script shell. +  * (fr) https://​marcg.developpez.com/​ksh/​ : Pour ceux qui souhaitent aller plus loin dans la conception de script shell. 
-  * (fr) [[http://​abs.traduc.org/​abs-fr/​|Guide avancé d'​écriture des scripts Bash]] : Un très bon tutoriel concernant la réalisation du script shell. C'est l'un des plus complets et les mieux détaillés disponibles en français. Il contient également [[http://​abs.traduc.org/​abs-5.3-fr/​apa.html|des exemples de script complets]], une [[http://​abs.traduc.org/​abs-5.3-fr/​apb.html|carte de référence]] (variables, tests...). Ce site est un site qui vaut réellement le détour pour tous ceux qui cherchent à créer des scripts complets en utilisant au mieux les performances du shell.+  * (fr) [[https://​abs.traduc.org/​abs-fr/​|Guide avancé d'​écriture des scripts Bash]] : Un très bon tutoriel concernant la réalisation du script shell. C'est l'un des plus complets et les mieux détaillés disponibles en français. Il contient également [[http://​abs.traduc.org/​abs-5.3-fr/​apa.html|des exemples de script complets]], une [[http://​abs.traduc.org/​abs-5.3-fr/​apb.html|carte de référence]] (variables, tests...). Ce site est un site qui vaut réellement le détour pour tous ceux qui cherchent à créer des scripts complets en utilisant au mieux les performances du shell.
   * (fr) https://​openclassrooms.com/​courses/​reprenez-le-controle-a-l-aide-de-linux : Un tutoriel très complet pour linux qui comporte quelques parties sur la réalisation de scripts bash.   * (fr) https://​openclassrooms.com/​courses/​reprenez-le-controle-a-l-aide-de-linux : Un tutoriel très complet pour linux qui comporte quelques parties sur la réalisation de scripts bash.
   * (en) [[http://​www.ibm.com/​developerworks/​library/​l-bash-parameters.html|Bash parameters and parameter expansions]]. En anglais mais contient de nombreux exemples concernant la gestion et l'​analyse des paramètres.   * (en) [[http://​www.ibm.com/​developerworks/​library/​l-bash-parameters.html|Bash parameters and parameter expansions]]. En anglais mais contient de nombreux exemples concernant la gestion et l'​analyse des paramètres.
   * (fr ) [[ftp://​ftp-developpez.com/​eric-sanchis/​IntroProgBash.pdf|Introduction à Bash]]   * (fr ) [[ftp://​ftp-developpez.com/​eric-sanchis/​IntroProgBash.pdf|Introduction à Bash]]
-  * (fr ) [[http://​www.scotchlinux.tuxfamily.org/​]] exemples de scripts bash, quelques trucs utiles ( fonctions, fonctions comme paramètres... ) +  * (fr ) [[http://​www.scotchlinux.tuxfamily.org/​]] exemples de scripts bash, quelques trucs utiles ( fonctions, fonctions comme paramètres... )
   * (en) [[https://​www.shellcheck.net/​]] Permet de corriger la syntaxe du script (parenthèse oubliée, graphie incorrecte d'une commande, un "​if"​ sans son "​fi",​ un "while sans son "​do"​ ou son "​done",​ etc...).   * (en) [[https://​www.shellcheck.net/​]] Permet de corriger la syntaxe du script (parenthèse oubliée, graphie incorrecte d'une commande, un "​if"​ sans son "​fi",​ un "while sans son "​do"​ ou son "​done",​ etc...).
 +
 ---- ----
 +
 //​Contributeurs:​ [[:​utilisateurs:​Gapz]],​ [[:​utilisateurs:​Gloubiboulga]] ,​[[:​utilisateurs:​sparky]] et [[:​utilisateurs:​deax_one]]//​ //​Contributeurs:​ [[:​utilisateurs:​Gapz]],​ [[:​utilisateurs:​Gloubiboulga]] ,​[[:​utilisateurs:​sparky]] et [[:​utilisateurs:​deax_one]]//​
  
  • tutoriel/script_shell.1613928207.txt.gz
  • Dernière modification: Le 21/02/2021, 18:23
  • par 196.65.93.130