Shells et scripts
Les différents shells.
Le shell est un interprèteur de commande.
-
sh (bourne shell)
Le bourne shell est le plus ancien shell unix, et il est présent
sur la majorité des systèmes Unix.
-
bash (bourne again shell) Bash est une version
étendue du bourne shell et a été créé
sur linux.
-
csh (c-shell) Le c-shell est un shell
écrit en C et est plus convivial que le bourne shell. La syntaxe
de ses scripts est très similaire a celle de C. Il provient de la
distribution de Berkeley et a été écrit par Bill Joy.
-
tcsh ( c-shell ) Le tcsh est une version
plus conviviale au niveau de l'utilisateur du csh.
Nous ne listons ici que les shells les plus repandus. Pour obtenir
une liste de shell installé sur un système unix exécutez
la commande "cat /etc/shells".
Dans le cadre de ce cours, nous n'étudierons que les scripts
du c-shell.
Comment changer de shell
-
Vous pouvez à n'importe quel moment d'une session dans
un shell, partir un autre shell en lançant sa commande et le quitter
en tapant "exit".
Par exemple:
bash% tcsh
tcsh% cd ~bergeret
tcsh% exit
bash%
-
Pour changer votre shell par défaut, vous devez changer le contenu
du fichier .pshrc dans votre compte.
Par exemple, pour utiliser le shell csh par défaut, il faudrait
insérer cette ligne:
-
echo $SHELL pour connaître votre shell par défaut.
Script shell
-
La première ligne du script indique le shell utilisé pour
interprèter le contenu du fichier.
-
#! suivi du shell (ex: #!/bin/tcsh) Indique que le shell
tcsh interprètera le fichier.
-
# avec rien sur la ligne.
Indique que le c-shell interprètera le fichier.
-
Sinon, le Bourne shell interpretera le fichier.
-
Les autres lignes du fichier contiennent des commandes.
-
Le fichier doit posséder la permission "execute". Utiliser la commande
"chmod".
-
Le caractère "#" délimite les commentaires dans un script
shell. Tout ce qui suit le "#" sur une ligne est considéré
comme un commentaire.
Les variables
-
Il existe deux types de variables: les variables d'environnement et les
variables locales.
-
Création d'une variable d'environnement
setenv VAR VALEUR
setenv TERM vt100
echo $TERM
-
Création d'une variable locale.
set var = valeur
set nom = "etienne"
echo $nom
-
Pour accéder à une variable: $nom ou ${nom}.
-
En c-shell on peut créer des listes.
-
On peut accéder aux éléments d'une liste à
l'aide de l'opérateur [].
-
On peut connaître le nombre d'éléments de la liste
à l'aide de la syntaxe $#liste.
-
création et accès à une liste:
set tab = ( voici ma liste )
echo $tab
#Imprime: "voici ma liste"
echo $tab[2] #Imprime: "ma"
echo $tab[1-2] #Imprime "voici ma"
echo $#tab #Imprime:
3
-
Ajout d'élément à une liste
set tab ( $tab nouveau )
-
Pour obtenir la liste des variables locales utilisez la commande "set"
sans paramètres.
-
Pour obtenir la liste des variables d'environnement utilisez la commande
"setenv" sans paramètres.
-
Variables spéciales
-
$1...$9 $n se réfère au n'ieme paramètre
de la ligne de commande.
-
$0 se
réfère au nom du script.
-
$*
liste des paramètres de la ligne de commande.
-
$# le
nombre de paramètres
-
$? (ou $status) valeur de sortie de la dernière commande.
-
$$
identification du processus du shell.
-
$<
Lecture d'une ligne provenant du "stdin".
-
$?Var : Test l'existance de la variable Var.
-
Accès à des potions de nom de fichiers:
-
set Nom=/usr/include/stdio.h
-
echo $Nom # Imprime: "/usr/include/stdio.h"
-
echo $Nom:h # Imprime: "/usr/include"
-
echo $Nom:t # Imprime: "stdio.h"
-
echo $Nom:r # Imprime: "/usr/include/stdio"
-
echo $Nom:e # Imprime: "h"
-
echo $Nom:t:r # Imprime: "stdio"
Opérations arithmétiques sur les
variables
-
Pour effectuer des opérations arithmétiques en c-shell il
faut utiliser l'opérateur @.
-
@ var = <opération comme en C>
@ a = 3 + 4
echo $a
# imprime 7
@ a++
echo $a
#imprime 8
(voir Exemple 1)
Test sur les chaînes de caractères
-
str1 == str2 Retourne "true" si "str1" est identique
a "str2" .
-
str1 != str2 Retourne "true" si "str1" n'est pas identique
a "str2".
-
str1 =~ str2 Comme l'opérateur "==", mais str2 peut
contenir des "wildcards".
-
str1 !~ str2 Comme l'opérateur "!-", mais str2
peut contenir des "wildcards".
Test sur les fichiers
-
-r Le shell possède le droit de lecture.
-
-w Le shell possède le droit d'écriture.
-
-x Le shell possède le droit d'exécution.
-
-e Le fichier existe.
-
-o Le fichier appartient au même user que celui du processus
shell.
-
-z Le fichier existe et est de taille 0. (Zero)
-
-f Le fichier est un fichier régulier.
-
-d Le fichier est un répertoire.
-
-l Le fichier est un lien.
Test logique
-
&& Effectue un "et" logique.
-
|| Effecture un "ou" logique.
-
! Effectue la négation logique.
Les structures de contrôle
-
if .. then .. else .. endif
-
if (expr) then
commandList
else if (expr) then
commandList
...
else
commandList
endif
-
if (expr) command
-
(voir Exemple 2)
-
foreach .. end
-
foreach var (wordlist)
commandList
end
-
while ... end
-
while (expr)
commandList
end
-
(voir Exemple 3)
-
switch .. case .. endsw
-
switch (string)
case pattern:
commandList
breaksw
...
default:
commandList
breaksw
endsw
-
repeat
-
repeat count command
Exemple: repeat 10 echo "allo"
-
exit(n) Quitte avec le code de retour "n".
Exemple 1
#
echo -n "Entrez un nombre:"
set a = $<
echo -n "Entrez un nombre:"
set b = $<
@ s = $a + $b
@ m = $a * $b
echo "La somme est " $s
echo "Le produit est " $m
Exemple 2
#
foreach file ( * )
if( -f $file ) then
echo "Fichier:" $file
else if( -d $file ) then
echo "Repertoire: " $file
else
echo "Autre:" $file
endif
end
Exemple 3
#
while( ! $?quit )
echo -n "Voulez-vous quitter? (oui/non)"
set reponse = $<
switch ( $reponse )
case oui:
echo "Vous avez
répondu oui\n"
set quit
breaksw
case non:
echo "Vous avez
répondu non\n"
breaksw
case o*:
echo "Je suppose
que vous voulez répondre oui\n"
set quit
breaksw
case n*:
echo "Je suppose
que vous voulez répondre non\n"
breaksw
default:
echo "Je ne
comprends pas votre réponse\n"
breaksw
endsw
end #while