Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| tutoriel:script_shell [Le 07/10/2019, 14:18] – [La structure for] BugFollower | tutoriel:script_shell [Le 24/04/2026, 14:08] (Version actuelle) – [La structure : `if`] note [] vs [[]] bcag2 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| {{tag> | {{tag> | ||
| - | --- | + | |
| + | ---- | ||
| ====== Introduction aux scripts shell ====== | ====== Introduction aux scripts shell ====== | ||
| - | Un script shell permet d' | + | Un script shell permet d' |
| - | < | + | < |
| #!/bin/bash | #!/bin/bash | ||
| # This script will take an animated GIF and delete every other frame | # This script will take an animated GIF and delete every other frame | ||
| Ligne 12: | Ligne 13: | ||
| # 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" | + | numframes=$(gifsicle |
| + | | ||
| + | | grep --perl-regexp | ||
| # Deletion | # Deletion | ||
| let i=0 | let i=0 | ||
| - | while [[ $i -lt $numframes | + | 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 "#" | + | gifsicle |
| fi | fi | ||
| Ligne 30: | Ligne 34: | ||
| done | done | ||
| </ | </ | ||
| - | =====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' | Votre script est un simple fichier texte, par défaut il s' | ||
| - | 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' | Pour cela faites un clic droit sur son icône, et dans l' | ||
| Ligne 52: | 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 : < | + | Il suffit de se placer dans le dossier où est le script, et de lancer : < |
| 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' | + | ou si vous voulez l' |
| - | Puis vous pouvez exécuter le script en faisant : < | + | Puis vous pouvez exécuter le script en faisant : < |
| mais pourquoi le ./ ? | mais pourquoi le ./ ? | ||
| + | |||
| === Le chemin ./ === | === Le chemin ./ === | ||
| Ligne 73: | Ligne 78: | ||
| Ajouter un répertoire au PATH peut donc être très pratique. Par convention, ce répertoire s' | Ajouter un répertoire au PATH peut donc être très pratique. Par convention, ce répertoire s' | ||
| - | Pour pouvoir utiliser | + | Pour pouvoir utiliser |
| Pour ceci, il suffit de faire : | Pour ceci, il suffit de faire : | ||
| export PATH=$PATH: | export PATH=$PATH: | ||
| Ligne 93: | Ligne 98: | ||
| * [[wpfr> | * [[wpfr> | ||
| - | * 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 99: | Ligne 104: | ||
| * ksh (<=> ksh88 sur Solaris et équivaut à ksh93 sur les autres UNIX/Linux cf.[[http:// | * ksh (<=> ksh88 sur Solaris et équivaut à ksh93 sur les autres UNIX/Linux cf.[[http:// | ||
| * 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' | Il existe bien entendu beaucoup d' | ||
| La commande **sh** est en fait un lien symbolique vers l' | La commande **sh** est en fait un lien symbolique vers l' | ||
| + | |||
| ===== Les variables ===== | ===== Les variables ===== | ||
| - | Il faut savoir | + | Il faut savoir |
| - | 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' | il suffit de lui donner un nom et une valeur avec l' | ||
| <code bash> | <code bash> | ||
| Ligne 115: | Ligne 121: | ||
| Attention: pas d' | Attention: pas d' | ||
| Autre exemple avec une commande avec arguments : | Autre exemple avec une commande avec arguments : | ||
| - | < | + | < |
| // | // | ||
| Ligne 130: | Ligne 136: | ||
| Et avec des chemins de répertoires : | Et avec des chemins de répertoires : | ||
| - | < | + | < |
| chemin_de_base="/ | chemin_de_base="/ | ||
| chemin_complet=" | chemin_complet=" | ||
| </ | </ | ||
| - | <note important> | + | <note important> |
| Des variables système permettent d' | Des variables système permettent d' | ||
| Pour voir les variables d' | Pour voir les variables d' | ||
| Ligne 174: | Ligne 180: | ||
| </ | </ | ||
| - | Exemple: un sleep interactif pour illustrer $! (Cf. [[: | + | Exemple: un sleep interactif pour illustrer $! (Cf. [[: |
| - | + | ||
| 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 " | première méthode (compatible bash, zsh, et ksh93 mais pas ksh88, ni avec dash, qui est lancé par " | ||
| <code bash> | <code bash> | ||
| Ligne 191: | Ligne 194: | ||
| <code bash> | <code bash> | ||
| len=${# | len=${# | ||
| - | |||
| </ | </ | ||
| Ligne 205: | Ligne 207: | ||
| ou encore ( C style ) : | ou encore ( C style ) : | ||
| <code bash>for (( i=0; i < ${#tab[@]}; i++ )); do echo ${tab[i]}; done</ | <code bash>for (( i=0; i < ${#tab[@]}; i++ )); do echo ${tab[i]}; done</ | ||
| - | |||
| Ligne 214: | 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' |
| - | 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> | <code bash> | ||
| Ligne 222: | Ligne 223: | ||
| * une ponctuation (pe : ',', | * une ponctuation (pe : ',', | ||
| * un caractère spécial : ($' | * un caractère spécial : ($' | ||
| + | |||
| ==== Les arguments en ligne de commande ==== | ==== Les arguments en ligne de commande ==== | ||
| Ligne 258: | Ligne 260: | ||
| done | done | ||
| echo "Vous avez réussi !" | echo "Vous avez réussi !" | ||
| + | </ | ||
| + | |||
| + | ==== L' | ||
| + | <code bash>(( variable = 2 + $autre_var * 5 ))</ | ||
| + | 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 " | ||
| + | done | ||
| </ | </ | ||
| Ligne 270: | Ligne 284: | ||
| ^ Syntaxe ^ Fonction réalisée ^ | ^ Syntaxe ^ Fonction réalisée ^ | ||
| - | | -e fichier | + | | -e fichier |
| - | | -d fichier | + | | -d répertoire |
| - | | -f fichier | + | | -f fichier |
| - | | -w fichier | + | | -w fichier |
| - | | -x fichier | + | | -x fichier |
| - | | f1 -nt f2 | + | | f1 -nt f2 |
| - | | f1 -ot f2 | + | | f1 -ot f2 |
| + | <note tip>Si vous préférez vérifier que votre // | ||
| === Opérateurs de comparaison numérique === | === Opérateurs de comparaison numérique === | ||
| Ligne 362: | Ligne 377: | ||
| 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 378: | Ligne 391: | ||
| fi | fi | ||
| </ | </ | ||
| + | <note tip> | ||
| + | Les crochets simples [] correspondent à des tests de condition conformes au shell POSIX.\\ | ||
| + | Les doubles permettent d' | ||
| + | Préférez les crochets simples pour une meilleure compatibilité. | ||
| + | </ | ||
| === Explication === | === Explication === | ||
| Ligne 439: | Ligne 456: | ||
| -n $A # Vérifie si A existe (contient une chaîne). | -n $A # Vérifie si A existe (contient une chaîne). | ||
| </ | </ | ||
| + | |||
| ==== Les structures while et until ==== | ==== Les structures while et until ==== | ||
| Ligne 540: | Ligne 558: | ||
| Et plein d' | Et plein d' | ||
| - | == 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 598: | Ligne 616: | ||
| </ | </ | ||
| - | == Remarque == | + | === Remarque |
| Comme vous l'avez remarqué, l' | Comme vous l'avez remarqué, l' | ||
| Ligne 607: | Ligne 625: | ||
| ==== La structure for ==== | ==== La structure for ==== | ||
| - | L' | + | L' |
| <code bash> | <code bash> | ||
| for variable in valeurs; do | for variable in valeurs; do | ||
| instructions | instructions | ||
| + | done | ||
| + | </ | ||
| + | |||
| + | ou le classique: | ||
| + | <code bash> | ||
| + | for (( i=$min; i<=$max; i++ )); do | ||
| + | instructions_avec_i # ou pas | ||
| done | done | ||
| </ | </ | ||
| Ligne 674: | Ligne 699: | ||
| </ | </ | ||
| | | ||
| - | 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' | + | 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' |
| - | Les fonctions peuvent être définies n' | + | Les fonctions peuvent être définies n' |
| Exemple: un sleep interactif : | Exemple: un sleep interactif : | ||
| Ligne 701: | Ligne 726: | ||
| - | ==== Extraire des sous chaines | + | ==== Extraire des sous-chaînes |
| - | Pour extraire une chaine | + | Pour extraire une chaîne |
| - | <note important> | + | <note important> |
| - | Par exemple pour savoir ce que l'on aime manger en fonction de sa langue (vous êtes alors vraiment ultra geek 8-O !) | + | Par exemple pour savoir ce que l'on aime manger en fonction de sa langue (vous êtes alors vraiment ultra geek 8-O !) : |
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| Ligne 722: | Ligne 747: | ||
| #Noter que $LANG n'a pas le préfixe ' | #Noter que $LANG n'a pas le préfixe ' | ||
| </ | </ | ||
| - | puis | + | puis : |
| - | < | + | < |
| $ ./ | $ ./ | ||
| Vous aimez les moules frites ! | Vous aimez les moules frites ! | ||
| Ligne 733: | Ligne 758: | ||
| :'-( | :'-( | ||
| </ | </ | ||
| - | Ce code illustre un moyen de faire des scripts multilingues | + | Ce code illustre un moyen de faire des scripts multilingues |
| - | Une variante permet de tronquer uniquement le début de la chaine. C'est **${ '' | + | Une variante permet de tronquer uniquement le début de la chaîne. C'est **${ '' |
| - | Le tout peut s' | + | Le tout peut s' |
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| - | #truncbegin <chaine> < | + | #truncbegin <chaîne> < |
| echo ${1:$2} | echo ${1:$2} | ||
| #Noter bien que echo ${1:2} tronquerait les 2 premiers caractères (et non le nombre indiqué par le 2e paramètre). | #Noter bien que echo ${1:2} tronquerait les 2 premiers caractères (et non le nombre indiqué par le 2e paramètre). | ||
| </ | </ | ||
| - | puis | + | puis : |
| - | < | + | < |
| $ ./ | $ ./ | ||
| world ! | world ! | ||
| Ligne 759: | Ligne 784: | ||
| echo -e ' | echo -e ' | ||
| </ | </ | ||
| - | Dans la commande passée ci-dessus, nous pouvons constater qu’il y a 3 paramètres présents, A, B et C. | + | Dans la commande passée ci-dessus, nous pouvons constater qu’il y a 3 paramètres présents: A, B et C.\\ |
| A : correspond à un effet affecté au texte affiché | A : correspond à un effet affecté au texte affiché | ||
| B : correspond à la couleur du texte | B : correspond à la couleur du texte | ||
| Ligne 768: | Ligne 793: | ||
| === Présentation des différentes valeurs Effet === | === Présentation des différentes valeurs Effet === | ||
| - | Nous allons commencer par les différents effets | + | Nous allons commencer par les différents effets |
| ^Code^Effet^ | ^Code^Effet^ | ||
| Ligne 791: | Ligne 816: | ||
| === Présentation des différentes valeurs des couleurs === | === Présentation des différentes valeurs des couleurs === | ||
| - | Maintenant que nous avons présenté les différents effets possibles d’attribuer à du texte, nous allons nous attaquer aux couleurs. Chaque couleur | + | Maintenant que nous avons présenté les différents effets possibles d’attribuer à du texte, nous allons nous attaquer aux couleurs.\\ |
| + | Chaque couleur | ||
| ^Couleur^Couleur texte^Couleur fond^ | ^Couleur^Couleur texte^Couleur fond^ | ||
| |Noir|30|40| | |Noir|30|40| | ||
| Ligne 810: | Ligne 836: | ||
| ===== Exemples et exercices ===== | ===== Exemples et exercices ===== | ||
| - | Comme indiqué dans la [[script_shell# | + | Comme indiqué dans la [[script_shell# |
| - | [[http:// | + | [[https:// |
| - | Aux structures décrites ci-dessus, il est nécessaire, | + | Aux structures décrites ci-dessus, il est nécessaire, |
| - | 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'exemple | + | Vous pourrez trouver une liste de scripts pouvant servir d'exemples |
| - | Une fois vos armes faites, proposez vos contributions sur le topic du forum [[http:// | + | Une fois vos armes faites, proposez vos contributions sur le topic du forum [[https:// |
| ===== L'art d' | ===== L'art d' | ||
| Ligne 828: | Ligne 854: | ||
| * Commencer par : <code bash># | * Commencer par : <code bash># | ||
| # Version du script</ | # Version du script</ | ||
| - | * Créer des fonctions pour des actions précises : | + | * Créer des fonctions pour des actions précises :<code bash> |
| - | <code bash> | + | |
| - | nom_de_la_fonction() | + | |
| { | { | ||
| ... | ... | ||
| - | } | + | }</ |
| - | </ | + | |
| * Utiliser des chemins absolus pour les dossiers et des chemins relatifs pour les noms de fichiers : <code bash> | * Utiliser des chemins absolus pour les dossiers et des chemins relatifs pour les noms de fichiers : <code bash> | ||
| * Utiliser les entrées de commandes pour les fonctions :<code bash> | * Utiliser les entrées de commandes pour les fonctions :<code bash> | ||
| Ligne 854: | Ligne 877: | ||
| exit 100 | exit 100 | ||
| fi | fi | ||
| - | }</ | + | }</ |
| <note tip> | <note tip> | ||
| Ligne 872: | Ligne 895: | ||
| ===== Liens ===== | ===== Liens ===== | ||
| - | * (fr) http:// | + | * (fr) https:// |
| - | * (fr) [[http:// | + | * (fr) [[https:// |
| * (fr) https:// | * (fr) https:// | ||
| * (en) [[http:// | * (en) [[http:// | ||
| * (fr ) [[ftp:// | * (fr ) [[ftp:// | ||
| - | * (fr ) [[http:// | + | * (fr ) [[http:// |
| * (en) [[https:// | * (en) [[https:// | ||
| + | |||
| ---- | ---- | ||
| + | |||
| // | // | ||
| + | |||
