1. UNIX et Scripts

Transcription

1. UNIX et Scripts
EISTI 2000-2001
Département Informatique-SDE
Script UNIX
Edition:
Responsable:
2002-2003
Nacéra Bennacer
1
18/10/02
EISTI 2000-2001
Département Informatique-SDE
Table des matières
1. UNIX et Scripts .................................................................................3
1.1.
Initialisation ................................................................................................... 4
1.2.
Les variables d'environnement.................................................................... 4
1.3.
Les caractères spéciaux du shell ................................................................ 5
1.3.1.
La génération des noms de fichiers .....................................................................5
1.3.2.
Les autres caractères spéciaux ............................................................................5
1.4.
Le passage des paramètres ......................................................................... 6
1.5.
Les entrées sorties ....................................................................................... 6
1.6.
Les structures de contrôle ........................................................................... 6
1.6.1.
La commande test .................................................................................................6
1.6.2.
La commande expr................................................................................................7
1.6.3.
La condition if .......................................................................................................7
1.6.4.
La boucle until.......................................................................................................7
1.6.5.
La boucle while......................................................................................................7
1.6.6.
La condition for.....................................................................................................7
1.6.7.
La condition d'aiguillage case..............................................................................7
1.6.8.
Les directives break et continue ..........................................................................8
1.7.
Les fonctions................................................................................................. 8
1.8.
Les alias......................................................................................................... 8
1.9.
Le job control: jobs, bg, fg, kill .................................................................... 8
2. Les principales commandes UNIX ................................................10
3. Exercices avec corrigé sur le shell
(Mir:/corriges/SYSTEME/SCRIPT) ......................................................13
4. Exercices en complément .............................................................15
2
18/10/02
EISTI 2000-2001
Département Informatique-SDE
1. UNIX et Scripts
Le shell est un langage de programmation interprété autorisant la récursivité; mais c'est avant tout
l'interpréteur standard de UNIX. Lors de l'ouvertue d'une session, appelée login sous UNIX, un
processus shell est crée qui permet à l'utilisateur de dialoguer avec le système. Trois types de
commandes sont exécutées par le shell:
•
•
•
Les commandes externes qui sont contenues dans des répertoires définis dans la variable
d'environnement PATH. Dans ce cas l'exécution de la commande est réalisé par un processus
dédié créé par le processus shell.
Les commandes internes qui font partie du shell dont l'exécution ne nécessite pas la création
de nouveaux processus. Ces commandes peuvent être scindées en deux:
- Les commandes d'usage fréquent: cd, pwd, umask, set, …
- Les commandes composées de directives algorithmiques: if, then, else, while, case, for,
…
Les commandes définies par une fonction ou un alias
(*) Priorité des commandes de même nom: d'abord les fonctions ensuite les commande internes et enfin les
commandes externes
Le bourne Shell est le premier shell crée et il reste celui dont tout système Unix a besoin pour
lancer les outils de configuration au démarrage de la machine. ksh, bash et zsh sont plus enrichis
mais restent compatibles avec le sh. Le csh et tcsh ont des syntaxes plus différentes de sh et très
proches de celle du langage C. L'important est qu'au moins un shell compatible avec sh existe sur
une machine UNIX.
Bourne Shell
/bin/sh
C Shell
/bin/csh
Toronto C
Shell /bin/tcsh
Korn Shell
/bin/ksh
Bourne Again
Shell /bin/bash
Z Shell
/bin/zsh
3
18/10/02
EISTI 2000-2001
Département Informatique-SDE
1.1. Initialisation
Le shell exécute successivement deux fichiers avant d'afficher son caractère d'invite (par défaut
$): /etc/profile et le fichier .profile (se trouvant dans le répertoire HOME de l'utilisateur). Si la
variable ENV est définie (par un login korn shell) et si son contenu est la référence d'un fichier
existant; ce fichier est exécuté.
Exemple de .profile:
ls()
{
/bin/ls –al $*
}
rm()
{
/bin/rm –i $*
}
logout()
{
exit
}
PS1= PS1="Mir[$LOGNAME]"
set -o vi
alias p='ps -ef |sort |pg'
Export PS1
#fonction ls() redéfinit ls
#fonction rm() redéfinit rm
#fonction logout() redéfinit exit
#commande interne de terminaison d'un shell
#invite du shell
#édition de l’historique en mode vi
#alias redéfinissant ps
#exportation de la variable d'environnement PS1
Il est très utile après une modification de .profile de faire prendre en compte son contenu sans
fermer et réouvrir une session. Ce lancement force l'exécution par le shell courant.
$. .profile
Ce tableau récapitule les différentes façons pour lancer un script shell:
Commande Conditions sur ref
Effet
ksh ref
Fichier lisible
Interprétation par un sous-processus ksh
ref ou ./ref Fichier lisible et exécutable Interprétation par un sous-processus ksh
. ref
Fichier lisible
Interpretation dans le ksh courant
exec ref
Fichier lisible et exécutable Recouvrement du ksh par un ksh non
intéractif interprétant le fichier
Les versions récéntes prennent en compte les premiers caractères de la procédure:
#!/bin/sh ou #!/bin/csh suivant le shell utilisé.
1.2. Les variables d'environnement
Elles sont utilisées par le shell ou le système. Certaines sont initialisées automatiquement et ne
peuvent être modifiées: HOME, LOGNAME ou USER. D'autres sont initialisées
automatiquement et peuvent être modifiées: PATH, TERM, SHELL. D'autres sont initialisées par
l'utilisateur dans le fichier .profile.
L'utilisateur a la possibilité de définir d'autres variables. Ces variables ne se déclarent pas et elles
sont locales au shell. Si on lance un autre shell la variable n'existe plus. La commande set permet
de visualiser toutes les variables d'un shell.
4
18/10/02
EISTI 2000-2001
NomVar=valeur
$NomVar
export NomVar
Département Informatique-SDE
affecte valeur à NomVar
représente le contenu de la variable.
export permet de répercuter une variable sur l'arborescence descendante
(shell fils).
Exemple:
Affectation des variables
$ var1=abc
$ var2="abc*toto"
$ var3=abc*toto
Affichage de variables
$ echo $var1 $var2 $var3
abc abc*toto abc*toto
Portée du métacaractère $ : utilisation de {}
$ var=toto
$ echo $vartiti
rien
$ echo ${var}titi
tototiti
1.3. Les caractères spéciaux du shell
1.3.1. La génération des noms de fichiers
?
un caractère quelconque
*
une chaîne de caractères (éventuellement vide)
[
début de définition d'un ensemble
[!
début de définition du complément de l'ensemble
]
fin de définition d'un ensemble ou de son complément
marque d'intervalle dans un ensemble
Les caractères . en début de mot ou après un / ou / ne sont pas couverts par les abréviations. Les
expréssions construites à partir des caractères * ? [] sont appelées des expressions régulières.
[af69R]
[A-T]
un caractère de la liste énumérée
un caractère de l'intervalle alphabétique
1.3.2. Les autres caractères spéciaux
#
$
&
;
< > << >> |
``
' '
""
\
()
{}
Introduit un commentaire
Introduit un nom de variable
Termine une commande lancée en arrière plan
Sépare des commandes se trouvant sur une même ligne
Caractères de redirection
Exécute une commande
Délimite une chaîne de caractères où les caractères spéciaux perdent
leur signification sauf lui-même
Délimite une chaîne de caractères où les caractères spéciaux perdent
leur signification sauf \ $ ` "
Déspécilise le caractère qui le suit
Exécuter une commande dans un shell fils
Regroupe des commandes
5
18/10/02
EISTI 2000-2001
Département Informatique-SDE
1.4. Le passage des paramètres
Le shell reçoit les arguments sur la ligne de commande sous la forme de variables $1 $2 $3 ...
$9. $0 est le nom de la commande. La commande interne shift permet de décaler les arguments
d'une position.
p1
$1
shift
p1
p2
$2
p3
$3
p4
$4
p5
$5
p6
$6
p7
$7
p8
$8
p9 p10 p11 p12 p13 p14
$9
p2
$1
p3
$2
p4
$3
p5
$4
p6
$5
p7
$6
p8
$7
p9
$8
p10 p11 p12 p13 p14
$9
Les autres variables du script correspondant à ces paramètres sont :
$#
le nombre de paramètres passés au script
$*
la liste des paramètres passés au script
$$
le PID du processus exécutant la commande
$!
le PID du dernier processus asynchrone
$?
le dernier status
1.5. Les entrées sorties
La commande read comme la commande echo peut recevoir pluseiurs arguments séparés par des
espaces ou tabulations.
1.6. Les structures de contrôle
1.6.1. La commande test
test expression ou [ expression ]
Cette commande renvoie un code de retour égal à 0 si l'expression est vraie et une valeur
différente de 0 dans cas contraire.
[ -a fichier ] existence du fichier
[ -s fichier ] existence du fichier + taille non nulle
[ -d fichier ] existence + état de répertoire
[ -f fichier ] existence + état de fichier
[ -r fichier ] existence + autorisation de lecture
[ -w fichier ] existence + autorisation d'écriture
[ -x fichier ] existence + autorisation d'exécution
[ -n chaîne ] chaîne non nulle
[ -z chaîne ] chaîne nulle
Les chaînes de caractères
[ $var = chaîne ]
égalité
[ $var != chaîne ] différence
Les expressions numériques
[ $var = valeur ]
6
18/10/02
EISTI 2000-2001
Département Informatique-SDE
[ $var != valeur ]
[ $var -opérateur valeur ]
opérateurs possibles :
-lt
<
-le
≤
-gt
>
-ge
≥
1.6.2. La commande expr
Pour évaluer une expression numérique contenant une variable, il faut utiliser la commande expr
. Les opérateurs autorisés sont + - * / %.
exemple :
remarque :
[ `expr $var + 1` -gt 5 ]
a= `expr $var + 1`
expr $var : '.*' renvoie le nombre de caractères de var
1.6.3. La condition if
if expression
then
commandes
else
commandes
fi
1.6.4. La boucle until
until expression
do
commandes
done
1.6.5. La boucle while
while expression
do
commandes
done
1.6.6. La condition for
for variable in liste de valeurs
do
commandes
done
1.6.7. La condition d'aiguillage case
case variable in
cas1)
commandes;;
cas2 | cas3) commandes;;
…
Casn)
commandes;;
esac
7
18/10/02
EISTI 2000-2001
Département Informatique-SDE
Les cas sont conformes à la syntaxe d'expressions régulières
1.6.8. Les directives break et continue
Ces deux directives peuvent être utilisées à l’intérieur des boucles for, while et until. Elles
peuvent être suivies d’un nombre qui correspond au nombre de niveaux d’imbrication pour lequel
les directives sont appliqués.
1.7. Les fonctions
Il est possible de déclarer une fonction dans le shell intéractif ou à l’intérieur d’un script shell.
Elles peuvent renvoyer un code de retour. A l’aide de la commande interne return. La syntaxe:
Nom_fonction() { liste de commandes }. Exemple:
isfile() {
if [ -f $f ]
then
return 0
else
return 1
fi
}
for i in $*
do
f=$i
if [ isfile ]
then
echo "$i est un fichier"
else
echo "$i n'est pas un fichier"
fi
done
1.8. Les alias
En ksh , on peut renommer une commande:
alias nom=valeur
unalias nom
La commande alias sans arguments liste les alias déclarés. L'option –t liste ceux crées
automatiquement lorsqu’on utilise des commanes externes.
1.9. Le job control: jobs, bg, fg, kill
Ce mécanisme permet aux utilisateurs de ne voir que les processus lancés sous le shell intéractif.
Chaque commande analysée par le shell s'appelle tâche ou job. Il peut s'agir d'un groupe de
processus. Toute tâche possède un numéro. L'avantage d'un tel mécanisme est que la consultation
des tâches peut se faire sans solliciter le noyau (ps est gourmand). De plus le numéro
d'identification est un petit nombre. Le Korn shell permet le contrôle des processus d'une manière
fine.
$ jobs
Cette commande fournit la liste des tâches créées par le shell, sous la forme :
[1] état
tâche1
8
18/10/02
EISTI 2000-2001
Département Informatique-SDE
[2] +
état
tâche2
Le caractère + signale la tâche courante, - la tâche courante précédente.
$kill tâche
Pour tuer le processus, le job peut être désigné de plusieurs façons
%nombre
Le nombre entre crochets
%chaîne
Le job dont le nom commence par chaîne
%?chaîne
Le job dont le nom contient chaîne
%% ou %+ Le job courant
%Le job précédent
$ commande
$ commande &
fg
processus en
avant plan
processus en
arrière plan
fg
bg
Ctrl-z
stop
processus
suspendu
9
18/10/02
EISTI 2000-2001
Département Informatique-SDE
2. Les principales commandes UNIX
Gestion de session, de compte, informations générales:
login
passwd
logname
who [am i]
id [a,u,g]
groups
uname[-a]
tty
stty
clear
date
cal i j
du
quota [-v]
création d'une session de travail
changer le mot de passe
afficher le login de l'utilisateur
liste des utilisateurs connectés à la machine
numéros et les noms d'identification de l'utilisateur et de son groupe
liste des groupes auxquels appartient l'utilisateur
nom de la machine, nom du système d'exploitation
afficher la référence absolue du terminal associé à l'entrée standard
visualiser et modifier la valeur de paramètres de communication entre le système et le terminal
effacer l'ecran du terminal
date du jour et l'heure courante
calendrier du mois i (de 1 à 12) de l'année j (de 1 à 9999)
par défaut le mois de l'année courant
fournit l'espace alloué (en nombre de blocs de 512 octets) aux différents fichiers
indique à l'utilisateur s'il est contrôlé par quotas et dans l'affirmative les valeurs limites
Gestion des processus:
ps [-e, a, d, g, p, t, u]
kill
fournit des informations sur les processus en cours
envoie un signal à un processus
Gestion de fichiers:
pwd
référence du répertoire de travail
cd
changement de répertoire de travail (~, ., ..)
ls [-l,a,i,d]
contenu d'un répertoire ou caratéristiques d'un fichier
cat
contenu d'un fichier
more
contenu par page
touch
modifier les dates de dernier accès en lecture et/ou écriture
cp[-i, r]
copie physique d'un fichier
cp ref_source ref_dest (les deux fichiers référencent un fichier ordinaire)
cp ref_source1 … ref_dest (les sources référencent des fichiers ordinaires et la destination référence un répertoire)
cp –r ref_source1 … ref_dest (si l'un des sources et la destination référencent un répertoire)
ln
création de liens
ln ref_source ref_dest (les deux fichiers référencent un fichier ordinaire)
ln ref_source1 … ref_dest (les sources référencent des fichiers ordinaires et la destination référence un répertoire)
mv
changement d'un nom de lien
mv ref_source ref_dest (les deux fichiers référencent un fichier ordinaire)
mv ref_source1 … ref_dest (les sources référencent des fichiers ordinaires et/ou répertoires et la destination
référence un répertoire)
rm [-r]
suppression de liens
mkdir
création d'un répertoire
rmdir
suppression d'un répertoire
chmod, chown, chgrp modification de caratéristiques d'un nœud
D'autres commandes:
sort
uniq [-c, -u]
paste
tr
compress
uncompress
trier un fichier
comparer des lignes de fichiers et ne conserver qu'un exemplaire de chaque ligne
juxtaposer des lignes correspondantes de deux ou plusieurs fichiers
copie sur la sortie standard les caractères lus sur l'entrée standard après avoir réalisé des
susbstitutions ou des suppressions de caractères définies dans les arguments
compression de fichiers
décompression de fichiers
10
18/10/02
EISTI 2000-2001
find
file
Département Informatique-SDE
rechercher dans un répertoire les fichiers d'un nom, d'un type , d'un user, …
classer le fichier ASCII, binaire, répertoire, source C, …
fc –l[r, n]
fc –s chaîne
liste le contenu du fichier .history.
réexécute la commande la plus récente commençant par chaîne
par défaut de chaîne, la dernière commande est exécutée.
Sous ksh: l'alias r est défini
r p (numéro de la commande ou une chaîne) pour rappeler la commande
Fichiers administration utilisateurs:
Le fichier /etc/passwd a la structure suivante:
nom_login:x:UID:GID:commentaire:chemin_repertoire_login:chemin_shell
Le fichier /etc/group a la structure suivante:
nom_group::GID:liste_autres_utilisateurs_ayant_acces
Opérations sur les contenus de fichiers:
Sélection "verticale"
head [ -n ] fichier
Ecrit sur la sortie standard les n premières lignes du fichier
tail [ -nlcb ] fichier
Ecrit sur la sortie standard les n dernières lignes ou les n derniers caractères ou les n derniers blocs.
grep [-v] pattern fichier
Récupère les lignes du fichier contenant pattern (une expression régulière). L'option -v permet de récupérer les
lignes du fichier ne contenant pas le pattern. ^pattern permet de spécifier une recherche en début de ligne.
pattern$ permet de spécifier une recherche en fin de ligne.
Sélection "horizontale"
cut [ -ddélimiteur -fi,j ] fichier
Récupère les champs i et j séparés par le délimiteur indiqué après -d.
cut [ -ci-j ] fichier
Récupère les caractères i à j de chaque ligne : option -c.
Comptage
wc [ -lwc ] fichier
wc -l
wc -w
wc -c
wc
compte le nombre de lignes
compte le nombre de mots
compte le nombre de caractères
équivalent à wc –l
11
18/10/02
EISTI 2000-2001
Département Informatique-SDE
Exemples récapitulatifs:
Stocker dans le fichier toto tous les login des utilisateurs du système
$ cut -d: -f1 /etc/passwd > toto
Afficher le nombre d'utilisateur du système
$ wc -l /etc/passwd
36 /etc/passwd
ou
$cat /etc/passwd | wc –l
36
Afficher le nombre de groupes gérés par le système
$ cat /etc/group | wc -l
22
Afficher les informations contenues dans /etc/passwd pour l'utilisateur nb
$ grep "^nb:" /etc/passwd
nb:x:522:500:Nacera Bennacer :/homep/profs/nb:/usr/bin/ksh
tester si une chaîne de caractères "nb" est un login ou pas
$ grep "^nb:" /etc/passwd | wc -l
1
Donner les numéros d'identification de l'utilisateur nb et de son groupe
$ grep "^nb:" /etc/passwd | cut -d: -f1,3,4
nb:522:500
Donner le nom du groupe correspondant
$ grep "500" /etc/group | cut -d: -f1
profs
Afficher les caractéristiques des fichiers réguliers (droits d'accès, référence) se trouvant dans le répertoire
courant
ls –l * .* | grep -v ^d | tr –s " " | cut –d " " –f1,7
la commande tr avec l'option –s " " transforme les séquences d'espaces successifs en un seul espace.
12
18/10/02
EISTI 2000-2001
Département Informatique-SDE
3. Exercices avec corrigés sur le shell
(Mir:/corriges/SYSTEME/SCRIPT)
Ecrire un script qui reçoit plusieurs chaînes de caractères et affiche si elles correspondent à
un nom de login ou non.
if [ $# = 0 ]
then
echo "Pas de parametres passés !"
else
for i in $*
do
NBRLIGNES=`grep ^"$i:" /etc/passwd | wc -l `
if [ $NBRLIGNES = 0 ]
then
echo "$i n'est pas un login"
else
echo "$i est un login"
fi
done
fi
Ecrire un script qui affiche pour chaque utilisateur du système le groupe auquel il
appartient.
for LIGNE in `cut -d: -f1,4 /etc/passwd`
do
LOGIN=`echo $LIGNE | cut -d: -f1`
GID=`echo $LIGNE | cut -d: -f2`
GROUPE=`grep ":$GID:" /etc/group | cut -d: -f1`
echo "L\'utilisateur $LOGIN est dans le groupe $GROUPE"
done
Ecrire un script qui propose à l'utilisateur de tester si un nom de login existe déjà et ce, tant
que l'utilisateur le désire. Un login doit comporter au moins 7 caractères.
REPONSE=o
until [ $REPONSE = n ]
do
echo "Entrez un nom :"
read NOM
if [ `expr $NOM : '.*' ` -gt 7 ]
then
echo "Un nom de login a au plus 7 caracteres"
else
if [ `grep ^"$NOM:" /etc/passwd | wc -l` = 0 ]
then
echo "Ce nom n'existe pas"
else
echo "$NOM existe deja"
fi
fi
echo "Recommencer (o/n) ?"
read REPONSE
done
13
18/10/02
EISTI 2000-2001
Département Informatique-SDE
Ecrire un script qui affiche un paramètre sur deux.
while [ $# != 0 ]
do
echo $1
if [ $# -ge 2 ]
then
shift 2
else
shift
fi
done
Ecrire un script qui affiche un paramètre sur n.
echo "Unite ?"
read UNITE
while [ $# != 0 ]
do
echo $1
if [ $# -ge $UNITE ]
then
shift $UNITE
else
shift $#
fi
done
Ecrire un script qui reçoit comme paramètre un nom de fichier et affiche, en fonction de
son extension (.c, .pas) le type du fichier. S'il n'y a pas d'extension, il le signale. Pour les
autres extensions, il indique qu'il ne la connaît pas.
case $1 in
*.c) echo "Fichier C";;
*.pas) echo "Fichier pascal";;
*.*) echo "Extension inconnue";;
*) echo "Pas d'extension";;
esac
14
18/10/02
EISTI 2000-2001
Département Informatique-SDE
4. Exercices en complément
Q1) En ligne de commande on lance les commandes suivantes. Compléter le ?.
A=5
B= "$HOME est mon repertoire prive"
C=`pwd`
echo $A
echo $B
echo $C
?
?
?
ksh
export B
cd ~/SYSTEME
echo $A
ksh
echo $C
?
echo $B
?
exit
?
echo $A
?
Q2) Soit le programme suivant, dont l'exécutable est nommé a.out :
#include<stdio.h>
void main()
{
int x;
printf("Donnez un nombre\n");
scanf("%d", &x);
printf("Donnez un nombre %d\n", x);
}
Que se passe-t-il au lancement de ce programme comme suit. Expliquer.
a.out &
Q3)Donner la commande shell permettant de redéfinir la variable d'environnement correspondant au prompt d'invite
du premier shell; celle-ci doit comporter entre [ ] le nom de la machine: le répertoire courant. Que faut-il faire pour
que cette redéfinition soit toujours prise en compte.
Q4) Définir dans le .profile les alias suivants:
Un alias ll permettant de remplacer ls –l en mode page
Un alias la permettant de remplacer ls –a en mode page
Un alias l permettant de remplacer ls avec les options l et a et p en mode page et en triant selon la taille des fichiers.
Q5) Définir dans le .profile la fonction rm permettant d'avoir une demande de confirmation.
Q6) Définir le script nommé creComOra suivant:
Pour créer des comptes utilisateurs sous ORACLE, il faut lancer sous ORACLE les deux lignes de commande SQL
suivantes:
CREATE USER NomUtilisateur IDENTIFIED BY PasswordUtilisateur;
GRANT CONNECT, RESOURCE TO NomUtilisateur;
Sous ORACLE, on a la possibilité avec l'utilitaire nommé start, de relire un fichier de commandes sql et de les
exécuter. On vous demande de créer le script creComOra qui reçoit un argument (le nom d'un groupe d'utilisateurs)
et qui crée un fichier de commandes SQL permettant plus tard avec l'utilitaire start de créer des comptes ORACLE
des utilisateurs appartenant au groupe passé en argument. Chaque utilisateur ayant comme login et password
ORACLE, le login UNIX. Le fichier de commande aura comme nom, la valeur de l'argument suivi de l'extension sql.
Exemple:
$ creComOra ing2
Cette commande doit donc créer le fichier ing2.sql dont le contenu est un ensemble de commandes SQL permettant
de créer tous les comptes des utilisateurs du groupe ing2.
Q7) Définir le script nommé del suivant:
Ce script réécrit la commande rm. Cette nouvelle commande permet de conserver les fichiers à supprimer dans le
répertoire $HOME/poubelle.
Que faut-il faire pour que l'utilisateur puisse lancer ce script quel que soit le répertoire de travail.
15
18/10/02

Documents pareils