Différences
Ci-dessous, les différences entre deux révisions de la page.
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]]// | ||
+ |