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édentesRévision précédente
Prochaine révision
Révision précédente
tutoriel:script_shell [Le 28/01/2020, 16:43] – fxgtcvfd 193.248.49.158tutoriel:script_shell [Le 18/05/2026, 23:29] (Version actuelle) – [Méthode dans un terminal] typos krodelabestiole
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 s+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. 
 +<code bash> 
 +#!/bin/bash 
 +# This script will take an animated GIF and delete every other frame 
 +# Accepts two parameters: input file and output file 
 +# Usage: ./<scriptfilename> input.gif output.gif 
 # Make a copy of the file # Make a copy of the file
-cp $1 $2+cp "$1" "$2"
  
 # Get the number of frames # Get the number of frames
-numframes=`gifsicle $1 -I | grep -P "\d+ images" --only-matching | grep -P "\d+--only-matching`+numframes=$(gifsicle --info "$1" \ 
 +              | grep --perl-regexp --only-matching '\d+ images'
 +              | grep --perl-regexp --only-matching '\d+')
  
 # Deletion # Deletion
 let i=0 let i=0
-while [[ $i -lt $numframes  ]]; do+while test $i -lt $numframes 
 +do
     rem=$(( $i % 2 ))     rem=$(( $i % 2 ))
  
-    if $rem -eq 0 ]+    if test $rem -eq 0
     then     then
-        gifsicle $2 --delete "#"$(($i/2)) -o $2 +        gifsicle "$2--delete "#"$(($i/2)) -o "$2"
     fi     fi
  
Ligne 24: Ligne 34:
 done done
 </code> </code>
-=====Pour faire qu'un script soit exécutable ===== 
  
-H==== Méthode graphique ====+=====Pour faire qu'un script soit exécutable ===== 
 +==== 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 46: Ligne 56:
 ==== Méthode dans un terminal ==== ==== Méthode dans un terminal ====
  
