Vous êtes sur la page 1sur 60

Résumé SE_2

1 - Concepts de base

● Structure Linux:
- multi-tâches
- multi-utilisateurs
- multipostes
- Outils logiciels gratuits / libre
- Environnement de développement
● Structure du système Linux :
- Kernel = Noyau :
Gestion des Entrées/Sorties, Ordonnancement des tâches ,Gestion de
la mémoire virtuelle
- Shell : Interprétation des commandes utilisateur
- Application:bibliothèques entre applications

● Séquence de démarrage:
- Démarrage de l’ordinateur ou amorçage
- Exécution du chargeur de démarrage
- Démarrage du noyau
- Lancement du processus init
- Lancement des scripts de démarrage
LINX SGF :
types de fichiers:
● “-” les fichiers ordinaires (ordinary files)
● “d” les répertoires (directories)
● Les fichiers spéciaux (special files ou devices)

Les utilisateurs et les groupes :


● linux est multi-utilisateurs
● chaque utilisateur a un login
● rôle du root :
- administrer la machine /configurer les comptes
● les utilisateurs sont organisés dans des groups :
- s’ils partagent les mêmes fichiers / service / responsibilities
Shell : interface système
● interpréteur de commandes
● interface entre l'utilisateur et le système d’exploitation
● deux modes de fonctionnement :
- interactif
- scripting

● Shell par défaut est précisé dans le fichier de configuration


/etc/passwd
Shell : Prompt
-Lorsqu’un Shell est lancé il affiche une invite de commande (propmt)
- Forme générale de prompt / invite de commande
utilisateur@nom-de-poste:repertoire-courant$
⇒ exemple: [user1@localhost ~]$
-Par défaut, ce prompt se termine par le caractère $ pour un utilisateur
normal et par un # pour le super-utilisateur (exemple: [root@mamachine
bin]# )
● Formattage du prompt: (au niveau de fichier bash_profil)
echo $PS1 : afficher la chaîne de formatage du prompt actuel
PS1='val ' : Modifier la chaîne de formatage(exemple: PS1= '$user1')

-Une fois que nous avons modifié notre fichier .bash_profile et sauvegardé
les modifications, nous devons recharger les configurations Bash en
exécutant la commande: source ~/.bash_profile

-De nombreuses variables existent, en voici la liste:

● “\a” Le caractère qui déclenche le buit "cloche" du terminal


● “\A” L'heure
● “\d” La date au format WW MMM dd
● “\D {format}” Date formaté via strftime(3)
● “\e” Caractère d'échappement
● “\H” Nom d'hôte
● “\h” Nom d'hôte jusqu'au premier "."
● “\j” Nombre de tâches actuellement géré par le shell
● “\l” Nom du terminal actuel (ex : ttys001)
● “\n” Retour à la ligne (CRLF)
● “\r” Retour à la ligne (CR)
● “\s” Nom du shell (bash etc)
● “\T” L'heure au format HH:MM:SS (24h)
● “\t” L'heure au format HH:MM:SS (12h)
● “\@” L'heure au format a.m./p.m.
● “\u” Nom de l'utilisateur courant
● “\v” Version du shell (ex : 2.00)
● “\V” La release of bash avec patch (ex : 2.00.0)
● “\w” Le chemin vers le répertoire courant
● “\W” Le répertoire courant

Exemples:

# nano ~/.bash_profile

# prompt minimaliste --> $

export PS1="$ "

# prompt avec le user --> Buzut$

export PS1="\u$ "

# prompt avec user et dossier courant --> Buzut:/etc$

export PS1="\u:\w$ "

Prompt coloré :

Voici quelques codes de couleurs couramment utilisés pour les séquences


d'échappement ANSI :

Noir : 30

Rouge : 31

Vert : 32

Jaune : 33
Bleu : 34

Magenta : 35

Cyan : 36

Blanc : 37

Gras : \033[1m

Souligné : \033[4m

Clignotant : \033[5m

⇒ exemples :

export PS1="\[\033[38;5;208m\]\u@\h:\w $ \[\033[0m\]"

PS1='${debian_chroot:+($debian_chroot)}(\!)\[\033[01;32m\]\u@\h\[\033[00m\
]:\[\033[01;34m\]\w\[\03 3[00m\]\$\n '

-/etc/shells : fichier qui contient une liste de tous les Shells disponibles

-Pour changer de shell en tapant directement le chemin du shell souhaité par


exemple, pour passer au Bourne shell : /bin/sh ou sh

-Le Shell utilisé peut être connu par la commande ps qui liste les processus
utilisateurs , voici la sortie de la commande ps :

PID TTY TIME CMD

6908 pts/4 00:00:00 bash

6918 pts/4 00:00:00 ps

Environnement du bash

I. Fichiers d'initialisation du shell Bash

1. Shell de connexion (login Shell) : fournir un login et un mot de passe valides

- Le Shell /bin/bash utilise une collection de fichiers de démarrage pour créer un


environnement de travail :

* Chaque fichier a une utilisation spécifique

*Chaque fichier peut affecter différemment la connexion et les


environnements interactifs.
-Pour la configuration d’un Shell de connexion Bash il faut :

*Des fichiers qui affectent les environnements de tous les utilisateurs

*Des fichiers qui affectent uniquement l’environnement de l’utilisateur


connecté

*Les fichiers pour une configuration globale qui affecte les environnements de
tous les utilisateurs.( /etc/profile et /etc/bashrc (/etc/bash.bashrc)

*des fichiers qui affectent uniquement l’environnement de l’utilisateur qui se


connecte au système. (~/.bash_profile (.profile ou .bash_login ) et~/.bashrc) :

-situés dans le répertoire home de cet utilisateur

-sont lus que par les login Shells juste après la connexion

· ~/.bash_logout

-situés dans le répertoire personnel de l’utilisateur connecté

-il est lu et exécuté par le Shell Bash quand l’utilisateur se déconnecte


du système

2. Shell sans connexion (non login shell) : sans login et mot de passe

Exemple : [prompt]$ /bin/bash

· ~/.bashrc et /etc/bashrc : lus et exécutés entres autres

· ~/.bashrc et /etc/bashrc : sont lus et exécutés par les logins


Shells et par les non-login Shells

II. Variables d’environnement

-Un ensemble de paramètres qui composent un environnement

-elles sont dynamiques utilisées par les différents processus d’un système
d’exploitation

-elles servent à communiquer des informations entre programmes qui ne se trouvent


pas sur la même ligne hiérarchique

-Chaque variable d'environnement contient une valeur de type chaîne de caractères

-Variables d'environnement prédéfinies :


· HOME chemin d'accès au répertoire initial (personnel) de
l'utilisateur

· PATH suite de chemins d'accès aux répertoires des


exécutables

· PS1 Variable contenant une chaîne de texte réalisant la mise


en forme du message d ́attente (prompt) en ligne de
commandes. Par exemple [\u@\h \W]\$

· PS2 invite secondaire du Shell en mode programmation

· IFS séparateurs de champ des arguments

· MAIL chemin d'accès à la boîte aux lettres utilisateur

· MAILCHECK intervalle en sec au bout duquel le mail est


contrôlé

· ̈ CDPATH liste de chemins d'accès pour la commande cd

· ENV nom du fichier des variables d'environnement

· TERM nom du type de terminal

· USER / LOGNAME: Nom de login de l'utilisateur.

· SHELL Chemin de l’exécutable du Shell actuellement


utilisé(le contenu sera donc /bin/bash)

· PWD Cette variable contient le répertoire de travail actuel

-le Shell utilise deux environnements différents :

· Son propre environnement, qui contient les variables


locales à la session du Shell en cours

· L’environnement d'exécution, dont les variables


d'environnement sont transmises aux programmes que le
Shell lance

Commandes Shell

Utiliser l’aide

-Aide en ligne: la commande man : qui permet de consulter les pages de manuel de
linux
-Aide interne : est utilisée à travers les options -h et --help

Types de cmds

● Commandes externes au Shell


➔ Dans un fichier programme
➔ fils du processus Shell
➔ Exemples: ls, mkdir, vi, sleep
● Commandes internes au Shell
➔ Programmées dans le Shell ;
➔ Exécutées par le processus Shell lui-même
➔ Exemples de commandes internes : cd , echo , for , pwd
● Commandes définies via le Shell : alias, Renommage de précédentes
● Pour connaître le type d’une commande: $ type commande
● Gestion des fichiers :

ls

ls –l

cd/pwd

mkdir/ rmdir

touch

rm

mv

cp

● Gestion des droits d’accès:

chmod

Umask

● Afficher le contenu d’un fichier

Cat

vi, emacs, gedit, vim

more, less
● Rappel sur les principales commandes:

cat : Concatène et affiche le contenu d'un fichier.

head : Affiche les premières lignes d'un fichier.

tail : Affiche les dernières lignes d'un fichier.

join : Fusionner deux fichiers en utilisant une colonne commune.

paste : Fusionner deux fichiers en collant leurs lignes côte à côte.

cut : Extrait des colonnes spécifiques d'un fichier texte.

grep : Recherche des motifs (mots, phrases ou expressions régulières) dans


un fichier texte.

look : Recherche un mot spécifique dans un dictionnaire trié.

lpr : Envoie un fichier à une imprimante.

more : Affiche un fichier page par page.

pg : Affiche un fichier page par page avec un menu de navigation.

sort : Trie les lignes d'un fichier texte.

tr : remplace ou supprime des caractères dans un fichier texte.

uniq : Supprime les lignes en double d'un fichier texte.

wc : Compte le nombre de lignes, de mots et de caractères dans un fichier


texte.

find : Recherche des fichiers dans une arborescence de répertoires.

sed : Éditeur de flux de texte, qui permet de transformer des fichiers texte(en
utilisant des commandes de substitution et de recherche et remplacement).

awk : Langage de traitement de données et outil de filtrage de texte.

2 - Les redirections
1) Redirection de la sortie standard :
$ echo "Hello Everybody" > fichier1 :

la commande cat fichier1 :


$ echo "Bonjour tout le monde" >> fichier1 :

2) Redirection de l’entrée standard :


$ cat < fichier1

⇒ La différence entre > et >> c’est que lorsqu' on utilise ‘>’ on supprime le contenu
du fichier et on le remplace par « hello everybody » par contre lorsqu’on utilise ‘>>’
on ajoute sur le contenu du fichier bonjour tout le monde.

3) Redirection de la sortie d’erreur :


$ mkdir rep1/dossier/

$ mkdir rep1/dossier/ 2> fichier.err :

$ mkdir rep2/dossier2/ 2>> fichier.err :

La sortie d'erreur :mkdir :impossible de créer le répertoire est envoyée dans le fichier
donné en argument :fichier.err
4) Joindre les deux sorties standards :
$ cat fichier1 > copie_fichier2 2>&1 :
$ cat fichier_inexistant > fichier2 :

