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 Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shells:debuter-avec-les-scripts-shell-bash [03/06/2014 16:25] Hypathie [F ) Déclaration nulle et modification par le script d'une valeur interne ou externe] |
doc:programmation:shells:debuter-avec-les-scripts-shell-bash [04/06/2014 05:47] Hypathie [B) Comment créer et exécuter un script ?] |
||
---|---|---|---|
Ligne 10: | Ligne 10: | ||
* Commentaires sur le forum : [[url | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) FIXME | * Commentaires sur le forum : [[url | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) FIXME | ||
- | **Nota :** | + | **Nota : wiki n°1** |
Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | ||
Ligne 281: | Ligne 281: | ||
/usr/bin/gedit ~/MesScripts/$nom ;} | /usr/bin/gedit ~/MesScripts/$nom ;} | ||
</code> | </code> | ||
- | (espace avant le ; puis anti-slash accolé au point virgule ; retour à la ligne (espace ou non avant la nouvelle commande.) | + | (espace avant le point virgule puis antislash accolé au point virgule puis retour à la ligne (espace ou non avant la nouvelle commande.) |
**Merci à captnfab et LeDub pour cette information !** | **Merci à captnfab et LeDub pour cette information !** | ||
Ligne 300: | Ligne 300: | ||
- | |||
- | |||
- | =====G ) Déclarer des paramètres de position : set===== | ||
- | ==== syntaxe de set==== | ||
- | À savoir : variables de substitution prédéfinies [[atelier:chantier:bash-les-differents-caracteres-speciaux?&#variables-de-substitution-predefinies-principalement-dans-les-scripts]] | ||
- | |||
- | *La commande **set** permet d'affecter une valeur provisoire à un ou plusieurs paramètres de position. | ||
- | Les arguments de la commande set seront les valeurs des paramètres que set positionne.\\ | ||
- | |||
- | <code> | ||
- | set argument1 [argument2] ... | ||
- | </code> | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | var=lettres | ||
- | set a b c #affectation des paramètres a b c | ||
- | echo "$var" "$1" "$2" "$3" | ||
- | if [ $# != 2 ] ; then # (1) | ||
- | echo "il y a trois paramètres et une variable nommée var de valeur \"lettres\" " | ||
- | fi | ||
- | </code> | ||
- | Retour : | ||
- | |||
- | <code> | ||
- | lettres a b c | ||
- | il y a trois paramètres et une variable nommée var de valeur "lettres" | ||
- | </code> | ||
- | **Observez:** | ||
- | * mon-script1 | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | set a b c | ||
- | echo $@ | ||
- | echo "il y a les paramètres de position : $1, $2, $3" | ||
- | echo "Leurs valeurs sont vide: RIEN"$a", RIEN"$b", RIEN"$c"." | ||
- | </code> | ||
- | Retour : | ||
- | <code bash> | ||
- | a b c | ||
- | il y a les paramètres de position : a, b, c | ||
- | Leurs valeurs sont vide: RIEN, RIEN, RIEN. | ||
- | </code> | ||
- | ====set annule les paramètres de position affectés précédemment==== | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | var=lettres | ||
- | set a b c | ||
- | echo $var | ||
- | echo $@ | ||
- | echo " " | ||
- | set gros_pater | ||
- | echo $var | ||
- | echo $1 | ||
- | set -- | ||
- | echo $var | ||
- | echo $1 | ||
- | </code> | ||
- | **Retour :** | ||
- | <code> | ||
- | lettres | ||
- | a b c | ||
- | |||
- | lettres | ||
- | gros_pater | ||
- | lettres | ||
- | |||
- | </code> | ||
- | ====Paramètres de position et boucles==== | ||
- | Par exemple : soit le script ci-dessous boucle-set.sh\\ | ||
- | (passer un argument à ce script depuis le terminal) | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | var=$1 | ||
- | echo $1 | ||
- | set a b c | ||
- | #set -- | ||
- | echo $@ | ||
- | |||
- | for i in "$@" | ||
- | do | ||
- | i=$1 | ||
- | |||
- | echo "les paramètres sont : $1 :$2 :$3 ." | ||
- | shift 1 | ||
- | echo $var | ||
- | done | ||
- | </code> | ||
- | <code user> | ||
- | ./boucle-set.sh | ||
- | </code> | ||
- | Retour : | ||
- | <code user> | ||
- | a b c | ||
- | les paramètres sont : a :b :c . | ||
- | |||
- | les paramètres sont : b :c : . | ||
- | |||
- | les paramètres sont : c : : . | ||
- | |||
- | ~$ | ||
- | </code> | ||
- | PUIS | ||
- | <code user> | ||
- | ./boucle-set.sh argument1 | ||
- | </code> | ||
- | |||
- | retour : | ||
- | <code> | ||
- | argument1 | ||
- | a b c | ||
- | les paramètres sont : a :b :c . | ||
- | argument1 | ||
- | les paramètres sont : b :c : . | ||
- | argument1 | ||
- | les paramètres sont : c : : . | ||
- | argument1 | ||
- | </code> | ||
- | |||
- | ====H ) Supprimer les paramètres de position==== | ||
- | ===Exemple=== | ||
- | **même script que ci-dessus mais on dé-commente set - - (on enlève # ligne 5) :** | ||
- | |||
- | <code user> | ||
- | ./boucle-set.sh | ||
- | </code> | ||
- | |||
- | retour : | ||
- | |||
- | <code> | ||
- | |||
- | ~$ | ||
- | </code> | ||
- | |||
- | et | ||
- | |||
- | <code user> | ||
- | ./boucle-set.sh argument1 | ||
- | </code> | ||
- | |||
- | retour : | ||
- | |||
- | <code> | ||
- | argument1 | ||
- | |||
- | ~$ | ||
- | </code> | ||
- | ====Attention à la commande set : les arguments passés au script sont supprimés==== | ||
- | **Elle supprime toute possibilité de se référer à des paramètres passés au script (depuis le terminal),\\ | ||
- | et ceci y compris si on supprime avec set - - les paramètres de position déclarés avec set.**\\ | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | #donner les argument 1 2 3 à se script avant de le lancer | ||
- | var1=$1 ; var2=$2 ; var3=$3 | ||
- | echo "les valeurs de var1, var2 et var3 sont les paramètres de position : $@." | ||
- | echo " " | ||
- | for i in "$@" | ||
- | do | ||
- | echo "les paramètres de position sont : $1 :$2 :$3 ." | ||
- | shift 1 | ||
- | done | ||
- | |||
- | set a b c | ||
- | set -- | ||
- | for i in "$@" | ||
- | do | ||
- | echo "les paramètres sont : $1 :$2 :$3 ." | ||
- | done | ||
- | echo " " | ||
- | echo "les paramètres de position sont "$@"." | ||
- | echo "les valeurs 1, 2, et 3 sont maintenant les valeurs des variables $var1 ; $var2 ; $var3." | ||
- | </code> | ||
- | |||
- | Retour : | ||
- | |||
- | <code> | ||
- | les valeurs de var1, var2 et var3 sont les paramètres de position : 1 2 3. | ||
- | |||
- | les paramètres de position sont : 1 :2 :3 . | ||
- | les paramètres de position sont : 2 :3 : . | ||
- | les paramètres de position sont : 3 : : . | ||
- | |||
- | les paramètres de position sont . | ||
- | les valeurs 1, 2, et 3 sont maintenant les valeurs des variables 1 ; 2 ; 3. | ||
- | </code> | ||
- | ====remarques sur set ==== | ||
- | <note > | ||
- | *Sans argument la commande set affiche TOUS les noms et TOUTES les valeurs des variables pré-définies (celles du script qui l'appelle aussi). Mais elle n'enregistre pas une valeur d'un valeur non-déclarée ! FIXME\\ | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | var=lettres | ||
- | set a b c | ||
- | set | ||
- | </code> | ||
- | Observons les deux dernières lignes du retour : | ||
- | <code> | ||
- | XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0 | ||
- | _=c | ||
- | var=lettres | ||
- | </code> | ||
- | La première ligne montre en majuscule le nom d'une variable pré-défini, et ce qui suit est la valeur de cette variable. | ||
- | Nous retrouvons la variable var de notre script avec sa valeur "lettres". | ||
- | Mais on ne voit pas les paramètres a b c. | ||
- | *set -o nom-de-l'option ou set -abréviation-de-l'option: permet d'activer les options du shell dans un script.\\ | ||
- | Par exemple, on peut vérifier grâce à un message d'erreur si on appelle la valeur d'un paramètre qui n'a pas été défini. | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | set -o nounset | ||
- | var=a | ||
- | var1= | ||
- | |||
- | echo $var | ||
- | echo $var1 | ||
- | echo $var3 | ||
- | </code> | ||
- | retour : | ||
- | <code> | ||
- | a | ||
- | |||
- | /home/hypathie/MesScripts/scriess: ligne8: var3 : variable sans liaison | ||
- | </code> | ||
- | Voir le tableau des options ici: http://abs.traduc.org/abs-5.3-fr/ch30.html#optionsref | ||
- | </note> | ||
- | =====H) Les tableaux ===== | ||
- | **Voir : [[atelier:chantier:page-man-bash-v-les-tableaux|shell bash : les tableaux]]** | ||
- | |||
- | * **Rappels :** | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | tab=( rouge vert bleu) | ||
- | echo ${tab[1]} | ||
- | echo ${tab[@]} | ||
- | |||
- | tab[1]="orange" | ||
- | echo ${tab[1]} | ||
- | echo ${tab[@]} | ||
- | |||
- | echo $tab # $tab est un équivalment de $tab0 : il affichera le première élément | ||
- | |||
- | echo ${tab[@]} # affiche tous les éléments de même ${tab[*]} | ||
- | echo ${#tab[@]} # pour avoir la longueur (nombres d'éléments dans le tableau): ${tab[@]} -1 | ||
- | (moins un car on commence à zéro! | ||
- | tab[8]="vert" # nlle affectation sur tab[8] | ||
- | echo ${!tab[@]} # ! avoir la liste des indices du tableau | ||
- | echo ${tab[@]} | ||
- | |||
- | for i in ${!tab[*]} ; do | ||
- | echo $i : ${tab[$i]} | ||
- | done | ||
- | </code> | ||
- | |||
- | * ** Comparez :** | ||
- | Avec tableau : | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | tableau=([1]=a [2]=b [3]=c) | ||
- | for var in "${!tableau[@]}" ; do | ||
- | echo "$var : ${tableau[$var]}" | ||
- | done | ||
- | </code> | ||
- | |||
- | Le script d'enikar : | ||
- | |||
- | <code bash> | ||
- | set a b c | ||
- | n=1 | ||
- | for v in $@ ; do | ||
- | echo "$n: $v" | ||
- | let $[ n += 1 ] | ||
- | done | ||
- | </code> | ||
- | **Merci à enikar pour cette réflexion sur IRC** | ||
- | |||
- | * astuce : lister avec numérotation tous les fichiers d'un répertoire : | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | directory=(/*) # tableau composé des chemins de les dossiers et fichiers de la racine | ||
- | |||
- | for i in ${!directory[@]} ; do | ||
- | echo "$i : ${directory[$i]}" # là pour afficher tous les éléments du tableau | ||
- | done | ||
- | </code> | ||
- | |||
- | =====I ) Les fonctions===== | ||
- | |||
- | |||
- | ====1) Définition d'une fonction==== | ||
- | Le shell bash permet plusieurs syntaxes pour définir une fonction.\\ | ||
- | Il faut utiliser le mot réservé **function** : | ||
- | |||
- | *syntaxe 1 : | ||
- | <code> | ||
- | function nom-de-la-fonction | ||
- | { | ||
- | suite-de-commande | ||
- | } | ||
- | nom-de-la-fonction | ||
- | </code> | ||
- | |||
- | <note> | ||
- | *entre les { } c'est le corps de la fonction ; | ||
- | * on y place la ou les commandes exécuter par l'appel de la fonction; | ||
- | * l'appel de la fonction se fait après sa définition; | ||
- | * c'est le fait de mentionner le nom de la fonction qui l'appelle ou permet d'exécuter les commandes du corps de la fonction. | ||
- | </note> | ||
- | *Exemple : | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | function f # on peut ajouter des parenthèse après le nom ; function f() | ||
- | { | ||
- | echo "Bonjour tout le monde" | ||
- | } | ||
- | f # retour : Bonjour tout le monde | ||
- | </code> | ||
- | |||
- | <note> | ||
- | Les mots réservés **function** et **}** doivent être les premiers d'une commande pour qu'ils soient reconnus.\\ Sinon il suffit de mettre **;**avant **}** (avec un espace devant **;**) | ||
- | </note> | ||
- | |||
- | *syntaxe 2 : | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | function f | ||
- | { echo "coucou" ;} | ||
- | f # retour : coucou | ||
- | </code> | ||
- | *syntaxe 3 : proche de c | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | function f { | ||
- | echo hello | ||
- | } | ||
- | f # retour : Hello | ||
- | </code> | ||
- | |||
- | ====2) Les arguments d'une fonction ==== | ||
- | |||
- | *Les appels des arguments d'une fonction sont placés dans le corps de celle-ci\\ | ||
- | *Et les arguments sont placés de gauche à droite et du premier au dernier, à côté du nom d'appel de la fonction\\ | ||
- | *la valeur du premier argument est référencée par $1\\ | ||
- | *la valeur du deuxième argument est référencée per $2, etc.\\ | ||
- | *les paramètres spéciaux $0 (nom programme), $# (nombre de paramètre), $@ (tous les paramètres) , $* (chacun de tous les paramètres), $? (valeur de retour du programme) | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | function f | ||
- | { | ||
- | echo $0 | ||
- | echo $USER | ||
- | echo $1 $2 $3 | ||
- | echo $# | ||
- | echo $@ | ||
- | echo $* | ||
- | } | ||
- | f chez debian facile #chez : premier argument | ||
- | #debian : deuxième argument | ||
- | #facile : troisième argument | ||
- | | ||
- | </code> | ||
- | Retour | ||
- | <code bash> | ||
- | /home/hypathie/MesScripts/script.fct | ||
- | hypathie | ||
- | chez debian facile | ||
- | 3 | ||
- | chez debian facile | ||
- | chez debian facile | ||
- | </code> | ||
- | ==== La commande interne shift ==== | ||
- | Cette commande permet de décaler la numérotation des paramètres de position de la fonction | ||
- | <code> | ||
- | #!/bin/bash | ||
- | function minipoesie | ||
- | { | ||
- | echo "nom complet : $0" | ||
- | echo " " | ||
- | echo "$*" # avant 'shift 1' | ||
- | shift 1 (l'argument 1 est "chez") | ||
- | echo "$*" # après 'shift 1' | ||
- | echo "$*" # avant 'shift 2' | ||
- | shift 2 (l'argument 1 est "debian") | ||
- | echo -e "\t$*" # après 'shift 2' | ||
- | echo -e "\t $*" # avant 'shift 3' | ||
- | shift 3 | ||
- | echo -e "\t $*" # après 'shift 3' | ||
- | } | ||
- | minipoesie hypathie chez debian facile | ||
- | </code> | ||
- | |||
- | retour | ||
- | |||
- | <code> | ||
- | nom complet : /home/hypathie/MesScripts/minipoesie | ||
- | |||
- | hypathie chez debian facile | ||
- | chez debian facile | ||
- | chez debian facile | ||
- | facile | ||
- | facile | ||
- | facile | ||
- | </code> | ||
- | |||
- | Et voilà, vous devriez maintenant être capable de tout comprendre de l'exemple de ces liens: ;-) | ||
- | * [[doc:programmation:shell:scripts#recuperation-des-arguments|Rédaction de scripts Shell : récupération des arguments]] | ||
- | * [[doc:programmation:shell:avancee#les-fonctions|Fonctionnalités avancées du Shell : Les fonctions]] | ||