-Il suffit de se placer dans le dossier où est le script, et de lancer : <code>bash nom_du_script</code> +Pour  utiliser un script, on peut le lancer avec la commande servant à l'interpréter. Pour utiliser l'[[#Les différents types de shells|interpréteur]] [[:bash]] (par défaut sur Ubuntu), ce sera la commande ''[[man>bash]]''
-mais pas toujours bash ( dépend du langage du script )+<code bash>bash /chemin/du/script.sh</code>
  
-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>chmod +x nom_du_script</code>+La commande est à adapter selon l'application et selon le [[:chemins|chemin]] du script. Si le script se trouve dans le [[:chemins#chemin_relatif|répertoire courant]], on peut se contenter de la commande : 
 +<code bash>bash script.sh</code> 
 + 
 +Grâce au [[#shebang]], on peut aussi interpréter un script simplement en l'appelant par son nom.\\ 
 +Il faut avant tout le rendre exécutable avec ''chmod'' (voir //[[:Permissions]]//).\\ 
 +Pour ceci entrer la commande : 
 +<code bash>chmod +x script.sh</code> 
 + 
 +Puis exécuter le script avec : 
 +<code bash>./script.sh</code>
  
-Puis vous pouvez exécuter le script en faisant : <code>./nom_du_script</code> 
-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. +Ce ''./'' dépend du [[:chemins|chemin]] du script : ''./'' signifie "[[:chemins#chemin_relatif|répertoire courant]]et permet au système d'appeler un script hors ''[[#$PATH]]''.
-Je m'explique, quand vous tapez une commande ("lspar exemple), le shell regarde dans le PATH qui lui indique où chercher le code de la commande.+
  
-Pour voir à quoi ressemble votre PATH, tapez dans votre console:+=== $PATH === 
 + 
 +La [[:variables_d_environnement|variable d'environnement]] ''[[:variables_d_environnement#variables_liees_aux_emplacements_de_fichiers|$PATH]]'' définit les répertoires où le système doit chercher les fichiers exécutables. 
 + 
 +En plaçant un fichier exécutable (comme un script) dans l'un de ces répertoires, il n'est pas nécessaire de spécifier son [[:chemins|chemin]] complet pour le lancer. Le nom du fichier suffit.\\ 
 +Ubuntu dispose d'un répertoire des [[:arborescence#binaires personnels]] à cet effet dans le [[:arborescence#répertoire personnel]] de chaque [[:utilisateur]], qu'on peut manipuler sans les [[:permissions administrateur]]. 
 + 
 +Pour voir à quoi ressemble ''$PATH''entrer la commande :
   echo $PATH   echo $PATH
  
-Cette commande chez moi donnait initialement :+Cette commande retourne par exemple :
   /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games   /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
-ntion, ce répertoire s'appelle **bin** et se place dans votre répertoire personnel. Si votre répertoire personnel est /home/totoce 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 l'ajoutant au PATH. +C'est à dire que le système va aller voir si un script ou un exécutable se trouve dans ''/usr/local/bin''puis dans ''/usr/bin'', puis dans ''/bin'', etc
-Pour ceci, il suffit de faire :+ 
 +On peut aussi ajouter un répertoire particulier à la variable ''$PATH''.\\ 
 +Pour ceci, il suffit d'entrer :
   export PATH=$PATH:$HOME/bin   export PATH=$PATH:$HOME/bin
 +où ''$HOME/bin'' est le répertoire concerné.
  
 La commande La commande
Ligne 73: Ligne 99:
   /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é "monScriptsitué dans "/home/toto/binen tapant directement :  monScript+et on peut lancer le script appelé ''monScript.sh'' situé dans ''/home/toto/bin'' en entrant directement :  
 +  monScript.sh
  
-<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 tip> 
 +Cette modification du ''$PATH'' est seulement temporaire et sera effacée à la fin de la [[:session utilisateur|session]].\\ 
 +Pour rendre la modification permanente, ajouter cette commande dans le fichier caché ''~/.bashrc'' se trouvant dans le [[:arborescence#répertoire personnel]]. 
 +</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>+<note important> 
 +En l'occurrence si le répertoire ''$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 ===
  
-Comme vous avez sûrement dû l'entendre, il existe différents types de shells ou en bon français, interpréteurs de commandes :+Il existe différents types de //shells//, ou interpréteurs de commandes :
  
-  * [[wpfr>Debian_Almquist_shell|dash]] (//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 
-  * bash (//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 Joy de Berkeley ; +  * ''csh''''tcsh'' //shell// 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 à 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; +  * ''ksh'' : //shell// korn écrits par David Korn((''pdksh'' Public Domain Korn Shell <=> ksh88 sur Solaris et équivaut à ksh93 sur les autres UNIX/Linux cf.[[wp>Korn_shell#History|Korn shell History]])) 
-  * rc : shell C, lui aussi conçu par le projet GNU ; +  * ''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 **ps**.+Il existe encore beaucoup d'autres types de //shells//.\\ Pour savoir quel type de //shell// est utilisé sur une machine, entrer la commande ''[[man>ps]]''
 + 
 +La commande ''[[man>sh]]'' est en fait un [[:lien_physique_et_symbolique|lien symbolique]] vers l'interpréteur de commandes par défaut : ''/usr/bin/dash''
 + 
 +<note> 
 +On  peut aussi écrire des scripts dans d'autres langages interprétés : 
 +  ''[[:python]]'' 
 +  ''[[:php]]'' 
 +  ''[[:nodejs|node]]'' pour [[wpfr>JavaScript]] 
 +  ''[[wpfr>Perl_(langage)|perl]]'' 
 +  * etc. 
 +</note> 
 + 
 +=== Shebang === 
 + 
 +Le [[wpfr>shebang]] est la déclaration en commentaire à la première ligne du script qui informe le système du chemin de l'interpréteur à utiliser, précédé des caractères ''#!''
 + 
 +Pour ''[[man>bash]]'' il sera de la forme : 
 +<file>#!/bin/bash</file>
  
-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 bash les variables sont toutes des chaînes de caractères.\\ +Il faut savoir qu'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 bash> <code bash>
Ligne 106: Ligne 155:
 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 :
-<code>nbre_lignes=$(wc -l < fichier.ext)</code>+<code bash>nbre_lignes=$(wc -l < fichier.ext)</code>
 //nbre_lignes// contiendra le nombre de lignes contenu dans //fichier.ext// . //nbre_lignes// contiendra le nombre de lignes contenu dans //fichier.ext// .
  
Ligne 121: Ligne 170:
  
 Et avec des chemins de répertoires : Et avec des chemins de répertoires :
-<code>+<code bash>
 chemin_de_base="/home/username/un repertoire avec espaces" chemin_de_base="/home/username/un repertoire avec espaces"
 chemin_complet="$chemin_de_base/repertoire" 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>rsync -av "$chemin_complet" …</code>sinon les espaces reprennent leurs rôles de 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 :
Ligne 165: Ligne 214:
 </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 bash, zsh, et ksh93 mais pas ksh88, ni avec dash, qui est lancé par "sh") : première méthode (compatible bash, zsh, et ksh93 mais pas ksh88, ni avec dash, qui est lancé par "sh") :
 <code bash>tab=("John Smith" "Jane Doe")</code> <code bash>tab=("John Smith" "Jane Doe")</code>
Ligne 182: Ligne 228:
 <code bash> <code bash>
 len=${#tab[*]} ou echo ${#tab[@]} len=${#tab[*]} ou echo ${#tab[@]}
- 
 </code> </code>
  
Ligne 196: Ligne 241:
 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 205: Ligne 249:
 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 213: Ligne 257:
   * 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 249: Ligne 294:
 done done
 echo "Vous avez réussi !" echo "Vous avez réussi !"
 +</code>
 +
 +==== L'arithmétique ====
 +<code bash>(( variable = 2 + $autre_var * 5 ))</code>
 +Exemple: besoin de définir des plages de valeurs (1 à 500 puis 501 à 1000 puis 1001 à 1500…)
 +<code bash>
 +id_per_step=500
 +for (( i=0; i<8; i++ )); do
 + (( min_step_id = 1 + $i * $id_per_step ))
 + (( max_step_id = (( $i + 1 )) * $id_per_step ))
 + echo "$min_step_id to $max_step_id "
 +done
 </code> </code>
  
Ligne 261: Ligne 318:
  
 ^ Syntaxe ^ Fonction réalisée ^ ^ Syntaxe ^ Fonction réalisée ^
-| -e fichier      | renvoie 0 si fichier existe.                           | +| -e fichier (ou répertoire)      | renvoie 0 si fichier/répertoire existe.                           | 
-| -d fichier      | renvoie 0 si fichier existe et est un répertoire.      +| -d répertoire                 | renvoie 0 si fichier existe et est un répertoire.                 
-| -f fichier      | renvoie 0 si fichier existe et est un fichier 'normal'.| +| -f fichier                    | renvoie 0 si fichier existe et est un fichier (pas un répertoire).| 
-| -w fichier      | renvoie 0 si fichier existe et est en écriture.        +| -w fichier                    | renvoie 0 si fichier existe et est en écriture.                   
-| -x fichier      | renvoie 0 si fichier existe et est exécutable.         +| -x fichier                    | renvoie 0 si fichier existe et est exécutable.                    
-| f1 -nt f2       | renvoie 0 si f1 est plus récent que f2.                +| f1 -nt f2                     | renvoie 0 si f1 est plus récent que f2.                           
-| f1 -ot f2       | renvoie 0 si f1 est plus vieux que f2.                 |+| f1 -ot f2                     | renvoie 0 si f1 est plus vieux que f2.                            | 
 +<note tip>Si vous préférez vérifier que votre //fichier/répertoire// N’existe PAS, //-e// -> //! -e//</note>
  
 === Opérateurs de comparaison numérique === === Opérateurs de comparaison numérique ===
Ligne 353: Ligne 411:
  
 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 369: Ligne 425:
 fi fi
 </code> </code>
 +<note tip>Simple ou double crochets ?(((EN) https://stackoverflow.com/questions/13542832/what-is-the-difference-between-single-and-double-square-brackets-in-bash et \\ (FR) https://blog.stephane-robert.info/docs/admin-serveurs/linux/exploiter/scripts/conditions-bash/#--vs---vs-))\\  
 +Les crochets simples [] correspondent à des tests de condition conformes au shell POSIX.\\  
 +Les doubles permettent d'avantage d'opérations dont les expressions rationelles ([[wpfr>Expression_régulière|REGEX]])\\  
 +Préférez les crochets simples pour une meilleure compatibilité. 
 +</note>
 === Explication === === Explication ===
  
Ligne 430: Ligne 490:
 -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 531: Ligne 592:
 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 589: Ligne 650:
 </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 598: Ligne 659:
 ==== La structure for ==== ==== La structure for ====
  
-L'instruction `for` exécute ce qui est dans son bloc un nombre de fois prédéfini. Sa syntaxe est la suivante :+L'instruction `for` exécute ce qui est dans son bloc un nombre de fois prédéfini. Sa syntaxe est la suivante :
 <code bash> <code bash>
 for variable in valeurs; do for variable in valeurs; do
     instructions     instructions
 +done
 +</code>
 +
 +ou le classique:
 +<code bash>
 +for (( i=$min; i<=$max; i++ )); do
 +    instructions_avec_i # ou pas
 done done
 </code> </code>
Ligne 665: Ligne 733:
 </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 714: Ligne 782:
 </code> </code>
 puis : puis :
-<code>+<code bash>
 $ ./favoritefood $ ./favoritefood
 Vous aimez les moules frites ! Vous aimez les moules frites !
Ligne 735: Ligne 803:
 </code> </code>
 puis : puis :
-<code>+<code bash>
 $ ./truncbegin "Hello world !" 5 $ ./truncbegin "Hello world !" 5
 world ! world !
Ligne 802: Ligne 870:
 ===== 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 820: Ligne 888:
   * 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 846: Ligne 911:
         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 864: Ligne 929:
 ===== 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]]//
 +