$cat fichier_inexistant > fichier2 2>&1 :

$ cat fichier_inexistant2 >> fichier2 2>&1 :

⇒ Copier le texte du fichier fichier_inexistant 2 dans le fichier fichier2, et les erreurs


éventuelles sont aussi mises dans le fichier fichier2 Les erreurs sont affichés sur
l’écran si “2>&1” est placé avant “>”
5) Tubes de communication (pipes) :
Taper les lignes de commandes suivantes :
$ cat fichier1 | grep Hello

$ cat fichier1 | grep tout

$ cat fichier1 | grep tout | wc -l

*"cat fichier1" : cette commande affiche le contenu


du fichier1
* "grep tout" : cette commande filtre les lignes qui
contiennent le mot "tout"
*"wc -l" : cette commande compte le nombre de
lignes sur l'entrée qu'elle reçoit et affiche ce
nombre
6) Les commandes tee et xargs :
Taper les lignes de commandes suivantes :
$ ls
$ ls | tee list.txt
la commande ls donne :
la commande vi …list.txt donne :
⇒ La commande tee est utilisée pour lire l'entrée standard et la rediriger vers la sortie
standard et vers un ou plusieurs fichiers en même temps
$ echo "repertoire1 repertoire2" > list_rep.txt
$ cat list_rep.txt | xargs mkdir la
commande ls donne :

⇒ xargs reads the input from the pipe and converts it into arguments for the mkdir
command.

3 - Commandes Linux
1- Commandes de gestion d’arborescence de fichiers
*syntaxe d’une commande

*Fichiers
ls –l :Le premier caractère de chaque ligne renvoyé par cette commande correspond
au type du fichier
on distingue plusieurs types de fichier:
‘-’: les fichiers ordinaires (ordinary files)
d : les répertoires (directories)
Les fichiers spéciaux (special files ou devices).
l :lien symbolique
p :pipe nommé
s :socket
c :périphérique en mode caractère (clavier)
b :périphérique en mode bloc(disque)

*Nomenclature fichier
Dans Unix/Linux on fait la distinction entre minuscules et majuscules.
Le nom peut contenir le caractère de soulignement "_", le point ".", ou le signe "+".
Exemples de noms de fichier valide:
Budget2000 /Budget2000 /budget.2000 /budget.avril.200 /avril2000+juin2000
*Méta-caractères d’expansion

* :remplace n'importe quelle chaîne de caractères.


micro* : microprocesseur/ micro-ordinateur/ microcosme
? :remplace n'importe quel caractère.
m?cro micro macro …
[...] :établit une coïncidence avec l'un des caractères mis entre crochets.
m[ai]* :mail macro micro mini (m suivit de a ou i)
[.-.] :établit une coïncidence avec tous les caractères compris entre les 2 bornes.
ls [A-Z]*.[hc1-8] :Prog.c Include.h Data.1 Text.6(chaine de caractère qui posséde
l’extention .h ou .c ou.de 1 jusq’au 8)
log.c Include.h prog.1 Text.6 …

*Les répertoires . et ..

Tout répertoire contient deux répertoires particuliers qui ont pour noms . et . .
.:représente le répertoire de travail (répertoire courant),
. .:représente le répertoire parent du répertoire courant.
Pour remonter dans le répertoire parent : cd . .
~ :représente le répertoire d’accueil de l’utilisateur courant.

*Commande de gestion arborescences

La commande ls:
ls: Lister le nom des fichiers du répertoire courant : ls (pour list)
-l : format détaillé
-a : liste aussi les noms de fichiers qui commencent par un "." (qui ne sont pas
normalement listés)
-A : comme l'option -a mais les répertoires "." et ".." ne sont pas affichés
-d : si l'argument est un répertoire, liste seulement son nom (et pas les fichiers qui
sont sous ce répertoire)
-t : trie par date de dernière modification (sinon la liste des fichiers est triée par
défaut par ordre alphabétique), les plus récemment modifiés en premier
-i : affiche au début de la ligne le numéro de i-node des fichiers ¤
-R : listage récursif des sous-répertoires
-g : affiche le groupe du fichier quand elle est associée à l'option "-l"

*Informations associées aux fichiers avec ls


Type du fichier et protection:
-Nombre de liens sur le fichier:
-Le nom du propriétaire :
-Le nom du groupe auquel appartient le propriétaire:

-Taille du fichier en octet :


Date et heure de la dernière modification :

-Nom du fichier :
- cd :permet de Se déplacer dans les répertoires : cd (change directory)
*cd sans arguments retourne dans le répertoire principal (identique à cd ~)
*cd rep pour aller dans le sous répertoire rep
*cd .. Pour remonter dans le répertoire père
-pwd: savoir où on est (print working directory)
-mkdir:créer un répertoire
-rmdir:supprimer un répertoire s’il est vide
-rm -R:supprimer un répertoire non vide
-touch:créer un fichier
touch file1 file2 : crée les 2 fichiers
-cat:consulter un fichier texte (si le texte est court) de même pour (vi, emacs, gedit,
vim)
-less:visualiser un fichier texte page par page et permet de revenir en arrière ou de
rechercher une chaîne.
-more:visualiser un fichier texte page par page
more +20 mypass (permet d’afficher à partir de la ligne 20)
-cp: copier fichiers et répertoires
cp [option] source destination (copie d'un seul fichier, en précisant le chemin
et le nom du fichier destination)
cp [option] rep-source rep-cible (copie l'ensemble des fichiers dans le rép.
spécifié, en gardant les noms)
les options possibles pour la commandes cp:
-rm: remove, supprimer des fichiers
rm [option] fichiers
les options possibles pour la commandes rm :

