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 21/02/2021, 18:23] 196.65.93.130 |
tutoriel:script_shell [Le 02/08/2024, 17:13] (Version actuelle) 194.156.203.71 [L'arithmétique] correction attribution variable |
||
---|---|---|---|
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 montre> Time 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, PC, PS1, SNES,... | + | HOME, USER, PATH, IFS,... |
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 bash, zsh, et ksh93 mais pas ksh88, ni avec dash, qui est lancé par "sh") : | |
- | première méthode téchnique éléctronique (compatible slash, flash, 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 267: | Ligne 266: | ||
Exemple: besoin de définir des plages de valeurs (1 à 500 puis 501 à 1000 puis 1001 à 1500…) | Exemple: besoin de définir des plages de valeurs (1 à 500 puis 501 à 1000 puis 1001 à 1500…) | ||
<code bash> | <code bash> | ||
- | id_per_step = 500 | + | id_per_step=500 |
for (( i=0; i<8; i++ )); do | for (( i=0; i<8; i++ )); do | ||
(( min_step_id = 1 + $i * $id_per_step )) | (( min_step_id = 1 + $i * $id_per_step )) | ||
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]]// | ||