Shell
Shell
Shell
Principales commandes
Principe dexcution
Principe gnral dexcution : le shell
1)
2)
3)
4)
5)
Grammaire
Grammaire
Une ligne de commande est :
simple si elle ne comporte aucun oprateur de
contrle ;
compose dans le cas contraire.
Priorits des oprateurs de contrle :
Priorits gales (*)
() {}
|
&& ||
;&
;;
Priorits croissantes
(priment sur les
priorits horizontales)
Grammaire
Un exemple : traitement de la ligne de commande
test -d
/sw 2>/dev/null
<tab> && cat
$FIC | wc -l || echo "/sw inexistant"
Grammaire
Etape 4 : arbre compil :
||
&& echo "/sw inexistant"
test -d /sw
2> /dev/null
cat $FIC
|
wc -l
(commandes simples)
8
Commandes simples
Une commande simple a la forme suivante:
[assign] [com] [args] [redir]
Commandes simples
Evaluation dune commande simple : ce qui se passe (dans
lordre)
1.
2.
3.
4.
10
Commandes simples
Exemple
assign
com
args
redir
> /tmp/log 2>&1
1. Assignations:
Variables
Le
Dveloppement
Cest une technique de rcriture trs puissante durant
laquelle les variables, les noms de fichiers, et certains
caractres sont substitus soit par leur propre valeur, soit
par un traitement sur cette valeur.
Dveloppement de variables
Forme gnrale: ${expression}
Forme
var dfinie
var indfinie
${var} ou $var
Substitue var
Substitue null
${var:-mot}
Substitue var
Substitue mot
${var:+mot}
Substitue mot
Substitue null
${var:?[mot]}
Substitue var
${var:=mot}
Substitue var
13
Dveloppement
Forme
Substitution
${#var}
${var%motif}
${var%%motif}
${var#motif}
${var##motif}
$ var=aaabccc
$ echo $var
aaabccc
$ echo ${va:-mot}
mot
$ echo ${var:-mot}
aaabccc
$ echo ${var:+mot}
mot
$ echo ${va:?test}
va: test
$ echo ${va:?}
va: parameter null or
not set
$ echo ${va:=mot}
mot
$ echo $va
mot
$ echo ${#var}
7
$ echo ${var%e}
aaabccc
$ echo ${var%c}
aaabcc
$ echo ${var%%c}
aaabcc
$ echo ${var%c*}
aaabcc
14
$ echo ${var%%c*}
Dveloppement
Variables spciales (utilisables seulement dans un script) :
Nom
Substitu par
Option courante
0,1,2
Substitu par
15
Dveloppement
Dveloppement arithmtique entire
Forme gnrale: $((expression)) o expression est une expression
arithmtique entire
$ echo $((3+1))
4
$ echo $((3+2*6))
15
$ echo $((3-(1+1)*6))
-9
$ i=2
$ i=$((i+1))
$ echo $i
3
$ echo $((3+(1+1.5)*6))
sh: 3+(1+1.5)*6: missing `)' (error token is ".5)*6")
16
Dveloppement
Dveloppement des noms de fichiers
Tout mot contenant les mtacaractres *, ?, [, et ] est
dvelopp par le shell pour concorder avec un nom de fichier
existant sil en existe un.
Le shell gnre alors autant de chanes quil peut trouver de
correspondances. Sil nen trouve pas, le mot est laiss tel quel.
Le tilde ~ seul, suivi de / ou dun nom de login est toujours
dvelopp, et en premier.
?
[p]
~nom
17
Dveloppement
$ echo ~
/Users/xavier
$ echo $HOME
/Users/xavier
$ ls
cap1.tiff
cap2.tiff
test
$ echo cap?.tiff capi*.tiff
cap1.tiff cap2.tiff capi*.tiff
$ echo *es*
test
$ echo /???
/bin /dev /etc /lib /tmp /usr /var
$ echo /???/??
/bin/cp /bin/dd /bin/df /bin/ed /bin/ln /bin/ls /bin/mv
/bin/ps /bin/rm /bin/sh /dev/fd /etc/rc /var/at
/var/db /var/vm /var/yp
$ echo /???/[a-c]??
/bin/cat /bin/csh /usr/bin
18
Dveloppement
Chanes de caractres
Tous les mots non dlimits par des " et des ' subissent le dveloppement de
variables, arithmtique, et de noms de fichiers
Les chanes encadres par des " ou par des ' sont toujours considres
comme un seul mot
Exemples
$ i=1
$ ls
cap1.tiff
cap2.tiff
test
$ echo $i $((i+1)) cap*
1 2 cap1.tiff cap2.tiff
Dveloppement
Substitution de commandes
Forme gnrale: $(commande) ou `commande`
Le rsultat de commande (sur la sortie standard) est substitu sur la
ligne de commande courante. Les dlimiteurs autres que lespace
(tabulations, retours chariots) sont remplacs par des espaces.
Exemple
$ ls
cap1.tiff
cap2.tiff
test
$ ls | wc -l
3
$ echo Il y a $(ls | wc -l) fichiers
Il y a 3 fichiers
$
20
Redirections
A son lancement, tout processus dispose de trois fichiers
ouverts par le systme :
lentre standard (stdin, de numro 0)
la sortie standard (stdout, de numro 1)
la sortie derreur standard (stderr, de numro 2)
Par dfaut:
les caractres taps par lutilisateur dans le terminal
dexcution alimentent stdin
le terminal est aliment par stdout et stderr
Les redirections servent remplacer le clavier et la sortie
terminal par des fichiers.
$ ls
cap1.tiff
cap2.tiff
test
$ ls > /tmp/toto # redirige stdout vers /tmp/toto
$ ls -l /tmp/toto
-rw-r--r-1 xavier wheel 25 Feb 25 23:24 /tmp/toto
21
Redirections
$ cat /tmp/toto
cap1.tiff
cap2.tiff
test
$ wc -l < /tmp/toto # lit stdin a partir de /tmp/toto
3
[n]> fichier
[n]>> fichier
[n]< fichier
[n1]>&n2
[n1]<&n2
[n]>&-
[n]<> fichier
[n]<<chaine
Commandes composes
Une commande compose est :
-
Listes
Une liste est une suite de commandes, ventuellement
composes (oprateurs &&, ||, ;, &, |), et termine par un
;, une & ou un retour chariot.
Soit C1 et C2 deux commandes simples. Alors:
23
Commandes composes
Les pipelines
Forme gnrale: C1 | C2 o C1 et C2 sont 2 commandes simples
Le pipeline (|) lance C1 et C2 en parallle aprs avoir redirig la sortie standard de C1
vers lentre standard de C2 - donc C2 lit son entre directement dans la sortie de C1
Le pipeline est composable volont (C1 | C2 | ... | Cn lance C1 Cn en // avec
redirection de stdout(Ci) vers stdin(Ci+1) pour tout i)
Exemple
$ ls -1
cap1.tiff
cap2.tiff
test
$ ls -1 | sed "s/tiff/tif/"
cap1.tif
cap2.tif
test
$ ls -1 | sed "s/tiff/tif/" |
sort -r
test
cap2.tif
cap1.tif
$
24
Commandes composes
Excution groupe
Formes gnrales:
{ liste; } pour une excution dans le shell courant
(liste) pour une excution dans un sous-shell
Modifie la priorit danalyse (lexicale) de liste. Pour lexcution dans un
sous-shell, tout se passe comme si liste constituait un processus part
entire (y compris pour les entres/sorties) et toutes les variables
(ordinaires et denvironnement) du shell courant sont prserves.
Illustration
{ c1 && c2; } || c3
si c1 alors
si non c2 alors c3 fsi
sinon
c3
fsi
c1 && { c2 || c3; }
si c1 alors
si non c2 alors
c3
fsi
fsi
25
Commandes composes
Instructions de contrle
Le shell admet les instructions de contrle: if, while, for, break, continue,
case. La smantique est la mme quen langage C.
Syntaxe de if
if liste;
# si le code de retour de liste est zro
then liste
# alors excuter cette liste
[elif liste
then liste ]
[ else liste ]
fi
Exemple
$ if test "$SHELL"
> then echo SHELL="$SHELL"
> else echo "Variable indefinie"
> fi
SHELL=/bin/bash
$
26
Commandes composes
Syntaxe de while
while liste; # tant que code de retour de liste = 0
do liste
# excuter cette liste
done
Exemple:
$ i=0
$ while test $i -le 2
# tant que i <= 2
> do echo i=$i ; i=$((i+1))
> done
i=0
i=1
i=2
$ echo $i
3
$
27
Commandes composes
Syntaxe de for
for variable in mot1 [mot2]; do
liste
# excuter cette liste
done
Exemple:
$ for i in un 2 trois; do
> echo $i
> done
un
2
trois
Sort du nime niveau (ou du courant) ditration soit pour arrter (break)
ou poursuivre (continue) . Idem langage C.
28
Commandes composes
Syntaxe de case
case mot in
motif) liste ;;
esac
Motif peut comporter plusieurs motifs lmentaires spars par des |,
chacun suivant les mmes rgles de dveloppement que pour les noms de
fichiers. Smantique identique celle du langage C, mais break nest pas
ncessaire.
Exemple:
$ case $OSNAME in
> Lin*) echo "motif 1";;
> tux|*nux) echo "motif 2";;
> *) echo "defaut";;
> esac
motif 1
$ case toto in
> Lin*) echo "motif 1";;
> tux|*nux) echo "motif 2";;
> *) echo "defaut";;
> esac
defaut
29
Commandes composes
Les fonctions
Forme gnrale: nomfonc () liste
o nomfonc est un mot et liste une liste (gnralement entre
{}).
Nest commodment utilisable que dans un script.
Aprs dclaration nomfonc est vu comme un nom de
commande, qui peut recevoir des arguments
Les arguments passs sont accessibles par $*, $@, $0, $1,
La fonction peut renvoyer une valeur entire via linstruction
return, rcuprable par lappelant travers la variable $?
Les variables qui ne sont pas dclares local sont en fait
celles du shell, et la fonction les altre (!)
30
Commandes composes
Fonctions (suite)
$
>
>
>
>
>
>
$
$
compte_fic ()
{
local v
test -d "$1" && ls -l "$1" | wc -l && v=0 || v=1
return $v
}
compte_fic /tmp/
3
$ echo "Retour1=$?"
Retour1=0
$ compte_fic /inexistant/
$ echo "Retour2=$?"
Retour2=1
31
Scripts shell
$ ls monscript.sh
-rw-r--r-1 xavier xavier
monscript.sh
$ chmod +x monscript.sh
$ cat monscript.sh
#!/bin/sh
#
32
Scripts shell
compte_fic ()
{
local v
test -d "$1" && ls -l "$1" | wc -l && v=0 || v=1
return $v
}
compte_fic "$1"
if test $? -ge 1
then echo Erreur
fi
$ ./monscript.sh .
7
$ ./monscript.sh /inexsitant
Erreur
$
33
Principales commandes
Principaux utilitaires
34
Commandes internes
Ce sont des commandes propres au shell - elles ne sont ni des
scripts, ni des fichiers binaires, ni des fonctions. Commandes
essentielles:
Nom
Fonction
Exemple
pwd
cd [dir]
Commandes internes
Nom
Fonction
Exemple
read
$ read ligne
Ceci est un test.
echo $ligne
Ceci est un test.
shift [n]
jobs
fg [n]
Ramne le dernier
processus darrire-plan
(ou n ) au premier-plan
xterm
xterm
$ fg 4
xterm (wd: ~/tmp)
36
Commandes externes
Au sens large, comprennent tous les fichiers binaires
accessibles par la variable PATH.
La plupart des utilitaires et commandes systme se
trouvent dans :
/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/X11R6/bin
Accessibles
lors du boot
Accessibles
aprs montage
de usr
Partages
sur rseau
local
Clients
X11
37
Commandes externes
Commandes gnrales
Nom
Description
test ou [
clear
Efface le terminal
id
uname
who
passwd
su
hostname
38
Commandes externes
Manipulation de fichiers
Nom
Description
cp
Copie de fichiers
mv
mkdir
rmdir
ls
find
chmod
chown
mktemp
39
Commandes externes
Commandes sur fichiers texte
Nom
Description
cat
sort
cut
paste
tr
grep
sed
vi, vim, ed
less
40
Commandes externes
Commandes sur processus
Nom
Description
ps
top
kill
renice
41
Commandes externes
Commandes rseau
Nom
Description
ifconfig
netstat
ping
arp
traceroute
nslookup
ypbind