-mv:déplacer ou renommer
2- Gestion des droits d’accès : Utilisateurs, Groupes, Permissions
*Exemples de commande
-/etc/passwd : un fichier contenant les informations relatives aux utilisateurs
-cat /etc/passwd | grep tichit: permet de rechercher un utilisateur nommé "tichit"
dans le fichier "/etc/passwd".
La commande "grep" est utilisée pour rechercher un motif spécifique (dans ce cas,
"tichit") dans un fichier ou une sortie donnée. La sortie de cette commande sera
toutes les lignes du fichier "/etc/passwd" qui contiennent la chaîne "tichit".

-id: permet de connaître les informations relatives à un utilisateur

-/etc/group : un fichier contenant les informations relatives aux groupes


-su [login] : permet de devenir root ( ou l’utilisateur login )
-ls-l : permet de connaître les droits associé à chaque fichier la liste

*Note:
Sur les distributions Linux récentes, le compte root est parfois désactivé.
Dans ce cas, on se servira de la commande sudo [login] commande, au cas par cas
qui permet de devenir temporairement root ( ou l’utilisateur login ) pour exécuter la
commande.
*Droits d’accès:
Il existe 3 manières pour accéder à un fichier:
¤ Lire son contenu (read)
¤ Modifier son contenu (write)
¤ S’il s’agit d’un fichier ou d’un script, l’exécuter (execute)
3 catégories ou groupements d’accès à un fichier

r : droit lire w: droit d’écrire x: droit d’exécution


-: ce signe à la place de l’un de ces caractères exprime l’interdiction
-chmod mode nom_de_fichier : modifier les droits d’accès à un fichier ( seul le
propriétaire)
*peut modifier les permissions de 2 manières:
1) De manière absolue ou en base 8 ( indépendamment des droits actuels)

Exemple
644 : rw-r–r–
755 : rwxr-xr-x
000 : ---------
711 : rwx–x–x
2) De manière relatives ou symbolique ( en modifiant les permissions courantes)

Exemple à partir du tp:


1) on crée un répertoire repertoire_test_droit, par défaut ce répertoire est à 755
(rwxr-xr-x), quelles sont les commandes (en notation symbolique et en base
8) pour lui donner les droits suivants (on suppose qu'après chaque
commande on remet le répertoire à 755 ) :

● rwx r-x --x


en notation symbolique
chmod o-r repertoire_test_droit
en base 8
chmod 751 repertoire_test_droit
● r-x -w- --x
en notation symbolique
chmod u-w repertoire_test_droit
chmod g-rx+w repertoire_test_droit
chmod o-r repertoire_test_droit
en base 8
chmod 521 repertoire_test_droit
2) La commande umask permet de définir des droits d'accès par défaut pour
l'ensemble des fichiers et des répertoires que vous créez.
exemple:
umask 027
0 pour garder les droits d’accés de l’utilisateur propriétaire.
2 pour retirer le droit d’écriture pour les groupes.
7 pour retirer tous les droits d’accés pour les autres .
3- Commandes et filtres usuels : Filtres, Grep et expressions régulières

Les filtres :
-commande head :

- Sans options la commande affiche un certains nombre de ligne par défaut


- Le nombre de lignes [option –n]
- Le nombre de caractères [option –c] souhaités
⇒ Exemples:
̈ $ head – c 1000 /etc/passwd : affiche les 1000 premiers caractères du
fichier /etc/passwd
̈ $ head –n 10 /etc/passwd : affiche les 10 premières lignes du fichier
-commande tail :

- Sans options la commande affiche un certains nombre de ligne par défaut


- Le nombre de lignes [option –n]
- Le nombre de caractères [option –c] souhaités
- Le nombre de blocs de (512 octets) avec [option –b]
⇒ Exemples:
̈ $ tail – c 1000 /etc/passwd : affiche les 15 derniers caractères du fichiers
/etc/passwd
̈ $ tail –n 5 /etc/passwd : affiche les 5 dernières lignes du fichier
̈ $tail –n +5 /etc/passwd : affiche la fin de /etc/passwd à partir de la 5ème
lignes
-La commande join :

- Concatène les lignes de même numéro de 2 fichiers


exemple :
fichier_1.txt [
1 amal
2 aymen
]
fichier_2.txt [
1 sefi
2 tkaya
]

$ join fichier_1 fichier_2


resultat:
1 amalsefi
2 tkaya

- L’option –d peut être utilisée pour spécifier un délimiteur, par défaut


c’est la tabulation
-La commande cut :
La commande cut permet d'afficher des zones spécifiques d'un fichier.
Exemple :
- cut -c1 /etc/passwd : cette ligne affichera la première colonne du
fichier /etc/passwd.
- c1-5 : Permet de sélectionner les colonnes 1 à 5.
- c14- : Permet de sélectionner de la colonne 14 à la dernière.
- c1-3,14-18 : Permet de spécifier plusieurs plages de colonnes
- cut -d: -f6 /etc/passwd : affichera le 6ème champ du fichier
/etc/passwd, dont le séparateur de champs est le caractère double
point (``:'').
-La commande wc :
Compte le nombre d’octets( bytes), le nombre de caractères blancs
séparant un mot ainsi que les nouvelles lignes dans chaque fichier ou à
partir de l’entrée standard.

⇒ Exemple :
wc fichier.txt
15 109 503 fichier.txt → 15 est le nombre de lignes, 109 est le nombre de
mots et 503 est le nombre de caractères.

La commande uniq : Affiche le contenu du ficher mais et donne un seul exemplaire


des lignes adjacentes qui sont identiques.

- sans option : enlève les lignes successives identiques


- option -c : compte les lignes successives identiques

Exemple :
La commande sort : Effectuer des tri sue les lignes d’un flux donné en
paramètre

options :
-n tri numérique : $ sort -n filename.txt
- nr tri numérique inversé : $ sort -nr filename.txt
-d dictionnaire
-k colonne : k introduit le numéro de colonne de tri: exemple “-k 2” désigne la
seconde colonne : $ sort -k2n filename.txt
-t tabulation
-r tri inversé : $ sort -r inputfile.txt
-c option : This option is used to check if the file given is already sorted or not
-u option : To sort and remove duplicates
-M Option : To sort by month pass the -M option to sort.
-o redirection de la sortie vers un autre fichier

Remarques : deux lignes equivalentes


$ sort inputfile.txt > filename.txt
$sort -o filename.txt inputfile.txt

La commande tr : effectue des remplacements de caractères

Substitution ou suppression de caractères sélectionnés

Exemple :
$cat file1.txt | tr “[A-Z]” “[a-z]” > file2.txt

Substituer les majuscules du fichier file1.txt en minuscules et enregistre le


résultat dans files2.txt

4- Expansions : tilde, accolades, extensions, concaténation et imbrication


Le caractère ~ (tilde)
*"~" représente le répertoire HOME de l'utilisateur. Par exemple, pour l'utilisateur toto
*Copier le fichier "fichier2" du répertoire /tmp dans le répertoire
/home/toto/mesfichiers

*Si le caractère "~" est immédiatement suivi d'un mot, ce dernier est
considéré comme un nom d'utilisateur. Copier le fichier "fichier3" du
répertoire /home/toto vers le répertoire /home/titi

Expansion d'accolades

*Avant que le shell (Bash) n’exécute une commande il vérifie s’il doit
effectuer des substitutions sur la commande:
-Les noms de variables sont remplacés par leurs valeurs
-les alias sont remplacés par les commandes pour lesquelles ils sont raccourcis et
toute expansion est effectuée.

*L’expansion d’accolades est une technique utile pour générer des listes
de chaînes qui peuvent être utilisées dans des scripts et des alias et sur
la ligne de commande Linux.( disponible dans les shells modernes
(bash) , mais elle peut manquer dans certains anciens shells.)

Extensions simples
* Une expansion d’accolade est contenue entre une paire d’accolades { }.
*Il peut s’agir d’une liste d’éléments séparés par des (,) ou d’un spécificateur de
plage.
*Les espaces ne sont pas autorisés à l’intérieur des accolades, sauf si la chaîne
entre guillemets « " »
*Pour une liste séparée par des virgules, le processus d’expansion prend chaque
élément à son tour et le transmet à la commande appelante.
* Les virgules sont ignorées.
*Une liste peut être composée de mots ou de chiffres.
* L’ordre des éléments de la liste est complètement arbitraire.

