Linux 6: Shell, scripts.

Transcription

Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Linux 6: Shell, scripts.
Pablo Arrighi∗
11.05.04, Avon
∗ [email protected],
IGM, Université de Marne-la-Vallée
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Rappels
Commandes internes du bash
Gestion des variables
Autres
Commandes définies via le bash
Alias
Fonctions
Scripts
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Fichiers, variables
Nous ne parlerons que du bash. Lors des leçons 2, 3 et 5 nous
avons mentionné:
I
les fichiers de configuration du bash: /etc/profile,
.bash profile, .bash login, .profile, .bashrc,
.bash logout, le fichier pointé par la variable BASH ENV.
I
les variables importantes définies dans ces fichiers: PS1,
PATH, HOME, LESS, PRINTER. . .
Ces fichiers configurent le bash, ces variables sont gérées par le
bash.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Raccourcis
Lors des leçons 2 et 3 nous avons mentionné:
I
les touches d’édition de commandes: <Ctrl-U>, <Ctrl-K>,
<Ctrl-Y>;
I
les touches d’invocation des commandes passées: ↑, ↓,
<Ctrl-R>;
I
la touche de complétion de commande et de nom de fichier:
<tab>.
Ces raccourcis sont des fonctionnalités du bash.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Types de commandes
Lors de la leçon 1 nous avons parlé du shell (coquille) comme
interface avec le kernel (noyau). On distingue trois types de
commandes:
I
les commandes externes au shell (qui créent un nouveau
procéssus);
I
les commandes internes au shell (qui sont éxécutées par le
procéssus bash lui-même);
I
les commandes définies via le shell (qui de fait sont une façon
de renommer les précédentes).
Donnés dans l’ordre croissant de priorité à l’éxécution.
Le premier type de commande est décrit dans ce cours au hasard
des chapitres. Les deux autres font l’objet de cette leçon.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
Les variables
Pour toutes ces commandes il faut respecter la syntaxe des noms
de variables:
I
chaı̂ne de caractère alphanumérique;
I
le premier caractère étant alphabétique;
I
le seul caractère non-alphanumérique autorisé est ‘ ’.
Les variables sont:
I
soit internes au processus bash;
I
soit visibles par tous ses fils, on parle alors de variable
d’environnement.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
Les variables
Leur contenu inclut fréquemment des caractères spéciaux:
I
\h nom de l’ordinateur;
I
\u nom de login;
I
\t l’heure courante;
I
\w chemin de répertoire de travail;
I
\W nom du répertoire de travail;
I
\! numéro de la commande courante dans l’historique;
I
\$ # pour l’administrateur, $ sinon.
E.g. PS1=’\u@\h: $PWD \’ correspond à l’invite de commande
clementine@hector:/home/clementine $.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
Visualisation des variables
Afin de visualiser le contenu de ces variables on utilise:
I
set permettant de lister toutes les variables de bash et leurs
valeurs.
I
env ou printenv permettant de lister toutes les variables
d’environnement et leurs valeurs.
I
echo $nomdevar permettant d’afficher la valeur d’une
variable donnée.
E.g. set
HOME=/home/clementine
PATH=/bin:/usr/bin:.
...
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
Déclaration/assignation de variables internes
Afin de créer une variable ou d’assigner à une variable existante on
utilise:
I
declare option nomdevar, ce qui permet de spécifier un
type pour une nouvelle variable;
I
typeset option nomdevar, absolument équivalent;
I
et/ou nomdevar=valeur, tout simplement et directement.
E.g. typeset -a tab
tab=(0 434 56)
tab[0]=13
echo $tab[*] affiche tous les éléments.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
Utilisation des variables
Comme on a pu le voir, $nomdevar désigne le contenu de la
variable. On a aussi:
I
${#nomdevar} la taille de la variable;
I
${#tab[*]} le nombre d’éléments du tableau tab;
I
${nomdevar:-valpardefaut} le contenu de la variable si il
existe, sinon la valeur valpardefaut;
I
${nomdevar:=valpardefaut} idem mais la valeur est en
plus affectée à la variable;
I
. . . et autres astuces.
E.g.
TERM=${ TERM:-VT220 }
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
Export de variables
Afin de promouvoir une variable interne au statut de variable
d’environnement:
I
declare -x nomdevar, s’il s’agit là d’une nouvelle variable;
I
ou export nomdevar, tout simplement.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
Destruction de variables
Afin de détruire une variable:
I
unset nomdevar.
E.g. unset tab
echo $tab[*] donne une erreur.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
echo
Permet d’afficher un texte. On dispose des options suivantes:
I
-n pas de retour à la ligne en fin d’affichage;
I
-e permet l’utilisation de caractères spéciaux.
E.g. echo -e "ceci est un back slash \\".
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
exit
La commande exit provoque l’arrêt du shell, de même que
<Ctrl-d>.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
read
La commande read nomdevar1 nomdevar2 ... demande à
l’utilisateur de saisir des valeurs séparées par des espaces, avant de
les assigner aux variables énumérées.
E.g. echo -n "Nom de fichier: " \; read fichier \;
less $fichier.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Gestion des variables
Autres
type
La commande type nomcmd permet de savoir si nomcmd est une
commande interne au shell ou bien une commande externe.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Les alias
Les alias permettent de définir une nouvelle commande en termes
d’anciennes commandes, mais de façon très primitive: pas d’alias
dans les alias, une seule ligne, pas de paramètres. . . Pour ce faire:
I
alias newcmd="old commands" créé l’alias newcmd pour
symboliser ”old cmds”.
I
sans arguments alias énumère les alias définis à ce jour.
I
unalias newcmd supprime un alias précédemment créé.
E.g. alias ls="echo bonjour"
ls affiche bonjour. Pour défaire cela:
unalias ls.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Les fonctions
Les fonctions permettent de définir une nouvelle commande en
termes d’anciennes commandes, avec plusieurs lignes, des
paramètres etc. Pour ce faire:
I
function nomdefonction { old commands; }
I
ou nomdefonction () {old commands; }
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Leurs paramètres
Les paramètres sont contenus dans les variables spéciales $1, $2,
. . . $9. De plus:
I
$# donne le nombre de paramètres;
I
$* donne la liste des paramètres.
E.g. print () { echo $1 ; }
Le même méchanisme s’applique aussi scripts.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Le shell comme un langage
Pour résumer le jeu d’instruction mis à disposition par le bash,
inclut donc:
I
l’invocation des commandes externes et donc de tout
programme éxécutable, avec passage de parmètres;
I
toutes les commandes internes d’appel au système Linux, de
gestion des variables, d’entrée-sortie. . .
I
. . . mais encore des instructions conditionnelles et itératives.
Ces dernières, combinées avec la possibilités de sauvegarder des
instructions successives dans des fichiers éxécutables baptisés
scripts, finissent de nous fournir un véritable language de
programmation.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Invocation des scripts
Pour qu’un fichier soit considéré comme un script et soit éxécuté,
on doit:
I
Utiliser la commande bash option nomdescript arg1
arg2...
I
ou appeler le script directement nomdescript arg1
arg2..., pourvu:
I
que la première ligne du script soit #!/bin/bash;
I
ou que le nom du fichier commence par un point (c’est ce qui
est utilisé pour les fichiers d’initialisation du bash).
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Invocation des scripts
Ne pas oublier de d’autoriser l’éxécution (chmod a+x
nomdescript) du script.
La solution du fichier avec en-tête est préférée. Pour le debugging,
commencer le script par:
set -x
set -v.
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Branches
if commande
then commandes
elif commandes
elif commandes
else commandes
fi
case chaine in
motif1) commandes1 ;;
motif2) commandes2 ;;
... E.g. if [ $ 1=="OK" ]
then echo "ok dude."
else echo "not ok dude".
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Boucles
for variable in chaine1 chaine2...do ...done
for variable in * do ...done
for variable do ...done
while command do ...done
until command do ...done
E.g. mot=""
echo -n "mot de passe: "
read mot
while [ $ mot!=”abracadabra” ]
do
echo ”rate”
read mot
done
Pablo Arrighi∗
Linux 6: Shell, scripts.
Plan
Rappels
Commandes internes du bash
Commandes définies via le bash
Alias
Fonctions
Scripts
Tests
I
mettre l’expression entre crochets [ . . . ] et utiliser == ou !=;
I
ou bien utiliser les commandes de test: -le / -gt / -o. . .
. . . dont la syntaxe est peu commode. D’où l’usage fréquent de
languages de script comme python ou perl.
Pablo Arrighi∗
Linux 6: Shell, scripts.