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 03/08/2022, 21:24] 82.66.138.60 vouvoiment |
tutoriel:script_shell [Le 02/08/2024, 17:13] (Version actuelle) 194.156.203.71 [L'arithmétique] correction attribution variable |
||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
====== 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. |
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
Ligne 39: | Ligne 39: | ||
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 104: | Ligne 104: | ||
* 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 (<=> 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 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 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**. | ||
Ligne 113: | Ligne 113: | ||
===== Les variables ===== | ===== Les variables ===== | ||
Il faut savoir que en bash 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 bash> | <code bash> | ||
Ligne 181: | Ligne 181: | ||
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 215: | 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 266: | 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 694: | 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'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 . | 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 . | ||
Ligne 831: | 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 890: | 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...). | ||