Une plage d’extension

-Une plage d’extension a un caractère de début et un caractère de fin liés par deux
points .. Sans aucun espace.
-Tous les éléments de liste manquants sont fournis automatiquement par l’expansion
afin que la plage entière du caractère de début au caractère de fin soit créée.

-Il est possible d’utiliser l’expansion d’accolades avec des plages dans des boucles
dans les scripts :

for i in {3..7}
do
echo $i
done

for i in {m..q}
do
echo $i
done

En ligne de commande :

-Deux extensions adjacentes n’agissent pas indépendamment l’une après l’autre.


-Ils interopèrent. Chaque élément de la première expansion est soumis à l’action de
chaque élément de la deuxième expansion.
-Vous pouvez également imbriquer des extensions en créant une liste délimitée par
des virgules des extensions de plage.
Exemple :

Préambule et Postscript
-Vous pouvez placer du texte avant et après une expansion entre accolades pour
que ce texte soit inclus dans les résultats de l’expansion.
- Le texte placé devant une extension s’appelle le préambule, tandis que le texte
placé derrière une extension d’accolades s’appelle le post-scriptum.
Commandes Exemples
-touch file-{1..4}.txt : creation des fichiers file-1.txt,file-2.txt,file-3.txt,file-4.txt
- zip source-code program{.c,.h,.css} : créer une archive zip compressé «
source-code.zip »de tous les fichiers dans le répértoire courant qui correspondent
aux motifs spécifiés (.c,.h,.css).
-cp brace/new/prog-1.c{,.bak} :
-diff brace/{new,old}/prog-1.c :
-mkdir -p {source,build,man,help{/pages,/yelp,/images}} :
-wget https://www.URL-of-yourchoice.com/test{1,2}/picture{001,002}.jpg :

Variables bash et expansion des accolades


-Si dans le cadre d'un script définir d'un côté ma liste de dossiers, et de l'autre côté
d'utiliser cette liste dans une boucle par exemple, comme cela :

-Cela fonctionne avec * mais ne fonctionne pas avec les accolades car l'expansion
de { } ne se fait pas dans le cadre d'une assignation de variable :
-Il est possible de contourner cette limitation. On utilise alors les parenthèses, qui
permettent de forcer l'expansion des accolades, et qui transforment MaListe en
tableau :

Extraits du TP5
1) extraire du fichier.txt les colonnes 3 et 7
$ cut -f 3,7 fichier.txt
2) retrouver des lignes commencant par ab
$ cat fichier.txt | grep^[ab]
3) retrouver chaîne finissant par nologin
$ cat fichier.txt | grep nologin$
4) chaîne s contenant au moins un chiffre
$ cat fichier.txt | grep [0-9]
5) chaîne finissant par un point d'exclamation
$ cat fichier.txt | grep \!$
6) chaîne ne finissant pas par un signe de ponctuation
$ cat fichier.txt | grep ‘[^,;:?\!]\s*$’
7) chaîne dont la seconde lettre est un «r»
$ cat fichier.txt | grep ^.r
8) chaîne commençant par un point
$ cat fichier.txt | grep ^[\.]
9) chaîne ne commençant pas par un chiffre
$ cat fichier.txt | grep ^[^0-9]
10) chaîne contenant un nombre d’au moins trois chiffres et au plus 5 chiffres
$ cat fichier.txt | grep ‘[0-9]\w\{2,4\}’
11) chaîne commençant par une majuscule et se terminant par un point
$ cat fichier.txt | grep ^[A-Z]*\.$
12)chaîne qui se répète deux fois
$ cat fichier.txt | grep ‘./+ /2’
13)Afficher les lignes commençant par des noms de login ne contenant pas de
chiffre
$ cat fichier.txt | grep ‘^[^0-9]\+’
14) Afficher les lignes dont le nom de login commence par la chaine« user»
$ cat fichier.txt | grep ‘^user’
15) Afficher les lignes commençant par des noms de login ne se terminant pas
par un chiffre
$ cat fichier.txt | grep ‘^[^0-9].*[^0-9]$’
16) Afficher les lignes du fichier commençant par des noms de login de 3 ou 4
caractères
$ cat fichier.txt | grep ‘^\w\{3,4\}’
17)Afficher uniquement les champs contenant le login et le home directory
$ cut -d: -f1,6 fichier.txt
18) Extraire les noms de login et UID, redirigerez le tout vers un fichier pw1.
$ cut -d: -f1,3 fichier.txt > pw1
19) Extraire les noms de login, triez dans l’ordre alphabétique inversée et
redirigerez le tout vers un fichier pw2.
$ cut -d: -f1,3 fichier.txt | sort -r > pw2
20) Rediriger dans un fichier « utilisateurs » les noms de login des 10 derniers
utilisateurs à la fin du fichier pw2
$ tail -n 10 pw2 > utilisateur
21) afficher le code ascii de chaque caractère
nano ASCII
22) Ecrire la commande permettant à partir du fichier ASCII et du code ascii
d’afficher le caractère correspondant
$ awk ‘ {printf “%c” , $1}’ ASCII
23) afficher les fichiers du répertoire courant d’extension ‘.txt’
$ ls -l | grep '^-.*\.txt$'
24) extraire les noms des utilisateurs du fichier /etc/passwd grace à la
commande cut et ne garde que les noms commençant par la lettre "A" avec la
commande grep. La sortie de cette commande sera rediriger vers le fichier
“sortie”.
$ cat /etc/passwd | cut -d: -f1 | grep "^A" > sortie
25) commande qui affiche le nombre de fichier caché dans le répertoire courant.
$ ls -a | grep '^\.' | wc -l

4 - Processus et modes d’exécution

Chaque processus est identifié par un numéro unique PID (ProcessIDentificator)

À chaque processus est également associé :

l'identifiant de l'utilisateur pour le compte duquel il s'exécute (UID), qui détermine les droits
du processus

l'identifiant de son processus parent (PPID)


PID =1 du processus init

· UID : le propriétaire

· PID : le numéro du processus

· PPID : le numéro du processus père

· PRI : la priorité du processus

· NI :la valeur de NICE facteur de modification de priorité

· STIME: heure du lancement

· STAT l’état

· TTY le nom du device (terminal) vers lequel il est dirige

· TIME le temps passé dans le cpu ;

- le nom de la commande exécutée (COMMAND)

-Linux est un système multi-tâche : exécution en parallèle de plusieurs tâches

-Linux est un OS préemptif : A tout moment, il peut lancer ou arrêter n’importe quelle
application

La commande ps permet de connaître les processus actifs à un moment donné, associés à un


terminal et lancés par l’utilisateur courant :

· ps –A ou ps –e Processus en exécution

· ps –a processus associé à un terminal

· Ps –a –N avec négation donc non associé à un terminal

· ps –T processus associé à ce terminal

· ps –r processus running

· ps –x processus de l’utilisateur

· ps –He voir avec hiérarchie les processus

· ps –o colonne (colonne cmd, user, pidppidargs …)

· ps –g groupe
Modes de lancement d’un programme :

· Lancement en avant plan

· Lancement en arrière plan (en tâche de fond)

Un processus lancé en tâche de fond est appelé job

Une identification supplémentaire = [numerojob]

Deux méthodes pour lancer un processus en tâche de fond :

· avec le caractère &

· bg %job-id

La commande jobs permet de visualiser la liste des jobs

fg numjob : ramener un job en avant plan

bg numjob : mettre un processus en arrière plan

ctrl+Z : suspendre un processus

Commandes Shell: Code de retour

La variable $?, contient le code de retour de la dernière commande

Une commande qui s’exécute avec succès rend un retour à 0. Exemple : true ; echo$? (true
rend toujours ce code de retour)

Une commande qui échoue rend un retour valorisé à 1 : false ; echo$?

Enchaînement des processus :

Lancement de plusieurs processus depuis une seule ligne de commande;

Exécution Séquentielle: Commande1 ; Commande2 ; Commande3

(“ ;” joue le même rôle que le retour à la ligne)


Exécution Parallèle en tâches de fond: Commande & ; Commande & ; Commande &

