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 →
Ceci est une ancienne révision du document !
- Pour choisir, voir les autres Tags possibles dans l'Atelier.
Nota :
Contributeurs, les sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
Ré-requis indispensables :
Vous savez donc ce qu'est le shell, un alias et un script.
Mais quel rapport entre la diversité des shell (ou interpréteur de commandes) qui existent (sh ; bsh ; bash ; ksh, etc.) et les scripts ?
C'est que dans l'en-tête du script l'un de ces shell doit être appelé avec le sha-bang:
#!/bin/sh #!/bin/bash #!/bin/perl #!/bin/tcl
Chacune de ces lignes appelle un interpréteur de commandes différent.
POSIX est un standard2).
Appeler bash avec l'option –posix ou insérer set -o posix au début du script fait que bash se conforme au standard posix.
À savoir :
Pour utiliser tcsh, ksh, ash, sh, csh, etc :
http://formation-debian.via.ecp.fr/shell.html
méthode d'installation de ksh
Apprendre le BASH sans devenir un ultra-bashiste“ : si si c'est possible !
En général, tous les shell acceptent la même syntaxe de base telle que définie par POSIX, mais chacun accepte une syntaxe étendue qui lui est propre (et donc incompatible avec les autres shells).
Voici quelques aspects auxquels se référer à chaque fois que vous apprendrez une nouvelle notion relative au shell BASH.
POSIX | À éviter : bashisme |
---|---|
if [ “$toto” = “$titi” ] ; then … | if [ “$toto” == “$titi” ] ; then … |
diff -u fichier.c.orig fichier.c d | diff -u fichier.c{.orig,} |
mkdir /tototiti /tototutu | mkdir /toto{titi,tutu} |
funcname() { … } | function funcname() { … } |
format octal : « \377 » | format hexadécimal : « \xff » |
Pour plus de détails sur chacun de ces points voir : Guide avancé d'écriture des scripts Bash :36.9. Problèmes de portabilité
Il s'agit là plutôt d'un aboutissement, essayons d'acquérir par des exemples très simples, les connaissances de bases qui permettront de comprendre chacun de ces points, ainsi que ce que l'on trouve ici : scripts
Il y a différentes méthodes pour lancer ses scripts, cela dépend, vous l'aurez compris, du répertoire dans lequel sont placés ses scripts.
touch mon-script
Si l'on a exécuté cette commande à l'ouverture de son terminal, le fichier “mon-script” est alors placé dans son répertoire courant.
Et oui une script est un simple fichier texte dont le contenu (une suite de commandes et d'instruction) est exécutable.
À savoir :
chmod u+x mon-script
Voyons maintenant trois méthodes pour exécuter un script
nano mon-script
dans lequel on inscrit :
echo -n "Bonjour les copains"
ATTENTION il faut penser à se déplacer dans le répertoire parent de ce script avant de lancer l'exécution.
bash mon-script
Bonjour les copainsutiliateur@debian:~$
/bin/echo -n "Bonjour les copains"
La commande echo est une commande interne du shell ; la commande /bin/echo est une commande à part.
merci captnfab
Essayez maintenant :
bash --posix mon-script
Bonjour les copainsutilisateur@debian:~$
#!/bin/bash ls /home/utilisateur
./mon-script
À voir : modifier-durablement-la-valeur-de-la-variable-d-environnement-path
Il faut pour cela placer le chemin absolu de son script dans le PATH, c'est-à-dire dans l'un des répertoires /bin, /usr/bin ou /usr/local/bin
Les scripts que l'on crée sont ceux de l'utilisateur, on peut donc ajouter le chemin du répertoire dans lequel on range ses scripts
-en éditant le fichier ~/.bashrc qui est un fichier caché du répertoire courant de l'utilisateur (son HOME);
-et en y ajoutant à la fin la ligne PATH=$PATH”:$HOME/MesScripts“
mkdir MesScripts
nano ~/.bashrc
PATH=$PATH":$HOME/MesScripts"
nano mon-script
##!/bin/bash echo "Coucou tout le monde !"
chmod u+x ~/mon-script
mv ~/mon-script ~/MesScripts/
(Voir exemple ci-dessous : “Un petit script pour lancer un script depuis n'importe où !”)
mon-script
Coucou tout le monde !
echo $PATH #retour: /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/utilisateur/MesScripts
Pas si difficile que ça
Voyons pour finir la méthode qui vérifie la compatibilité de son script avec la norme POSIX :
nano ~/MesScripts/mon-script
#!/bin/bash set -o posix echo -n "Bonjour $USER"
Le prompt vous dira “bonjour” avec l'option -n !
Pas d'inquiétude si vous ne comprenez pas tout ; vous en en serez capable après avoir suivi ce wiki et consulté ses liens. Il faut :
#!/bin/bash set -o posix printf "Un nouveau script $USER ? Son nom : " { read nom ; echo "#!/bin/bash" >> $nom ; chmod u+x $nom ; mv ~/$nom ~/MesScripts ; /usr/bin/gedit ~/MesScripts/$nom ;}
#!/bin/bash set -o posix printf "Un nouveau script $USER ? Son nom : " { read nom ;\ echo "#!/bin/bash" >> $nom ;\ chmod u+x $nom ;\ mv ~/$nom ~/MesScripts ;\ /usr/bin/gedit ~/MesScripts/$nom ;}
(espace avant le ; puis anti-slash accolé au point virgule ; retour à la ligne (espace ou non avant la nouvelle commande.)
Merci à captnfab et LeDub pour cette information !
scriptx
Retour :
Un nouveau script toto ? Son nom :
Lors de l'exécution de ce script, la chaîne que vous entrerez pour répondre à la question, sera le nom d'un nouveau script que vous voulez créer.
Pré-requis : utiliser les structures de contrôle Voir :
#!/bin/bash for i in "$@" do echo "Vous avez donné à la variable 'i' la valeur : $i." if [ "$1" != "coucou" ] ; then echo "Le premier argument doit être 'coucou'." else echo "OK" if [ "$2" != "toi" ] ; then echo "Le deuxième paramètre doit être 'toi'." else echo "MERCI" fi fi done echo " " #pour sauter une ligne echo $@
Ci-dessus, la variable i de la boucle prend tour à tour la valeur des paramètres passé au script depuis le terminal et la structure if teste si la chaîne du paramètre passé au script (valeur de la variable) correspond au motif voulu.
#!/bin/bash set a b c echo "Avec 'shift', on se décale d'un paramètre à chaque boucle." for i in "$@" do i=$1 shift 1 echo "les paramètres sont : $1 :$2 :$3 ." done
Retour:
Avec 'shift', on se décale d'un paramètre à chaque boucle. les paramètres sont : b :c : . les paramètres sont : c : : . les paramètres sont : : : .
À savoir : variables de substitution prédéfinies bash-les-differents-caracteres-speciaux
Les arguments de la commande set seront les valeurs des paramètres que set positionne.
set argument1 [argument2] ...
#!/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
Retour :
lettres a b c il y a trois paramètres et une variable nommée var de valeur "lettres"
Observez:
#!/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"."
Retour :
a b c il y a les paramètres de position : a, b, c Leurs valeurs sont vide: RIEN, RIEN, RIEN.
#!/bin/bash var=lettres set a b c echo $var echo $@ echo " " set gros_pater echo $var echo $1 set -- echo $var echo $1
Retour :
lettres a b c lettres gros_pater lettres
Par exemple : soit le script ci-dessous boucle-set.sh
(passer un argument à ce script depuis le terminal)
#!/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
./boucle-set.sh
Retour :
a b c les paramètres sont : a :b :c . les paramètres sont : b :c : . les paramètres sont : c : : . ~$
PUIS
./boucle-set.sh argument1
retour :
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
même script que ci-dessus mais on dé-commente set - - (on enlève # ligne 5) :
./boucle-set.sh
retour :
~$
et
./boucle-set.sh argument1
retour :
argument1 ~$
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.
#!/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."
Retour :
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.
#!/bin/bash var=lettres set a b c set
Observons les deux dernières lignes du retour :
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0 _=c var=lettres
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.
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.
#!/bin/bash set -o nounset var=a var1= echo $var echo $var1 echo $var3
retour :
a /home/hypathie/MesScripts/scriess: ligne8: var3 : variable sans liaison
Voir le tableau des options ici: http://abs.traduc.org/abs-5.3-fr/ch30.html#optionsref
Voir : shell bash : les tableaux
#!/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
Avec tableau :
#!/bin/bash tableau=([1]=a [2]=b [3]=c) for var in "${!tableau[@]}" ; do echo "$var : ${tableau[$var]}" done
Le script d'enikar :
set a b c n=1 for v in $@ ; do echo "$n: $v" let $[ n += 1 ] done
Merci à enikar pour cette réflexion sur IRC
#!/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
Le shell bash permet plusieurs syntaxes pour définir une fonction.
Il faut utiliser le mot réservé function :
function nom-de-la-fonction { suite-de-commande } nom-de-la-fonction
#!/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
#!/bin/bash function f { echo "coucou" ;} f # retour : coucou
#!/bin/bash function f { echo hello } f # retour : Hello
#!/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
Retour
/home/hypathie/MesScripts/script.fct hypathie chez debian facile 3 chez debian facile chez debian facile
Cette commande permet de décaler la numérotation des paramètres de position de la fonction
#!/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
retour
nom complet : /home/hypathie/MesScripts/minipoesie hypathie chez debian facile chez debian facile chez debian facile facile facile facile
Et voilà, vous devriez maintenant être capable de tout comprendre de l'exemple de ces liens: