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 28/01/2020, 16:43]
193.248.49.158 fxgtcvfd
tutoriel:script_shell [Le 31/12/2020, 17:19] (Version actuelle)
84.101.133.79 [Introduction aux scripts shell]
Ligne 4: Ligne 4:
 ====== 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 26: Ligne 35:
 =====Pour faire qu'un script soit exécutable ===== =====Pour faire qu'un script soit exécutable =====
  
-H==== 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).\\
Ligne 46: Ligne 55:
 ==== 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>​+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 bash ( dépend du langage du script ) mais pas toujours bash ( dépend du langage du script )
  
-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>​+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 : <​code>​./​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 ./ ===
Ligne 63: Ligne 72:
 Cette commande chez moi donnait initialement : Cette commande chez moi donnait initialement :
   /​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/toto, ce répertoire sera donc **/​home/​toto/​bin**.+ 
 +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**.
 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. 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.
 Pour ceci, il suffit de faire : Pour ceci, il suffit de faire :
Ligne 84: Ligne 96:
  
   * [[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 : shells C, créés par Bill Joy de Berkeley ;
Ligne 106: Ligne 118:
 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 133:
  
 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 251: Ligne 263:
 </​code>​ </​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>​
 ===== Vocabulaire ===== ===== Vocabulaire =====
 ==== La commande test ==== ==== La commande test ====
Ligne 598: Ligne 621:
 ==== 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 714: Ligne 744:
 </​code>​ </​code>​
 puis : puis :
-<​code>​+<​code ​bash>
 $ ./​favoritefood $ ./​favoritefood
 Vous aimez les moules frites ! Vous aimez les moules frites !
Ligne 735: Ligne 765:
 </​code>​ </​code>​
 puis : puis :
-<​code>​+<​code ​bash>
 $ ./​truncbegin "Hello world !" 5 $ ./​truncbegin "Hello world !" 5
 world ! world !
Ligne 873: Ligne 903:
 ---- ----
 //​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.1580226182.txt.gz
  • Dernière modification: Le 28/01/2020, 16:43
  • par 193.248.49.158