Exécution en parallèle avec redirections Commande1 | Commande2 | Commande3


via des tubes:

Ordre d’exécution et parenthèses: ̈ “Le connecteur pipe (|) “ a la priorité sur les connecteurs
d'enchaînement

· On peut utiliser les “’()” pour changer l’ordre d’exécution:

Exemple:

echo B; echo A | sort VS (echo B; echo A) | sort

Divers:

Commande « . » : . filename [arguments] :permet d’exécuter une commande depuis un

fichier FILENAME dans le Shell courant.

On cherchant ce fichier dans les entées fournies dans $PATH.

La commande retourne l’état de la dernière commande exécutée dans FILENAME et échoue


si ce fichier ne peut pas être lu.

Commande « exec »: exec [command [arguments ...]] Remplace le Shell avec la commande
donnée.

Commandes Shell: Mode d’exécution :

Exécution séquentielle: Exemple : cd /tmp ; pwd; echo bonjour; cd ; pwd


séparées par " ; "

Exécution en arrière-plan : Suivie par l’opérateur “&”.


Exécutions conditionnelles Opérateur && : cmd1 && cmd2
de base:
cmd2 n’est exécuté que si cmd1 réussi (code de retour = 0)

Opérateur || : cmd1 || cmd2

cmd2 n’est exécutée que si cmd1 échoue (code de retour


=1).

Le regroupement de commandes : Rediriger la sortie écran de plusieurs commandes vers un


même fichier ou vers un tube ;

Faire exécuter plusieurs commandes dans le même environnement.

Exemple : Seule la sortie standard de ls est redirigée dans le fichier résultat.

$ date ; ls>resultat

mar jan 28 05:16:30 CET 2003

$ catresultat

FIC

fichier

* “( ) “ et “{ } “permettent de regrouper les commandes.

̈*Dans le cas des parenthèses, les commandes sont exécutées à partir d’un shell enfant,

Syntaxe (cmde1 ; cmde2 ; cmde3)

¤ Avec les parenthèses, un shell enfant est systématiquement créé etc’est ce dernier qui traite
la ligne de commande (avec duplications ultérieures si nécessaire).

Exemple : $ (date ; ls) >resultat

$ catresultat

mar jan 28 05:21:36 CET 2003

FIC

Fichier
* dans le cas des “{ }” les commandes sont lancées à partir du shell courant.

* Cela a pour effet de préserver les modifications apportées par la suite de commandes sur
l’environnement du processus courant.

Exemple : $ pwd/home/anissa => répertoire initial

$ { cd /bin ; pwd ; } => changement du répertoire courant

/bin

$ pwd

/bin => répertoire final (le changement a été préservé !)

$$ est le pid (process id) de l'interpréteur shell exécutant votre script

Substitution de commandes;

*Permet de “brancher” la sortie d'une commande dans un autre contexte.

* La sortie des commandes peut être utilisée comme Argument d'une autre commande

Syntaxe:

* La forme classique de la substitution de commande utilise l'apostrophe inverse (`...`).̈* Les


commandes placées à l'intérieur de ces apostrophes inverses génèrent du texte en ligne pour
les autres Commandes.

La nouvelle syntaxe $(...) : à ne pas confondre avec l'évaluation arithmétique

Exemples ; contenu_fichier1=$(cat fichier1); echo $contenu_fichier1 ou

contenu_fichier2=`cat fichier1`; echo $contenu_fichier2

̈ for a in `seq 10` # ou for a in $( seq 10 )Identique à for a in 1 2 3 4 5 ... 10 )

Sous-shells :

* Un sous-shell est un processus lancé par un shell

* Une commande externe dans un script lance un sous-processus alors qu'une commande
interne bash ne le fait pas.

* les commandes intégrées/internes s'exécutent plus rapidement que les commandes externes.
* Les variables utilisées dans un sous shell ne sont pas visibles en dehors .

Elles ne sont pas utilisables par le processus parent, le shell qui a lancé le sous-shell.
(Variables locales);

* Une liste de commandes placées entre parenthèses est exécutée sous forme de sous-shells

Syntaxe:( commande1; commande2; commande3; ... commandeN; )

̈ Exemple: (ls -l; sleep 25 ; pwd; exit)

* La commande exit ne termine que le processus courant dans un sous-shell

*Une commande cd effectuée au sein d'un sous-shell n'a d'impacte que sur celui-ci.

* Il est possible d’exécuter deux sous shells en parallèle en les séparant par un'&' (sans retour
à la ligne) Ou bien en les lançant tous les deux en arrière plan.

Alias :

* Les Alias sont des raccourcis vers des lignes de commandes fréquemment utilisées.

*Affichage des alias : taper simplement la commande alias sans arguments

* Création des alias :$alias nom=chaine

Exemples : $ alias cls=’clear’

$ alias lld=’ls -ld’

$ alias mkdp=’mkdir

* Suppression des alias :$unalias nom.

Déclaration des alias et des fonctions d’une façon permanente

̈ Les alias et les fonctions ainsi définis ne sont pas conservés d'une session à l'autre.

̈Pour qu’ils soient initialisés à chaque ouverture du Shell Bash, on peut les définir :

· Dans le fichier /etc/bashrc : dans ce cas, ils seront définis dans toutes les sessions de tous
les utilisateurs

· Dans le fichier ~/.bashrc qui se chargera au lancement de la session de l’utilisateur


intéressé : dans ce cas, les alias et les fonctions auront une portée restreinte ; ils seront
définis uniquement dans l’environnement de l’utilisateur en question

· Autre possibilité pour les alias: ~/.bash_aliases


TP6 : Manipulation des fichiers

1/ Utiliser la commande ps pour obtenir une liste des processus en cours d'exécution ainsi que
le nomd'utilisateur ayant lancé l’exécution de chacun d’entre eux.
- Puis conduire la sortie vers grep pour n'obtenir que la sortie desprocessus appartenant à
l’utilisateur root.
Indication : Le symbole ^indique à grep de ne chercher que la chaîne root au début de chaque
ligne.

$ psauwx | grep ^root

2/ Imaginer qu'il faut passer ces données à un autre programme ou script qui n'a besoin que
des noms des processus.
Utiliser une combinaison des commandes tr et cut pour produire cette liste.
Indication : tr sera utilisée pour transformer les espaces blancs en un séparateur de champs
pouvant être compris par cut(un % dans ce cas) et, cut est utilisé pour afficher uniquement les
noms de processus(champ11 de la sortie de la commande tr).
$ psauwx | grep ^root | tr -s [:blank:] [%] | cut -d% -f11
3/ la commande ps peut produire une sortie sous différents formats, en particulier elle permet
d’afficher directement la liste des processus exécutés en tant que root sur le système.

$ps –u root –O args

5 - Script Shell ( Partie 1 + 2)


Script Bash :
Un script Shell est un ensemble de commandes dans un fichier.
Un script est un programme écrit dans le langage propre au shell.

Fichier du Script Shell:


Nom_fichier.sh : Bourne Shell et Bourne Again Shell.
Nom_fichier.ksh : Korn Shell.
Nom_fichier.csh : C Shell.

Structure du script :

1)Pour les commentaires : #


2)Chaque Fichier shell contient à l'en tête :
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl

3)Pour l’exécution un fichier shell :


chmod +x nom_fichier.sh

Exécution :
Les instructions par ligne sont possibles séparées par un point-virgule
; : saut de ligne
Exemple:
if [ $# -eq 0];then
ou bien
if [$# -eq ]
then
Les instructions sont liées logiquement par ( && ) et ( || ).
Exemple:

if [ -f “#1” ] && head -n 1 “#1”


ou bien
if [ -f “#1” ] || head -n 1 “#1”

Pour Créer un fichier shell :

1) nano script0.sh ou bien touch script.sh et nano script.sh.


2) écrire le script : le premier ligne(#!/bin/bash).
#!/bin/bash
# script0.sh
echo "Hello Everyone "
echo -n "La date du jour est: " ;
date
echo –n le répertoire courant est ; pwd
echo –n je suis l’utilisateur; whoami
exit
3) ctrl+s et ctrl+x.
4) chmod +x script0.sh
5) ./script0.sh ou s’il ya des paramètres il faut les ajouter .
exemple: ./script0.sh ou bien ./script0.sh rep1 et rep2
Entrées-Sorties :
la sortie standard : par la commande echo.
Exemple : echo "Bonjour à tous ! "
les options:
"-n" : supprime le saut de ligne final.
"-e" : interprète les caractères d'échappement spéciaux: tels que "\n" pour une
nouvelle ligne
ou
"\t" pour une tabulation
"-E" : désactive l'interprétation des caractères d'échappement
"-s" : utilise la sortie silencieuse,c'est-à-dire qu'elle ne montre pas le texte à
l'utilisateur
"-c" : utilise l'interprétation de couleur pour afficher le texte dans une couleur
spécifique
“\r” :retour chariot.
“\v”:tabulation verticale.
“\f:”saut de page.
Exemple :
NB: Avec quote et double quote et sans quotes.
echo Bonjour à tous !
echo Bonjour à tous \!
echo "Bonjour à tous !"
echo 'Bonjour à tous !'

echo -n "le répertoire courant est: ";pwd:position courant


echo -n "je suis l'utilisateur "; whoami:username

echo -e Bonjour \nà tous


echo -e "Bonjour \nà tous"
echo -e 'Bonjour \nà tous'

echo -e "retour arriere"


echo -e "retour \barriere"

echo -e "retour chariot"


echo -e "retour \rchariot"

echo -e "Tabulation horizontale"


echo -e "Tabulation \thorizontale"

echo -e "Tabulation \vverticale"

Entrées-sorties ( commande read )

read : commande de saisie


syntaxe : $ read var1 var2 ...

exemple 1 (première méthode):

exemple 2 (deuxième méthode):

Remarque: vous devez utiliser Apostrophes et non Guillemet si vous voulez utiliser
la deuxième méthode

-n : fixer la longueur maximale de l'entrée de l'utilisateur.

Exemple :
-Dans cet exemple, la longueur maximale du login ne peut dépasser 5 caractères.

-t : limiter le temps autorisé pour saisir un message.

Exemple:

-s : ne pas afficher le texte saisi. Le paramètre -s masque


les caractères lors de la saisie.

Exemple:

les variables

-Le nom d’une variable est sensible à la casse

-Il n'est pas nécessaire d'utiliser des déclarations ou des types spécifiques, car toute
valeur est considérée comme une chaîne de caractères.

