Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
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 | ||
doc:programmation:shell:scripts [30/09/2013 23:29] captnfab [Scripts Bash] |
doc:programmation:shell:scripts [23/12/2015 19:16] (Version actuelle) milou [Rédaction de scripts Shell] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Rédaction de scripts Shell ====== | ====== Rédaction de scripts Shell ====== | ||
- | ===== Le #! ===== | + | * Objet : Rédaction de scripts Shell |
+ | * Niveau requis : {{tag>avisé}} | ||
+ | * Commentaires : //Faire des choses compliquées avec votre shell.// | ||
+ | * Ce tuto est la suite logique du tuto [[doc:programmation:shell:|sur le shell]]. N'oubliez pas de lire également [[doc:programmation:shell:|sur l'utilisation avancée du shell]]. | ||
+ | * Suivi : {{tag>à-tester}} | ||
+ | * Création par [[user>captnfab]] le 30/09/2013 | ||
+ | * Testé par .... le .... | ||
+ | * Commentaires sur le forum : [[http://debian-facile.org/viewtopic.php?pid=68350 | ici]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | ||
- | ===== Récupération des arguments ===== | ||
- | ===== Boucles et instructions conditionnelles ===== | ||
- | Une instruction conditionnel (souvent appelé //bloc if-then-else// ou //bloc si-alors-sinon// se construit via une condition, et exécute une série de commandes ou une autre suivant le résultat de la condition. | ||
- | ==== Les conditions ==== | + | ===== #! et exécution ===== |
- | En shell, les conditions s'expriment de la manière suivante : | + | La première ligne d'un script shell doit toujours commencer par ''#!'', suivi ensuite de l'interpréteur de commande à utiliser. |
+ | Si vous n'utilisez pas de commande propres à ''bash'' ou ''zsh'', vous pouvez laisser l'interpréteur de commande par défaut : | ||
+ | <code bash>#!/bin/sh</code> | ||
- | === Sur les fichiers et les dossiers === | + | Si vous voulez pouvoir exécuter votre script, n'oubliez pas de donner les droits correspondant à l'utilisateur devant l'exécuter. |
- | | Condition | Description | Exemple | | + | Par exemple : |
- | | ''[ -e fichier ]'' | //vrai// si ''fichier'' existe | <code bash>[ -e /etc/network/interfaces ]</code> | | + | <code user>chmod a+x monscript.sh</code> |
- | | ''[ -d dossier ]'' | //vrai// si ''dossier'' est un répertoire | <code bash>[ -d /etc/network ]</code> | | + | |
- | | ''[ -f fichier ]'' | //vrai// si ''fichier'' est un fichier régulier | <code bash>[ -f /etc/resolv.conf ]</code> | | + | |
- | | ''[ -L fichier ]'' | //vrai// si ''fichier'' est un lien symbolique | <code bash>[ -L /usr/bin/x-terminal-emulator ]</code> | | + | |
- | | ''[ -r fichier ]'' | //vrai// si fichier est lisible (r) | <code bash>[ -r /bin/bash ]</code> | | + | |
- | | ''[ -w fichier ]'' | //vrai// si fichier est modifiable (w) | <code bash>[ -w /tmp ]</code> | | + | |
- | | ''[ -x fichier ]'' | //vrai// si fichier est exécutable (x) | <code bash>[ -x /sbin/ifconfig ]</code> | | + | |
- | | ''[ f1 -nt f2 ]'' | //vrai// si f1 plus récent que f2 | <code bash>[ /tmp/bla -nt /tmp/bli ]</code> | | + | |
- | | ''[ f1 -ot f2 ]'' | //vrai// si f1 plus ancien que f2 | <code bash>[ /tmp/bla -ot /tmp/bli ]</code> | | + | |
- | === Sur les chaînes de caractères === | + | Ou encore : |
+ | <code root>chmod root:admin monscript.sh</code> | ||
+ | <code root>chmod 750 monscript.sh</code> | ||
- | | Condition | Description | Exemple | | + | Voir ce lien où il est expliqué trois méthodes d'exécution d'un script : [[doc:programmation:shells:bash-les-differents-caracteres-speciaux?&#comment-executer-ses-scripts]] |
- | | ''[ -z chaîne ]'' | //vrai// si ''chaîne'' est vide | <code bash>[ -z "$VAR" ]</code> | | + | ===== Récupération des arguments ===== |
- | | ''[ -n chaîne ]'' | //vrai// si ''chaîne'' est non-vide | <code bash>[ -n "$VAR" ]</code> | | + | |
- | | ''[ c1 = c2 ]'' | //vrai// si les chaînes ''c1'' et ''c2'' sont identiques | <code bash>[ "$ARG1" = "$VAR" ]</code> | | + | |
- | | ''[ c1 != c2 ]'' | //vrai// si les chaînes ''c1'' et ''c2'' sont différentes | <code bash>[ "plouf" != "$VAR" ]</code> | | + | |
- | === Sur les nombres entiers === | + | L'argument 0 est le chemin utilisé pour exécuter le programme. |
- | | Condition | Description | Exemple | | + | Exemple, cela peut-être ''./monscript'' ou ''monscript'' s'il est dans le PATH, ou même ''./un-lien-vers-mon-script'' si vous avec utilisé ''ln''. |
- | | ''[ n1 -eq n2 ]'' | //vrai// si les nombres ''n1'' et ''n2'' sont égaux | <code bash>[ "$num" -eq 42 ]</code> | | + | Il est accessible via la variable ''$0''. |
- | | ''[ n1 -ne n2 ]'' | //vrai// si les nombres ''n1'' et ''n2'' sont inégaux | <code bash>[ "$num" -ne 42 ]</code> | | + | |
- | | ''[ n1 -lt n2 ]'' | //vrai// si les ''n1'' est strictement inférieur à ''n2'' | <code bash>[ "$num" -lt 42 ]</code> | | + | |
- | | ''[ n1 -le n2 ]'' | //vrai// si les ''n1'' est inférieur ou égal à ''n2'' | <code bash>[ "$num" -le 42 ]</code> | | + | |
- | | ''[ n1 -gt n2 ]'' | //vrai// si les ''n1'' est strictement supérieur à ''n2'' | <code bash>[ "$num" -gt 42 ]</code> | | + | |
- | | ''[ n1 -ge n2 ]'' | //vrai// si les ''n1'' est supérieur ou égal à ''n2'' | <code bash>[ "$num" -ge 42 ]</code> | | + | |
- | ==== Instruction conditionnelle ''if'' ==== | + | Le premier argument est ensuite accessible via ''$1'', le deuxième via ''$2'', etc. |
+ | L'ensemble des arguments est accessible via ''$@'' alors que la concaténation de tous les arguments (séparés par des espaces) est accessible via ''$*''.Le nombre d'arguments est accessible via ''$#''.\\ | ||
+ | Voir : [[doc:programmation:shells:bash-les-differents-caracteres-speciaux?&#variables-de-substitution-predefinies-principalement-dans-les-scripts]] | ||
- | Pour exécuter ''commande1'' si ''condition'' est vraie, et ''commande2'' sinon, la syntaxe est la suivante : | + | La commande ''shift'' permet de décaler tous les arguments vers la gauche (''$1'' désigne le second, etc.). |
- | <code user>if condition; | + | Exemple : |
- | then | + | <code bash script>#!/bin/sh |
- | commande1; | + | |
- | else | + | |
- | commande2; | + | |
- | fi</code> | + | |
- | ''condition'' est en fait un programme. On considère que ''condition'' est //vrai// s'il se termine bien et retourne un code de retour ''0'', et //faux// sinon. | + | echo "Commande initiale : $0 $@" |
- | Par exemple, ''/bin/true'' est un programme fournissant une condition toujours vrai : | + | N=0 |
- | <code user>if /bin/true; | + | while [ -n "$1" ]; |
- | then | + | |
- | echo 'Je suis dans le vrai' | + | |
- | else | + | |
- | echo 'Je suis dans le faux' | + | |
- | fi</code> | + | |
- | <code>Je suis dans le vrai.</code> | + | |
- | + | ||
- | D'autres exemples utilisant les conditions prédéfinies : | + | |
- | + | ||
- | Cette commande vérifie s'il existe un fichier ''/bin/echo'' qui soit exécutable. Si c'est le cas, il l'utilise pour afficher « Bonjour le monde. », sinon il utilise la commande ''echo'' intégrée au shell. | + | |
- | <code user>if [ -e /bin/echo ] && [ -x /bin/echo ]; | + | |
- | then | + | |
- | /bin/echo 'Bonjour le monde.' | + | |
- | else | + | |
- | echo 'Bonjour le monde.' | + | |
- | fi</code> | + | |
- | + | ||
- | + | ||
- | <code user>if [ "$USER" = "smolski" ]; | + | |
- | then | + | |
- | echo 'Salut chef !' | + | |
- | else | + | |
- | echo "Bonjour $USER." | + | |
- | fi</code> | + | |
- | + | ||
- | ==== Boucle tant que ''while'' ==== | + | |
- | + | ||
- | <code user>while condition; | + | |
do | do | ||
- | commande; | + | N=$(($N+1)) |
+ | echo "Argument $N : $1"; | ||
+ | shift; | ||
done</code> | done</code> | ||
- | Les conditions sont les mêmes que pour la commande ''if''. | + | Pour tout comprendre de cet exemple voir les [[doc:programmation:shell:avancee|Fonctionnalités avancées du Shell]] |
- | + | ainsi que les liens que vous y trouverez. | |
- | ==== Boucle pour tout ''for'' ==== | + | ===== Liens à visiter ===== |
- | + | ||
- | <code user>for i in "les fleurs" "le lapin" "le choux" "la salade" "le staff DF"; | + | |
- | do | + | |
- | echo "J'aime $i." | + | |
- | done</code> | + | |
- | + | ||
- | + | ||
- | ===== Quelques liens ===== | + | |
- | + | ||
- | Des scripts en cascade commentés en anglais. | + | |
- | + | ||
- | La page documentation : | + | |
- | * http://mywiki.wooledge.org/BashGuide | + | |
- | + | ||
- | La page scripts : | + | |
- | * http://mywiki.wooledge.org/BashFAQ/ | + | |
- | + | ||
- | //Merci //**cthuluh** ! :-) | + | |
- | + | ||
- | ===== Références ===== | + | |
- | + | ||
- | [[http://abs.traduc.org/abs-fr/|Guide avancé d'écriture des scripts Bash]] | + | |
+ | * [[doc:programmation:scripts | Divers scripts disponibles.]] |