-Il existe trois types de variables : les variables définies par l'utilisateur, les variables
définies par le système (variables d'environnement) et les variables spéciales

-Les noms de variables doivent respecter certaines règles, comme commencer par
une lettre et être composés de lettres, de chiffres et de caractères de soulignement.
-Les noms des variables définies par l'utilisateur sont souvent en minuscules pour
les distinguer des variables système.

-Une variable est déclarée dès qu'une valeur lui est affectée à l'aide du signe "="

-La valeur peut être une chaîne de caractères ou une valeur numérique.

-Pour accéder à une variable, on utilise le caractère "$" devant le nom. Lorsque le
Shell rencontre le "$", il interprète le mot suivant comme étant une variable.

-Si la variable existe, alors "$nom_variable" est remplacé par son contenu, ou par un
texte vide dans le cas contraire.

-Une variable peut contenir des caractères spéciaux notamment des espaces. Il faut
dans ce cas soit verrouiller les caractères spéciaux un par un, soit de les mettre
entre guillemets ou apostrophes

différence entre les guillemets et les apostrophes

Les variables locales( Par défaut ):

-Il ne sont définies et disponibles que pour l'instance de bash où elles ont été créées
et ne sont pas accessibles par d'autres programmes.

Variables d’environnement :

-Il sont accessibles par tous les programmes dans le même environnement
utilisateur et sont en majuscules par convention
-Pour rendre une variable locale visible par les scripts et autres sous-shells, elle doit
être exportée avec la commande "export variable".

-Les variables exportées peuvent être modifiées dans le script, mais ces
modifications ne s'appliquent qu'au script ou au sous-shell en question.

-L’argument de la commande export est bien la référence (le nom) de la variable Pas
sa valeur ( Ne pas utiliser le caractère $)

Les variables :Suppression et protection

unset : supprimer une variable.

Syntaxe: unset nom_variable

readonly:protéger une variable en écriture et contre sa suppression.

Syntaxe: readonly nom_variable

(Il n'existe aucun moyen de la remplacer en écriture et de la supprimer, sauf quitter


le shell).

Les variables d’environnement sont des variables dynamiques.Elles affectent le


comportement des programmes et servent à communiquer des informations entre
programmes qui ne se trouvent pas sur la même ligne hiérarchique.Chaque variable
d'environnement contient une valeur de type chaîne de caractères.

la variable d'environnement PATH: Contient la liste des répertoires dans lesquels le


système doit rechercher les programmes à exécuter.

Les variables d'environnement prédéfinies:


HOME chemin d'accès au répertoire initial (personnel) de l'utilisateur

PATH suite de chemins d'accès aux répertoires des exécutables

PS1 invite principalement Shell en mode interpréteur, Variable contenant une chaîne
de texte réalisant la mise en forme du message d’attente (prompt) en ligne de
commandes. Par exemple [\u@\h \W]\$.

PS2 invite secondaire du Shell en mode programmation

IFS séparateurs de champ des arguments

MAIL chemin d'accès à la boîte aux lettres utilisateur

MAILCHECK intervalle en sec au bout duquel le mail est contrôlé.

CDPATH:liste de chemins d'accès pour la commande cd.

ENV: nom du fichier des variables d'environnement.

TERM :nom du type de terminal.

USER: Nom de login de l'utilisateur. Cette information est également disponible au


travers de la variable d'environnement LOGNAME

SHELL:Chemin de l’exécutable du Shell actuellement utilisé. Sous Linux, il s'agit


souvent du Shell BASH (le contenu sera donc /bin/bash)

PWD: Cette variable contient le répertoire de travail actuel

le Shell utilise donc deux environnements différents :

-Son propre environnement, qui contient les variables locales à la session du

Shell en cours

-L’environnement d'exécution, dont les variables d'environnement sont

transmises aux programmes que le Shell lance


Création d’une variable:(Il n'est pas nécessaire de fournir une valeur)

Cette commande permet d'afficher le contenu de la variable VAR:

Création d’une variable d’environnement :

- la commande export : permet de rendre une variable du Shell une variable


d’environnement.

- pour déclarer et exporter une variable en une seule commande, la syntaxe est la
suivante :

- la commande suivante permet de supprimer une variable:

La commande set : permet d'afficher


toutes les variables du Shell ainsi que
leurs contenus respectifs.

La commande env: permet de lister uniquement les variables d’environnement


(exportées) ainsi que leurs contenus respectifs.

La commande printenv: permet d’afficher les noms et les valeurs de toutes les
variables d’environnement.

remarques:

-Pour créer ou modifier une variable d’environnement de manière permanente pour


le Shell Bash, on peut définir cette variable :
- Dans le fichier d'initialisation global du Shell /etc/profile :dans ce cas, la variable
sera définie dans toutes les sessions de tous les utilisateurs

-Dans le fichier ~/.bash_profile qui sera chargé au lancement de la session de


l’utilisateur intéressé : dans ce cas, la variable aura une portée restreinte, elle sera
définie uniquement dans l’environnement de l’utilisateur en question.

-le shell est lancé avec un certain nombre de variables prédéfinies.

-Le contenu de ces variables Système/Environnement peut être modifié mais il faut
alors faire attention car certaines ont une incidence directe sur le comportement du
système

Les variables spéciales


Ces variables sont affectées lors d’un appel de script suivi d’une liste de paramètres
et elles sont accessibles uniquement en lecture.
Les valeurs sont récupérables dans $#,$0,$1…
$?: c’est la valeur de sortie de la dernière commande.Elle vaut 0 si la commande
s’est déroulée sans problème sinon elle vaut une valeur différente de 0 dans le cas
contraire.
$0: Cette variable contient le nom du script
$1 à $9: les premiers arguments passés à l’appel du script (Ils s'appellent aussi des
arguments positionnels)
$#: le nombre d’arguments positionnel passés au script
$*: la liste de tous les paramètres à partir de $1 sous le format “$1 $2 $3 …”
$@: la liste des paramètres sous forme des éléments distincts “$1” “$2” “$3”...
$$: le numéro du PID du processus courant
$!: le numéro du PID du processus fils
Exemple:

La commande shift permet de modifier la structure des paramètres de position.


shift suivi d’une valeur n effectue un décalage de n éléments
Exemple:
Les variables spéciales(set)
La commande set permet de donner des valeurs aux paramètres.
Syntaxe: set val1 val2
⇒ donne des valeurs val1 et val2 aux paramètres $1 et $2
Les expressions arithmétiques
Pour effectuer des calculs sur les entiers,il existe 3 méthodes:
● la commande let
● les parenthèses ((operation))
● la commande expr
La commande let:
Elle évalue les expressions arithmétiques.
Syntaxe: let expression
Exemple:

Faire un calcul arithmétique avec les parenthèses:


Syntaxe: ((expression))
Exemple:

Cette instruction fait le calcul du 1+2 et


attribuera sa valeur aux variables a et b
Voici le résultat de ce bout de code

La commande expr:
Les arguments de la commande expr doivent toujours être séparés par au moins un
espace ou une tabulation.
Exemple:

Lorsqu’on ne met pas d'espace,ça sera interprété comme une chaîne de caractère.
Exemple:

Les opérateurs arithmétiques

+ Addition
- Soustraction
/ Division
* Multiplication
** Puissance
% reste de la division
Exemple:

Remarque: Bash ne comprend pas


l'arithmétique à virgule flottante:
interprète donc les nombres
décimaux comme des chaînes de
caractères.
Toute opération sera donc toujours entière.

Pour faire des calculs complexes,on utilise l’outil bc qui supporte des nombres de
précision arbitraire.
Exemple:

· Affectation arithmétique
+= : incrémentation exemple : a +=2 càd a=a+2

-= : décrémentation exemple : a -=2 càd a=a-2

/= : affectation par division exemple : a /=2 càd a=a/2

*= : affectation par multiplication exemple : a *=2 càd a=a*2

%= : affectation du reste de la division exemple : a %=2 càd a=a%2

· Opérateurs binaires

<< : décalage d'un bit à gauche (multiplication par 2)

>> : décalage d'un bit à droite (division par 2)

& : ET binaire

| : OU (inclusif) binaire

~ : NON binaire

^ : XOR (ou exclusif) binaire

Exemple : echo 'scale=4;20+5/2' | bc donne une résultat 22.5000

ð Scale=4 : spécifiée de 4 chiffres

ð Bc (Basic calcultor ) interprète l'expression en utilisant la précision de décimale


spécifiée de 4 chiffres (avec scale=4).

· Manipulation des chaînes de caractères :

${#var} : longueur de la variable Exemple : var="abcde" ;echo ${#var} //affiche 5

- Extraction de sous-chaînes :

${chaine:position}: Extrait une sous-chaîne de $chaine à partir de $position.


Exemple :Phrase = "Pourtant elle tourne" echo ${phrase:7}

// affiche « elle tourne »

${chaine:position:longueur}: Extrait $longueur caractères d'une sous- chaîne de


$chaine à la position $position. Exemple : echo ${phrase:7:5} : sous-chaine de 5
caractère à partir du 8ème position // affiche elle

- Suppression des chaines :


${chaine#souschaine} : Supprime la correspondance la plus petite de $souschaine à
partir du début de $chaine.

Exemple : var="abcde" ; echo ${ var# ab} // affiche cde

${chaine##souschaine} : Supprime la correspondance la plus grande de


$souschaine à partir du début de $chaine

${chaine%souschaine}: Supprime la plus petite correspondance de $souschaine à


partir de la fin de $chaine

{chaine%%souschaine} : Supprime la plus grande correspondance de $souschaine


à partir de la fin de $chaine

- Remplacement de sous-chaîne :

${chaine/souschaine/remplacement} Remplace la première correspondance de


$souschaine par $remplacement.

${chaine//souschaine/remplacement} Remplace toutes les correspondances de


$souschaine avec $remplacement.

${chaine/#souschaine/remplacement} Si $souschaine correspond au début de


$chaine, substitue $remplacement à $souschaine.

${chaine/%souchaine/remplacement} Si $souschaine correspond à la fin de $chaine,


substitue $remplacement à $souschaine

· La commande test :

Définition : La commande test est une commande shell utilisée pour effectuer des
tests conditionnels. Elle permet de vérifier si une condition est vraie ou fausse et
renvoie une valeur de sortie en conséquence.

La syntaxe de base de la commande test est la suivante :

test condition

[ condition ]

Affichage :

La commande test, de même, retourne 0 si la condition est considérée comme


vraie, une valeur différente de 0 sinon pour signifier qu'elle est fausse

· Test sur les fichiers/répertoires :


-e fichier Vrai si le fichier/répertoire existe

-s fichier Vrai si le fichier à une taille supérieure à 0

-z fichier Vrai si le fichier fait 0 octet (donc s’il est vide

-r fichier Vrai si le fichier/répertoire est lisible

-w fichier Vrai si le fichier/répertoire est modifiable

-x fichier Vrai si le fichier est exécutable ou si le répertoire est accessible

-O fichier Vrai si le fichier/répertoire appartient à l’utilisateur

-G fichier Vrai si le fichier/répertoire appartient au groupe de l’utilisateur

-d nom Vrai si nom représente un répertoire

-f nom Vrai si nom représente un fichier

-L nom Vrai si nom représente un lien symbolique

f1 -nt f2 Vrai si les deux fichiers existent et si f1 est plus récent que f2

f1 -ot f2 Vrai si les deux fichiers existent et si f1 est plus ancien que f2

f1 -ef f2 Vrai si les deux fichiers représentent un seul et même fichier

Exemple de TP de la commande Test :


Note : test -f /chemin/vers/mon_fichier.txt : tester si mon_fichier.txt est un fichier
ordinaire, équivalente à [ -f /chemin/vers/mon_fichier.txt ]

I. La commande test

Exemples de tests sur les fichiers:

· test -f /home/test.txt : tester si test.txt est un fichier ordinaire, équivalente à

[ -f /home/test.txt ]

· [[ -f /etc/passwd ]] ; echo $? #0

· mkdir rep1 ; [[ -f rep1]] ; echo $? #1

II. Opérateurs de comparaison

Exemples de tests sur les entiers:

III. Comparaison numérique sur les entiers:

Exemples de comparaisons d'entiers:

- [ 2 -lt 3 ] ; echo $?
- varx=2 ; vary=3 ;

- ̈ [ "$varx" -lt "$vary" ]; echo $? #Equivalente à (( "$varx" <


"$vary" ));echo $?

IV. Opérateurs de comparaison

❖ Tests sur les chaînes de caractères :

Exemples :

§ a="Bonjour" ; echo $?

§ [ "$a" = "$b" ] ; echo $?

§ [ "$a" == "$b" ] ; echo $?

Les operateurs logiques :


V. Les commandes basename/dirname

- La commande basename élimine les répertoires en tête du chemin


d'accès NOM. Si un SUFFIXE est indiqué, et s'il est identique à la
partie finale du NOM, il est éliminé de celui-ci.

Exemples :

❖ basename /usr/bin/sort : Produit « sort » en sortie.


❖ basename include/stdio.h .h : Produit « stdio » en sortie.

- La commande dirname donne le chemin du répertoire dans lequel


se trouve le fichier

Exemples :

❖ dirname /usr/bin/sort : Produit /usr/bin/.


❖ dirname include/stdio.h .h : Produit « include/ » en sortie.

1- Les structures conditionelles


La structure if:
if commande test – vraies
then
Instructions...
fi
exemple
#!/bin/bash
echo -n “Donner un nombre: " ; read VAR
if [ $VAR -ge 10 ]
then
echo “Ce nombre est supèrieur à 10 !"
fi
La structure if..else:
if commande test –vraies
then
Instructions...
else
Instructions...
fi

Exemple 1 :
#!/bin/bash
echo -n “Donner un nombre: " read VAR
if [ $VAR -gt 10 ]
then
echo “Ce nombre est supèrieur à 10 !
else
echo “Ce nombre est inférieur ou égal à 10 !“
fi
Exemple 2 :
if [ $# = 0 ]
then
echo "$0 : Aucun argument recu !"
fi

if cp "$1" "$1%"
then
echo "sauvegarde de $1 reussie"
else
echo "sauvegarde du fichier $1 impossible"
fi

La structure if..elif..else
if commande test – conditions vraies
then
Instructions ...
elif commande test – conditions vraies
then
Instructions ...
else
Instructions ...
fi

Les blocs elif et else sont facultatifs, la commande test peut réussir ou échouer,
Si elle réussit le bloc then est exécuté
Sinon le bloc else est exécuté

Exemple
#!/bin/bash
echo -n “Donner un nombre” read VAR
if [ $VAR -gt 10 ]
then
echo “Ce nombre est supérieur à 10 !”
elif [ $VAR -eq 10 ]
then
echo “Ce nombre est égal à 10 !”
else
echo “Ce nombre est inférieur à 10 !”
fi

Les structures if...else imbriquées

Possibilité de faire des if..else à l’intérieur d’un autre if..else

if commande test – conditions vraies


then
if conditions
then
....
else
...
fi...
elif commande test – conditions vraies
then
Instructions...
else
Instructions...
fi

La structure case...esac : (choix multiples)


case variable in
expression_reg1)
Commande1
Commande2 ...
;;#executés s’il y a correspondence entre variable et l’expression_reg
expression_reg2)
Commande1
Commande2 ...
;;
*)
commandes ... #Default, executés dans le cas échéant
;;
esac

Exemple

case $# in
0)
echo "aucun parametre"
echo "Syntaxe : $0 "
;;
1)
echo "1 parametre passe au programme : $1"
;;
2)
echo "2 parametres passes au programme : $1 et $2 "
;;
*)
echo "TROP DE PARAMETRES !"
esac

2- Les structures iteratives


Boucle for :
for variable in liste; do
commande(s)...
done

#Boucle infinie
for (( ; ; ))
do
echo "infinie [ CTRL-C pour arrêter]"
done

Boucle while : continue à boucler tant que la condition est vraie


while condition
do
commande(s)...
done

#Exemple Factoriel
counter=$1
factorial=1
while [$counter -gt 0] //Greater then : comparaison
do
factorial=$((factorial * counter ))
counter=$((counter - 1 ))
done
echo $factorial

Boucle while : continue à boucler tant que la condition est fausse


until condition
do
commande(s)...
done

#Exemple
x=20
until [ $x -lt 10 ]; do //Less then : comparaison
echo "The counter is $x"
let x-=1
done

3- Les Fontions

-Une fonction peut être utilisée :

*En dehors d’un script : on peut créer des fonctions pour regrouper des séries
d'instructions couramment exécutées et effectuer le même travail qu’un script Shell .

*Au sein d’un script : sous-routines implémentant un certain nombre


d'opérations pour remplacer des suites d'opérations répétées plusieurs fois au cours
des scripts .

-Une fonction ne peut pas être vide.

-Elle prend des arguments de la même manière qu'un script mais pas entre les
parenthèses, accessibles via $1 $2 etc … au sein de la fonction.

1-Création des fonctions : bash

function nomf ()

instruction1 ;
instruction2 ;

}
⇒ Les parenthèses sont optionnelles

Exemple :
function fonction1 ()
{
pwd ;
mkdir rep1 ;
echo ‘’répértoire rep1 crée’’ ;
}

2-Création des fonctions : C-like

nom_fonction()

Instruction1

Instruction2

...;

}
⇒ Les parenthèses obligatoires

- Pour afficher les fonctions définies dans l’environnement de l’utilisateur

Courant :

$ declare -F

-Pour afficher le contenu d’une fonction particulière (fonction fonction1) :


$declare –f fonction1
$type –all fonction1

- Pour supprimer une fonction :

$unset fonction1

-Pour déclarer une fonction d’une façon permanente c’est-à-dire à chaque ouverture
du Shell Bash, on peut la définir :
* Dans le fichier /etc/bashrc : dans ce cas, ils seront définis dans

toutes les sessions de tous les utilisateurs

* Dans le fichier ~/.bashrc : qui se chargera au lancement de la session de


l’utilisateur intéressé (définis uniquement dans l’environnement de l’utilisateur en
question)

4- Les Tableaux

#Déclaration des tableaux:


Première méthode:
tab=("Alice" "Bob" "Sam" )
Deuxième méthode:
tab[0]="Alice"
tab[1]="Bob"
tab[2]="Sam"

#Nombre d'éléments d’un tableau :


echo ${#tab[*]}
ou
echo ${#tab[@]}

#Le premier élément


echo ${tab[0]}
Ou bien
echo ${tab}

#Pour afficher un élément en 3ème position


echo ${tab[2]}

#Pour afficher tous les éléments


echo ${tab[@]}
Ou bien avec une boucle for :

1) Bash style: for i in ${!tab[@]}; do


echo ${tab[i]};
done

L'expression ${!tab[@]} est une expansion de paramètre qui se traduit par une
liste de toutes les clés du tableau associatif tab. L'option [@] permet de récupérer
toutes les clés, tandis que l'opérateur ! appliqué à tab permet de récupérer les
noms de toutes les clés.
La variable $ {!tab[@]} est utilisée pour obtenir les indices du tableau.

2) C style : for (( i=0; i < ${#tab[@]}; i++ ));do


echo ${tab[i]};
done

Note: Toutes les variables sont des tableaux. Par défaut, c'est le premier élément qui
est appelé

Exemple 1:

varz="dog"
echo $varz //Afficher le contenu de variable varz qui est dog.
echo ${varz} //Afficher le contenu de premier élément de tableau (Voir note )
varz qui est dog.

Exemple 2:

#!/bin/bash
# Mettre les arguments du script dans un tableau
tabxx=( "$@" ); //tabxx=("$1" "$2" "$3" ...)
echo ${tabxx[1]}; //Afficher du deuxième argument
echo "Nombre d’éléments: ${#tabxx[@]} " ;//afficher le nombre des éléments de
tableau
echo "Les éléments sont: ${tabxx[@]}; // afficher tous les éléments du tableau

Exemple 2:

#!/bin/bash
tab=("Alice" " Bob" " Sam" " Rim" ) // Déclarer un tableau tab

#Bash Style
for i in ${!tab[@]}; do //Obtenir les indices du tableau
echo ${tab[i]}; //Afficher les éléments du tableau

done

#C style
for (( i=0; i < ${#tab[@]}; i++ )); do
echo ${tab[i]};
done

5- Les Commandes getops

Exemple 1:
#!/bin/bash
while getopts 'abc' OPTION; do
case "$OPTION" in
a) echo "Option a used "
;;
b) echo "Option b used"
;;
c) echo "Option c used"
;;
?) echo "Usage: $(basename $0) [-a] [-b] [-c]"
exit 1
;;
esac
done

Exemple 2:
#!/bin/bash
while getopts ':ab:c:' OPTION; do
case "$OPTION" in
a)echo "Option a used"
;;
b)argB="$OPTARG"
echo "Option b used with: $argB"
;;
c) argC="$OPTARG"
echo "Option c used with: $argC"
;;
?) echo "Usage: $(basename $0) [-a] [-b argument] [-c argument]"
exit 1
;;
esac
done

#Le caractère “:” après chaque option spécifie que cette option doit être suivie d'un
argument.
# ?) : Si l'option spécifiée n'est pas valide ou si une option qui nécessite un argument
est spécifiée sans argument
Exemple 3:
echo "Before - variable one is: $1"
shift "$(($OPTIND -1))"
echo "After - variable one is: $1"
echo "The rest of the arguments (operands)"

for x in "$@"
do
echo $x
done

#La commande shift "$(($OPTIND -1))" est utilisée pour décaler les
arguments d'entrée de la position des options traitées par getopts. Cela signifie
que la prochaine variable d'entrée sera $1, et que les options traitées ne seront plus
considérées dans le reste du script.

Déboguer un script bash


● Avec l’option "-x”
bash -x myscript.sh
Ou bien
$ bash --debug myscript.sh

● On peut activer et désactiver


#!/bin/bash
set -x # Enable debugging
# some code here
set +x # Disable debugging output.

● L'option -n vous permet de vérifier la syntaxe d'un script sans avoir à


l'exécuter:
̈ $ bash -n testscript.sh

Vous aimerez peut-être aussi