Académique Documents
Professionnel Documents
Culture Documents
Le répertoire /lib
Les bibliothèques partagées par les programmes de /bin et /sbin
se trouvent dans /lib (libraries, « bibliothèques »).
Sous Windows, ce sont tous les fichiers .DLL (Dynamic Linked Library
ou « bibliothèque de liens dynamiques ») que vous trouverez dans
le répertoire C:\WINDOWS\SYSTEM\. Sur votre système Linux, ce
sont tous les fichiers .so (comme shared object ou « objet partagé
»).
C’est ici que se trouvent vos disques C:, D:, E:, F:, etc. Dans un
système Linux, lorsque vous insérez un périphérique amovible
comme un CD-Rom, un DVD, un disque dur externe ou une clé
USB, il doit être « monté ». Cela signifie que le système de fichiers
du périphérique doit être intégré à l’arborescence du système. Les
données sont ensuite accessibles en dessous du répertoire qui
constitue ce qu’on appelle le « point de montage ». Avant
d’enlever le périphérique, celui-ci doit être « démonté », c’est-à-
dire que l’on indique au système de fichiers que les données du
périphérique amovible ne doivent plus être englobées.
Le répertoire /usr
L’arborescence sous /usr (Unix System Resources ou Unix Specific
Resources2) renferme précisément tout ce qui n’est pas
nécessaire au fonctionnement minimal du système. Vous serez
d’ailleurs peut-être surpris d’apprendre que cela représente la
part du lion. Sur le poste de travail sur lequel j’écris ces lignes,
l’arborescence /usr contient près de 90 % de la totalité du système
sans compter les données personnelles. Vous constaterez que
certains répertoires rencontrés à la racine du système sont
également présents ici : /usr/bin, /usr/lib ou encore /usr/sbin.
bash-4.3$ ls
Le répertoire courant
Le répertoire courant est celui dans lequel vous vous trouvez au
moment où vous saisissez la commande.
bash-4.3$ ls /
Résultat :
bin dev home lost+found mnt proc run srv tmp var boot etc lib
media opt root sbin sys usr
bash-4.3$ ls /usr
bash-4.3$ ls -F /etc
bash-4.3$ ls -l /etc/cups
total 64
-rw-r--r-- 1 root root 1077 Jan 17 07:52 command.types
-rw-r--r-- 1 root root 14365 Jan 17 04:10 cups-browsed.conf
-rw-r----- 1 root lp 2916 Dec 10 18:21 cups-files.conf
...
-rw-r----- 1 root lp 142 Dec 10 18:21 snmp.conf
-rw-r----- 1 root lp 142 Dec 10 18:21 snmp.conf.default
drwx------ 2 root lp 4096 Dec 10 18:21 ssl/
7
total 64K
-rw-r--r-- 1 root root 1.1K Jan 17 07:52 command.types
-rw-r--r-- 1 root root 15K Jan 17 04:10 cups-browsed.conf
-rw-r----- 1 root lp 2.9K Dec 10 18:21 cups-files.conf
-rw-r----- 1 root lp 2.9K Dec 10 18:21 cups-files.conf.default
-rw-r----- 1 root lp 4.4K Dec 10 18:21 cupsd.conf
-rw-r----- 1 root lp 4.4K Dec 10 18:21 cupsd.conf.default
drwxr-xr-x 2 root lp 4.0K Dec 10 18:21 interfaces/
drwxr-xr-x 2 root lp 4.0K Dec 10 18:21 ppd/
-rw-r----- 1 root lp 142 Dec 10 18:21 snmp.conf
-rw-r----- 1 root lp 142 Dec 10 18:21 snmp.conf.default
drwx------ 2 root lp 4.0K Dec 10 18:21 ssl/
8
La taille des fichiers est tout de suite beaucoup plus lisible, car le
système l’indique en kilo-octets (K), mégaoctets (M) ou gigaoctets
(G).
bash-4.3$ ls –a
. .esd_auth Bureau
.. .gnupg Documents
.ICEauthority .gvfs Images
.Xauthority .hplip Modèles
.bash_history .local Musique
.cache .screenrc Public
.config .xfce4-session.verbose-log Téléchargements
.dbus .xscreensaver Vidéos
cd
La commande cd (change directory) est utilisée pour changer de
répertoire courant. Il suffit de la faire suivre du chemin du
répertoire dans lequel on veut se placer. Dans l’exemple ci-après,
l’invocation de la commande pwd après cd montre que nous
sommes bien dans le répertoire demandé.
bash-4.3$ cd /
bash-4.3$ pwd
/
9
bash-4.3$ cd bin
bash-4.3$ pwd
/bin
bash-4.3$ cd /etc
bash-4.3$ pwd
/etc
bash-4.3$ cd /usr/bin
bash-4.3$ pwd
/usr/bin
bash-4.3$ cd /etc
bash-4.3$ pwd
/etc
bash-4.3$ cd bin
bash: cd: bin: Aucun fichier ou répertoire de ce type
echo et cat
bash-4.3$ ls
$ more /etc/passwd
$ less /etc/services
$ ls -l bonjour.txt
-rw-r--r-- 1 kikinovak users 19 Nov 30 18:19 bonjour.txt
$ touch bonjour.txt
$ ls -l bonjour.txt
-rw-r--r-- 1 kikinovak users 19 Dec 1 11:07 bonjour.txt
$ touch yatahongaga.txt
$ ls -l yatahongaga.txt
-rw-r--r-- 1 kikinovak users 0 Dec 1 11:10 yatahongaga.txt
Avec echo
Aurions-nous pu obtenir quelque chose de comparable avec la
commande echo ? Essayons :
Bach
Bartok
Voilà qui est mieux. L’utilisation du double chevron >> au lieu du
simple > a provoqué l’ajout de la chaîne de caractères à la fin du
fichier, en évitant la substitution du contenu précédent. Si nous
souhaitons ajouter un troisième nom à la liste, il devrait donc suffire
de répéter la dernière commande en insérant un autre nom.
Essayons :
$ cd Documents
$ mkdir Textes
$ ls -ld Textes
drwxr-xr-x 2 kikinovak users 4096 Dec 1 11:17 Textes/
Ignorez le chiffre 4096, qui n’a rien à voir avec la taille réelle du
répertoire : c’est l’espace occupé par ses métadonnées, c’est-à-
dire par les informations sur son contenu, et non pas le contenu lui-
même.
16
$ cd ~/Images/2012
$ mkdir Photos Graphismes Captures
$ ls -l
total 12
drwxr-xr-x 2 kikinovak users 4096 Dec 1 11:24 Captures/
drwxr-xr-x 2 kikinovak users 4096 Dec 1 11:24 Graphismes/
drwxr-xr-x 2 kikinovak users 4096 Dec 1 11:24 Photos/
$ tree .config
.config/
|-- Thunar
| |-- accels.scm
| `-- uca.xml
|-- Trolltech.conf
|-- gconf
|-- pulse
|-- user-dirs.dirs
|-- user-dirs.locale
`-- xfce4
|-- desktop
| `-- icons.screen0-1264x928.rc
...
Puisque nous avons parlé d’arbre, vous pouvez très bien imaginer
les suites de répertoires et de sous-répertoires comme autant de
branches qui se ramifient. Les fichiers (comme accels.scm ou
uca.xml dans l’exemple précédent) correspondent alors aux
feuilles de cet arbre. Et pour filer la métaphore : tout se rejoint à la
racine2. L’option -d de tree montre les différents
embranchements, mais sans les feuilles. En d’autres termes, tree -d
(comme directory) affichera seulement les répertoires d’une
arborescence. Reprenons le dernier exemple avec cette option :
$ tree -d .config
.config/
|-- Thunar
|-- gconf
|-- pulse
`-- xfce4
18
|-- desktop
...
Est-ce que tree nous affiche vraiment tout ? Appliquons-le sur le
répertoire suivant :
$ tree /etc/skel
/etc/skel/
0 directories, 0 files
$ tree -a /etc/skel
/etc/skel/
`-- .screenrc
0 directories, 1 file
Nous en déduisons que l’option -a fonctionne de manière similaire
avec tree et ls.
$ ls -l bonjour.txt
-rw-r--r-- 1 kikinovak users 19 déc. 1 11:07 bonjour.txt
$ cp bonjour.txt /tmp/
$ ls -l /tmp/bonjour.txt
-rw-r--r-- 1 kikinovak users 19 déc. 1 11:48 /tmp/bonjour.txt
20
Supprimer : rm et rmdir
La commande rm (comme remove) sert à supprimer des fichiers
et des arborescences de répertoires. Accessoirement, elle vous
permet de vous tirer dans le pied, car elle est capable d’anéantir
des dizaines de sites web, des années de courriels archivés, voire
un serveur entier en un tournemain. Vous l’aurez compris : dans la
panoplie des outils Unix, rm fait partie des instruments affûtés et
tranchants qu’il convient de manier avec précaution. Pour
supprimer un fichier, il suffit de spécifier son nom en argument :
$ rm bonjour.txt
Vous n’obtiendrez pas de demande de confirmation du genre
Êtes-vous sûr de… ? ou autres Voulez-vous vraiment… ?, votre
système Linux n’a rien d’une nounou qui vous prend par la main.
Vous lui avez ordonné de supprimer le fichier bonjour.txt et c’est
sans broncher qu’il s’est exécuté pour l’envoyer au paradis des
octets. Ici, vous ne trouverez pas de Corbeille non plus, où vous
auriez pu repêcher vos données malencontreusement supprimées.
$ rm -i bonjour2.txt
$ alias
alias d='dir'
alias dir='/bin/ls $LS_OPTIONS --format=vertical'
alias ls='/bin/ls $LS_OPTIONS'
alias mc='. /usr/share/mc/bin/mc-wrapper.sh'
alias v='vdir'
alias vdir='/bin/ls $LS_OPTIONS –format=long'
clear
Puisque nous sommes en plein dans les opérations de nettoyage,
je vous montre l’équivalent d’un coup d’essuie-glace sur votre
terminal. Remplissez ce dernier avec n’importe quelle commande
susceptible de bien l’encombrer (par exemple ls /etc), puis
essayez ceci :
$ clear
Pour aller plus vite, utilisez simplement le raccourci clavier Ctrl+L,
ce qui revient au même.
25
Help
$ cp --help
26
$ man cp
bash-4.3$ su -
Mot de passe:
root@slackbox:~#
Notez le tiret – qui suit la commande su. Il précise qu’il faut devenir
root en récupérant toutes les variables d’environnement de ce
compte. Nous y reviendrons. Contentez-vous pour l’instant de
connaître la démarche.
bash-4.3$ su - glagaffe
Mot de passe:
glagaffe@slackbox:~$
Là encore, notez l’utilisation du tiret – pour indiquer que vous
souhaitez devenir un autre utilisateur en utilisant ses variables
d’environnement. L’invite de commandes (glagaffe@slackbox:~$)
nous indique qu’un changement d’identité a eu lieu. Pour le
vérifier, nous avons tout loisir de demander à notre système qui
nous sommes, grâce à la commande whoami (Who am I ?, « Qui
suis-je ? »). Voici une petite démonstration pratique :
bash-4.3$ su - glagaffe
Mot de passe:
glagaffe@slackbox:~$ whoami
glagaffe
glagaffe@slackbox:~$ exit
logout
bash-4.3$ whoami
kikinovak
bash-4.3$ su -
Mot de passe:
root@slackbox:~# whoami
root
root@slackbox:~# exit
logout
31
bash-4.3$ whoami
kikinovak
Vous remarquerez que si j’invoque su sans autre argument que le
tiret, cela revient exactement à la même chose que su - root :
bash-4.3$ su - root
Mot de passe:
root@slackbox:~#
bash-4.3$ id
uid=1000(kikinovak) gid=100(users) groupes=100(users),7(lp),
11(floppy),17(audio),18(video),19(cdrom),83(plugdev),84(power),
86(netdev),93(scanner)
Invoquée sans autre argument, la commande id nous affiche
l’UID, le GID, ainsi que la liste complète des groupes secondaires
auxquels l’utilisateur est affecté. Les options vont me permettre de
cibler les informations.
bash-4.3$ id -Gn
users lp floppy audio video cdrom plugdev power netdev scanner
bash-4.3$ groups
users lp floppy audio video cdrom plugdev power netdev scanner
Évidemment, personne ne vous demande de retenir toutes ces
options par coeur. N’oubliez pas que vous avez la page du
manuel pour cela :
bash-4.3$ man id
Pour en savoir plus sur les autres utilisateurs du système, il suffit de
fournir leur nom en argument. Ces informations sont accessibles à
tous les utilisateurs non privilégiés du système :
bash-4.3$ id lgibaud
uid=1001(lgibaud) gid=100(users) groupes=100(users),7(lp),
11(floppy),17(audio),18(video),19(cdrom),83(plugdev),84(power),
86(netdev),93(scanner) Les arguments et les options peuvent
évidemment être combinés à souhait, par exemple pour afficher
l’UID d’un autre utilisateur :
bash-4.3$ id -u lgibaud
1001
Lors de la création des utilisateurs, le script adduser nous a fourni la
possibilité de renseigner une série de champs comme le nom
complet, le numéro de bureau, les téléphones professionnel et
personnel, etc. Il s’agit là des données GECOS de l’utilisateur.
ACRONYME GECOS
GECOS signifie General Electric Comprehensive Operating System,
du nom d’un système d’exploitation mainframe créé
originellement par la General Electric.
kikinovak:x:1000:100:Kiki Novak,,,:/home/kikinovak:/bin/bash
Comment décrypter ce charabia ? Il s’agit en fait d’une série de
champs séparés par deux-points, où l’on trouve dans l’ordre :
$ man adduser
Il n'y a pas de page de manuel pour adduser. Cette lacune a de
quoi surprendre, mais rassurez-vous, c’est tout à fait normal. La
commande adduser est en réalité un script spécifique à
Slackware, censé faciliter l’ajout des utilisateurs. La « véritable »
commande sous le capot, c’est useradd :
$ man useradd
USERADD(8) Commandes de gestion du système USERADD(8)
NOM
useradd - créer un nouvel utilisateur ou modifier les informations
par défaut appliquées aux nouveaux utilisateurs
...
Cette commande comporte quantité d’options, dont certaines
vous sembleront vaguement familières :
kikinovak@slackbox:~$ groups
users lp floppy audio video cdrom plugdev power netdev scanner
Admettons que j’aie défini l’utilisateur kjoly (Karine Joly) sans
toutefois l’ajouter à la panoplie de groupes secondaires proposés
par adduser. On part ainsi du minimum syndical :
# groups kjoly
kjoly : users
39
# usermod -a -G \
lp,floppy,audio,video,cdrom,plugdev,power,netdev,scanner kjoly
N’hésitez pas à ouvrir la page man usermod pour avoir une idée
un peu plus précise de ce que nous venons de faire.
# groups jktartempion
jktartempion : users lp floppy audio video cdrom plugdev power
netdev scanner
# gpasswd -d jktartempion audio
Removing user jktartempion from group audio
# groups jktartempion
jktartempion : users lp floppy video cdrom plugdev power netdev
scanner
# gpasswd -d jktartempion lp
Removing user jktartempion from group lp
# gpasswd -d jktartempion scanner
Removing user jktartempion from group scanner
# groupadd eyrolles
# groupadd spirou
# usermod -a -G eyrolles lgibaud
# usermod -a -G eyrolles ahabian
# usermod -a -G spirou glagaffe
# usermod -a -G spirou fantasio
Pour savoir ce qui s’est passé, ouvrez /etc/group et examinez les
deux dernières lignes de ce fichier. Vous pourriez très bien utiliser
cat, more ou less pour visualiser /etc/group, mais j’en profite en
passant pour vous présenter la commande tail. Dans sa
configuration par défaut, tail affiche les dix dernières lignes du
41
# tail -n 2 /etc/group
eyrolles:x:1000:lgibaud,ahabian
spirou:x:1001:glagaffe,fantasio
# groupdel eyrolles
# groupdel spirou
Supprimer un utilisateur
# ls -l /home/fantasio/
total 36
drwxr-xr-x 2 1005 users 4096 Oct 16 08:22 Bureau/
drwxr-xr-x 2 1005 users 4096 Oct 16 08:22 Documents/
drwxr-xr-x 2 1005 users 4096 Oct 16 08:24 Images/
-rw-r--r-- 1 1005 users 45 Oct 16 08:19 LISEZ_MOI.txt
drwxr-xr-x 2 1005 users 4096 Oct 16 08:22 Modèles/
drwxr-xr-x 2 1005 users 4096 Oct 16 08:22 Musique/
drwxr-xr-x 2 1005 users 4096 Oct 16 08:22 Public/
drwxr-xr-x 2 1005 users 4096 Oct 16 08:22 Téléchargements/
drwxr-xr-x 2 1005 users 4096 Oct 16 08:22 Vidéos/
OPTIONS
-r, --remove
Files in the user's home directory will be removed along with the
home directory itself and the user's mail spool.
Cela signifie que l’option -r (ou --remove) se charge de supprimer
les fichiers présents dans le répertoire personnel de l’utilisateur en
même temps que le répertoire lui-même, ainsi que le répertoire
d’attente des courriels.
43
# userdel -r jktartempion
# ls -l /home/
total 28
drwx--x--x 2 ahabian users 4096 Oct 8 10:47 ahabian/
drwx--x--x 18 1005 users 4096 Oct 16 11:01 fantasio/
drwxr-xr-x 2 root root 4096 Sep 18 2012 ftp/
drwx--x--x 2 glagaffe users 4096 Oct 8 10:48 glagaffe/
drwx--x--x 19 kikinovak users 4096 Oct 20 09:12 kikinovak/
drwx--x--x 18 kjoly users 4096 Oct 20 09:09 kjoly/
drwx--x--x 2 lgibaud users 4096 Oct 8 10:47 lgibaud/
$ ls -l droits.txt
-rw-r--r-- 1 kikinovak users 29 Oct 24 10:06 droits.txt
Vous vous êtes peut-être demandé d’où viennent les droits initiaux
des fichiers.
Créons un fichier :
$ touch droits2.txt
$ ls -l droits2.txt
-rw-r--r-- 1 kikinovak users 0 Nov 7 08:04 droits2.txt
Je vois que droits2.txt est créé d’emblée avec une structure rw-r--r-
-. Qui ou quoi décide des permissions pour les fichiers
nouvellement créés ? Il faut savoir que, sur un système Linux, il n’est
pas possible de créer un fichier qui possède d’emblée les droits
d’exécution. Cela signifie que les permissions maximales que je
peux obtenir à la création, c’est rw-rw-rw-, autrement dit 666. Or, si
je regarde de plus près mon fichier droits2.txt, il est affublé des
droits rw-r--r--, c’est-à-dire 644 en notation numérique. J’en conclus
maussadement que je me suis fait gruger de 022 au passage.
$ umask
0022
Il est possible de changer ce umask :
$ umask 0002
$ touch droits3.txt
$ ls -l droits3.txt
-rw-rw-r-- 1 kikinovak users 0 Nov 7 08:07 droits3.txt
$ umask 0000
$ touch droits4.txt
$ ls -l droits4.txt
-rw-rw-rw- 1 kikinovak users 0 Nov 7 08:07 droits4.txt
# cp -v /etc/cups/cupsd.conf /home/kikinovak/
'/etc/cups/cupsd.conf' -> '/home/kikinovak/cupsd.conf'
51
$ man chown
NOM
chown – change file owner and group
...
Après un coup d’oeil sur la syntaxe de la commande, je me lance
:
$ chown kikinovak:users cupsd.conf
chown: modification du propriétaire de « cupsd.conf »: Opération
non permise
Apparemment, le système se rebiffe. Je vais donc essayer autre
chose : redevenir root et, en tant que root, attribuer ce fichier
/home/kikinovak/cupsd.conf à l’utilisateur kikinovak et au groupe
users.
$ su -
Mot de passe :
# chown kikinovak:users /home/kikinovak/cupsd.conf
Je redeviens l’utilisateur commun et mortel que j’étais avant et je
vérifie :
# exit
logout
$ ls -l cupsd.conf
-rw-r----- 1 kikinovak users 4582 nov. 7 08:26 cupsd.conf
52
Pas de cadeaux !
Cette fois-ci, l’opération s’est déroulée comme prévu. Le fichier
m’appartient désormais et je suis tellement content… que je
décide d’en faire cadeau à un autre utilisateur présent sur le
système, par exemple à lgibaud.
$ whoami
kikinovak
$ chown lgibaud:users cupsd.conf
chown: modification du propriétaire de « cupsd.conf »: Opération
non permise Je constate alors avec consternation que Linux est un
système pour utilisateurs radins : on ne peut même pas faire
cadeau de ses fichiers à un autre utilisateur.
Partons tout de suite d’un cas de figure très concret. Vous vous
rappelez que le fichier pour configurer votre système d’impression
s’appelle cupsd.conf mais vous ne vous souvenez plus de son
emplacement exact. Que faire alors ?
Admettons que j’aie une vague idée des bottes de foin dans
lesquelles il faut chercher et que je veuille restreindre ma
recherche. Je pourrais sommer find d’effectuer sa recherche en
dessous du répertoire /etc :
Zone interdite
Pourquoi vaut-il mieux être root pour se lancer dans la recherche
d’un fichier de configuration du système ? Essayez donc
d’invoquer la dernière commande en tant que simple utilisateur et
voyez le résultat :
$ find /etc -name 'cupsd.conf'
find: "/etc/cups/ssl": Permission non accordée
/etc/cups/cupsd.conf
find: "/etc/sudoers.d": Permission non accordée
find: "/etc/samba/private": Permission non accordée
find: "/etc/polkit-1/localauthority": Permission non accordée
find: "/etc/openvpn/keys": Permission non accordée
find: "/etc/openvpn/certs": Permission non accordée
$ pwd
/home/kikinovak
54
Essayez :
# find /bin -size +200k | xargs ls -l
-rwxr-xr-x 1 root root 996040 Nov 11 06:22 /bin/bash
-rwxr-xr-x 1 root root 620980 Aug 7 2015 /bin/gawk-4.1.3
-rwxr-xr-x 1 root root 1496348 Jun 10 2013 /bin/ksh
-rwxr-xr-x 1 root root 381376 Dec 3 08:16 /bin/tar
-rwxr-xr-x 1 root root 390832 Nov 11 06:15 /bin/tcsh
-rwxr-xr-x 1 root root 686912 Oct 26 21:54 /bin/zsh
# cp -R /etc /home/kikinovak/
Si vous préférez que cela se fasse en mode « bavard », ajoutez
l’option -v :
# cp -Rv /etc /home/kikinovak/
Attribuez l’ensemble de cette arborescence à votre utilisateur et
redevenez ce dernier :
57
$ cat /etc/passwd
59
Retentons avec l’option -l, qui nous affiche simplement le nom des
fichiers dans lesquels il y a au moins une occurrence :
Vous aurez remarqué que le résultat n’est pas tout à fait le même.
C’est que le fichier /etc/ zprofile est en réalité un lien symbolique
(caractérisé par le l devant les droits d’accès) :
# ls -l /etc/zprofile
lrwxrwxrwx 1 root root 7 Jan 18 16:38 /etc/zprofile -> profile
63
Affiner la recherche
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Oct 4 10:28 /bin/sh -> bash
$ mkdir test_liens
$ cd test_liens/
$ cat > texte.txt << EOF
> Première ligne
> Deuxième ligne
> Troisième ligne
> EOF
$ ln -s texte.txt lien.txt
$ ls -l
total 4
lrwxrwxrwx 1 kikinovak users 9 Nov 8 09:40 lien.txt -> texte.txt
-rw-r--r-- 1 kikinovak users 49 Nov 8 09:40 texte.txt
$ cat lien.txt
Première ligne
Deuxième ligne
Troisième ligne
APPLICATION Commande wc
$ ls -l --color=auto
$ ls -l
total 4
lrwxrwxrwx 1 kikinovak users 5 Nov 8 13:06 depot -> /tmp/
lrwxrwxrwx 1 kikinovak users 9 Nov 8 09:40 lien.txt -> texte.txt
-rw-r--r-- 1 kikinovak users 66 Nov 8 09:47 texte.txt
$ rm lien.txt
$ ls -l
total 4
lrwxrwxrwx 1 kikinovak users 5 Nov 8 13:06 depot -> /tmp/
-rw-r--r-- 1 kikinovak users 66 Nov 8 09:47 texte.txt
Ici, nous utilisons bien un simple rm, car depot n’est pas un
répertoire à proprement parler. C’est un lien symbolique pointant
vers un répertoire. Vous ne pourrez donc pas utiliser rmdir pour
supprimer ce genre de lien.
$ ls -l
total 4
lrwxrwxrwx 1 kikinovak users 9 Nov 8 15:10 lien.txt -> texte.txt
-rw-r--r-- 1 kikinovak users 66 Nov 8 09:47 texte.txt
$ ln texte.txt lien.txt
$ ls -l
total 8
-rw-r--r-- 2 kikinovak users 49 Nov 8 15:27 lien.txt
-rw-r--r-- 2 kikinovak users 49 Nov 8 15:27 texte.txt
$ ls
lien.txt texte.txt
$ rm texte.txt
$ ls -l
total 4
-rw-r--r-- 1 kikinovak users 49 Nov 8 15:27 lien.txt
$ cat lien.txt
Première ligne
Deuxième ligne
Troisième ligne
$ gucharmap &
APPLICATION Gucharmap
71
[1] 9081
Maintenant, cliquez une fois sur le terminal (pour ramener le focus
sur lui) et tapez la commande suivante :
$ ps
Elle vous retourne un petit bilan qui ressemble au résultat ci-après.
Ne vous inquiétez pas si les numéros ne sont pas les mêmes que sur
ma machine. C’est normal.
$ ps x
PID TTY STAT TIME COMMAND
1870 tty1 Ss 0:00 -bash
4716 tty1 S+ 0:00 /bin/sh /usr/bin/startx
...
5783 tty1 Sl 0:01 /usr/bin/xfce4-terminal
5786 tty1 S 0:00 gnome-pty-helper
5787 pts/0 Ss+ 0:00 bash
5790 tty1 Sl 0:00 gucharmap
5794 pts/1 R+ 0:00 ps x
$ ps ax
Le nombre de processus correspond à peu de choses près au
nombre de lignes renvoyées par la commande précédente. La
ligne d’en-têtes des colonnes ne correspond pas à un processus ;
supprimons-la de l’affichage en utilisant l’option -v (ou --invert-
match) de grep :
$ ps ax | grep -v COMMAND
À partir de là, je peux donc reprendre ma commande et la
combiner avec wc pour obtenir le nombre de lignes, c’est-à-dire
le nombre de processus en cours :
$ ps ax | grep -v COMMAND | wc -l
182
Nous obtenons un total de 182 processus. De la même manière, si
je veux savoir combien de ces processus m’appartiennent, il suffit
que j’invoque seulement l’option x :
$ ps x | grep -v COMMAND | wc -l
47
$ kill 9081
Ah ? La fenêtre de gucharmap a disparu. Est-ce que nous l’aurions
« tuée », comme le suggère le nom de la commande ? kill est en
effet susceptible de se révéler un véritable assassin et de terminer
74
1 Lancez gucharmap.
2 Envoyez-lui un SIGSTOP.
3 Essayez de fermer gucharmap en cliquant sur le bouton de
fermeture de la fenêtre.
4 Admirez le résultat.
L’affichage détaillé nous montre qu’il s’agit d’un fichier texte assez
important en termes de taille : 82 kilo-octets. C’est pour cela que
je l’ai choisi. Essayons de le compacter :
$ gzip services
$ ls -lh services.gz
-rw-r--r-- 1 kikinovak users 24K Feb 6 09:45 services.gz
$ cp /boot/tuxlogo.bmp .
$ ls -lh tuxlogo.bmp
-rw-r--r-- 1 kikinovak users 33K Feb 6 09:51 tuxlogo.bmp
$ gzip tuxlogo.bmp
$ ls -lh tuxlogo.bmp.gz
-rw-r--r-- 1 kikinovak users 11K Feb 6 09:51 tuxlogo.bmp.gz
$ gzip -d slack.bmp.gz
Ou alors, ce qui revient exactement au même :
$ gunzip services.gz
$ bzip2 services
77
$ ls -lh services.bz2
-rw-r--r-- 1 kikinovak users 22K Feb 6 09:54 services.bz2
$ bzip2 -d services.bz2
Ou :
$ bunzip2 services.bz2
$ mkdir config
$ find /etc/ -name '*.conf' 2> /dev/null \
-exec cp \{} ~/config/ \;
$ ls config/
00-dhcp-client.conf httpd-userdir.conf
78
00-rc-manager.conf httpd-vhosts.conf
10-autohint.conf ibm.conf
...
Nous allons rassembler tous ces fichiers contenus dans ~/config
pour en constituer une archive en utilisant la commande tar :
• tar reçoit l’ordre de créer (create) une archive avec l’option -c.
• La commande nous dit ce qui se passe en coulisse avec l’option
-v.
• Le premier argument (config.tar) sera interprété comme le nom
de l’archive grâce à l’option -f (file ou fichier).
$ mkdir repertoire
$ mv config.tar repertoire/
$ cd repertoire/
$ tar -xvf config.tar
config/
config/10-sub-pixel-vbgr.conf
config/VIA8233A.conf
config/SI7018.conf
config/ssl-modules.conf
...
Dans l’autre sens, c’est donc l’option -x (pour extract) qui
procède au dépaquetage de l’archive.
Et avec bzip2 :
$ gunzip config.tar.gz
$ bzip2 config.tar
80
$ ls -lh config.tar.bz2
-rw-r--r-- 1 kikinovak users 193K févr. 9 10:24 config.tar.bz2
Les options de tar sont souvent utilisées sans le tiret - initial. Vous
pouvez donc écrire indifférement tar -xvjf ou tar xvjf, cela n’a
aucune incidence sur le fonctionnement de la commande.
81
Installer Vim
Sachez qu'il est courant que les gens adoptent et défendent bec
et ongles l'un ou l'autre de ces éditeurs. Choisir un éditeur de texte
sous Linux, c'est en fait un peu comme choisir une religion (oui, je
sais : ils sont fous, ces Linuxiens !).
D'ailleurs, vous devriez vous mettre en tête dès maintenant qu'il n'y
en a pas un qui soit nul et l'autre génial ; ce sont juste deux
conceptions un peu différentes de ce que doit être un éditeur de
texte.
Je suis donc à mon tour un habitué de Vim et c'est lui que je vous
présenterai dans ce livre.
Sur la plupart des distributions Linux, Vim est en général installé par
défaut. J'ai bien dit en général. En effet, rien n'assure que Vim soit
installé par défaut sur votre distribution ; après tout, c'est elle qui
choisit les programmes initialement installés.
Sous Ubuntu, il faut savoir que ce n'est pas Vim qui est installé mais
Vim-tiny, une version allégée. Personnellement, elle ne me
convient pas ; de plus, elle est limitée en possibilités. Je vous invite
donc à installer le vrai Vim complet en tapant :
vimtutor
Commencez par lancer Vim. Comme je vous l'ai dit plus tôt, il suffit
pour cela de taper la commande suivante :
vim
Par défaut, cette fenêtre affiche des menus et une barre d'outils,
comme un éditeur de texte classique. Un habitué du Vim console
aura bien entendu plutôt tendance à utiliser les raccourcis clavier,
qui permettent de gagner du temps.
88
L'ouverture de Vim
vim
vim nomdufichier
i : insérer du texte
Le déplacement
h : aller à gauche ;
j : aller en bas ;
k : aller en haut ;
l : aller à droite.
Si si, vous pouvez également les utiliser : vous n’avez qu’à essayer
pour voir. D'ailleurs, en mode insertion, c'est la seule chose qui
fonctionne.
:w : enregistrer le fichier
:q : quitter
Placez le curseur sur une lettre en mode interactif puis appuyez sur
x pour l'effacer.
On peut aller plus loin et effacer plusieurs lettres d'un coup. Pour
cela, utilisez la formule suivante :
(nombre)x
Par exemple, si vous tapez4x(4 puis x), vous supprimerez les quatre
prochaines lettres en partant du curseur.
93
Encore une fois, ne vous étonnez pas si juste après avoir tapé2rien
ne s'affiche à l'écran. L'information est gardée en mémoire par
Vim, mais l'action ne sera vraiment exécutée que lorsque vous
aurez tapé entièrement2dd.
dw : supprimer un mot
p : coller
Si vous avez fait une faute sur une lettre seulement, vous pouvez
passer en mode remplacement.
G : sauter à la ligne n° X
/ : rechercher un mot
:r : fusion de fichiers
Le fichier est ouvert une seconde fois (ce qui vous permet de voir
deux endroits différents du fichier à la fois) mais il est bien entendu
possible d'ouvrir deux fichiers différents. Pour cela, ajoutez le nom
du fichier à ouvrir à la suite de la commande ::sp autrefichier.
Bonne nouvelle : l'autocomplétion à l’aide de la
toucheTabfonctionne aussi dans Vim !
:set option
:set nooption
:set option=valeur
101
:set option?
$ cp /etc/vim/vimrc ~/.vimrc
$ vim .vimrc
" This line should not be removed as it ensures that various options
are
" properly set to work with the Vim-
related packages available in Debian.
runtime! debian.vim
" If using a dark background within the editing area and syntax hig
hlighting
" turn on this option as well
syntax on
103
Par défaut, la coloration de Vim est plus adaptée aux fonds clairs.
Les commentaires, par exemple, sont écrits en bleu foncé sur
noir… ce qui n’est pas très lisible.
Si votre console est sur fond noir (comme chez moi), je vous
recommande d'activer la prochaine optionbackgroundet de la
mettre àdark.
set background=dark
set number
set showcmd
ignorecase : ignorer la casse lors de la recherche
set ignorecase
mouse : activer le support de la souris
set mouse=a
Désormais, vous pourrez cliquer avec la souris sur une lettre pour y
déplacer le curseur directement. Vous pourrez également utiliser
la molette de la souris pour vous déplacer dans le fichier.
En résumé
l'environnement console ;
l'environnement graphique.
Que faut-il savoir ? Tout d'abord que l'ancêtre de tous les shells est
le sh (Bourne Shell). C'est le plus vieux et il est installé sur tous les OS
basés sur Unix. Il est néanmoins pauvre en fonctionnalités par
rapport aux autres shells.
Voici dans les grandes lignes comment ont évolué les shells.
Chacun hérite de la plupart des fonctionnalités de son ancêtre
(figure suivante).
108
À quoi peut bien servir le sh aujourd'hui alors, si bash est par défaut
sous Linux ?
sh reste toujours plus répandu que bash. En fait, vous pouvez être
sûrs que tous les OS basés sur Unix possèdent sh, mais ils n'ont pas
tous forcément bash. Certains OS basés sur Unix, notamment les
OS propriétaires (AIX et Solaris…), utilisent d'autres types de shells ;
le ksh y est par exemple très répandu.
111
$ chsh
Si je vous parle de cela, c'est parce qu'un script shell dépend d'un
shell précis. En gros, le langage n'est pas tout à fait le même selon
que vous utilisez sh, bash, ksh, etc.
Création du fichier
$ vim essai.sh
Si essai.sh n'existe pas, il sera créé (ce qui sera le cas ici).
J'ai donné ici l'extension .sh à mon fichier. On le fait souvent par
convention pour indiquer que c'est un script shell, mais sachez que
ce n'est pas une obligation. Certains scripts shell n'ont d'ailleurs pas
d'extension du tout. J'aurais donc pu appeler mon script essai tout
court.
Vim est maintenant ouvert et vous avez un fichier vide sous les
yeux.
#!/bin/bash
Exécution de commandes
#!/bin/bash
ls
C'est tout !
Les commentaires
Notez que vous pouvez aussi ajouter des commentaires dans votre
script. Ce sont des lignes qui ne seront pas exécutées mais qui
permettent d'expliquer ce que fait votre script.
#!/bin/bash
Si vous faites un ls -l pour voir votre fichier qui vient d'être créé,
vous obtenez ceci :
$ ls -l
total 4
-rw-r--r-- 1 mateo21 mateo21 17 2009-03-13 14:33 essai.sh
Ce qui nous intéresse ici, ce sont les droits sur le fichier : -rw-r--r--.
Si vous vous souvenez un petit peu du chapitre sur les droits, vous
devriez vous rendre compte que notre script peut être lu par tout
le monde (r), écrit uniquement par nous (w), et n'est pas
exécutable (pas de x).
$ chmod +x essai.sh
$ ls -l
116
total 4
-rwxr-xr-x 1 mateo21 mateo21 17 2009-03-13 14:33 essai.sh
Exécution du script
$ ./essai.sh
essai.sh
Que fait le script ? Il fait juste un ls, donc il affiche la liste des
fichiers présents dans le répertoire (ici, il y avait seulement essai.sh
dans mon répertoire).
Vous pouvez déjà modifier votre script pour qu'avant tout chose il
vous donne également le nom du répertoire dans lequel vous
vous trouvez :
#!/bin/bash
pwd
ls
$ ./essai.sh
/home/mateo21/scripts
essai.sh
117
Exécution de débogage
$ bash -x essai.sh
$ bash -x essai.sh
+ pwd
/home/mateo21/scripts
+ ls
essai.sh
Créer sa propre commande
Ils sont placés dans un des répertoires du PATH. Le PATH est une
variable système qui indique où sont les programmes exécutables
sur votre ordinateur. Si vous tapez echo $PATH vous aurez la liste
de ces répertoires « spéciaux ».
Une fois que c'est fait, vous pourrez alors taper simplement essai.sh
pour exécuter votre programme et ce quel que soit le répertoire
dans lequel vous vous trouverez !
$ essai.sh
/home/mateo21/scripts
essai.sh
En résumé
$ vim variables.sh
La première ligne de tous nos scripts doit indiquer quel shell est
utilisé, comme nous l'avons appris plus tôt. Commencez donc par
écrire :
#!/bin/bash
#!/bin/bash
Exécutez-le pour voir ce qui se passe (après avoir modifié les droits
pour le rendre exécutable, bien sûr) :
$ ./variables.sh
$
Il ne se passe rien !
Salut ;
tout ;
le ;
monde.
Pour afficher une variable, nous allons de nouveau utiliser son nom
précédé du symbole dollar$ :
#!/bin/bash
Résultat :
#!/bin/bash
Les quotes
message=`pwd`
echo "Vous êtes dans le dossier $message"
Vous êtes dans le dossier /home/mateo21/bin
Cela peut paraître un peu tordu, mais c'est réellement utile. Nous
nous en resservirons dans les chapitres suivants.
read nomvariable
Adaptons notre script pour qu'il nous demande notre nom puis
qu’il nous l'affiche :
#!/bin/bash
read nom
echo "Bonjour $nom !"
Mathieu
Bonjour Mathieu !
#!/bin/bash
Read lit ce que vous tapez mot par mot (en considérant que les
mots sont séparés par des espaces). Il assigne chaque mot à une
variable différente, d'où le fait que le nom et le prénom ont été
correctement et respectivement assignés à$nomet$prenom.
Si vous rentrez plus de mots au clavier que vous n'avez prévu de
variables pour en stocker, la dernière variable de la liste
récupèrera tous les mots restants. En clair, si j'avais tapé pour le
125
Bon : notre programme n'est pas très clair et nous devrions afficher
un message pour que l'utilisateur sache quoi faire. Avec l'option-
pderead, vous pouvez faire cela :
#!/bin/bash
Résultat :
C'est mieux !
Exemple :
#!/bin/bash
#!/bin/bash
#!/bin/bash
read -
p 'Entrez le code de désamorçage de la bombe (vous avez 5 sec
ondes) : ' -t 5 code
echo -e "\nBoum !"
-s : ne pas afficher le texte saisi
#!/bin/bash
#!/bin/bash
l'addition : + ;
la soustraction : - ;
la multiplication : * ;
la division : / ;
la puissance : ** ;
le modulo (renvoie le reste de la division entière) : %.
Quelques exemples :
… équivaut à écrire :
Actuellement, les variables que vous créez dans vos scripts bash
n'existent que dans ces scripts. En clair, une variable définie dans
un programme A ne sera pas utilisable dans un programme B.
$ env
ORBIT_SOCKETDIR=/tmp/orbit-mateo21
GLADE_PIXMAP_PATH=:/usr/share/glade3/pixmaps
TERM=xterm
SHELL=/bin/bash
GTK_MODULES=canberra-gtk-module
USER=mateo21
PATH=/home/mateo21/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin: /
usr/bin:/sbin:/bin:/usr/games
GDM_XSERVER_LOCATION=local
129
PWD=/home/mateo21/bin
EDITOR=nano
SHLVL=1
HOME=/home/mateo21
OLDPWD=/home/mateo21
[ ... ]
Notez que les noms de ces variables sont, par convention, écrits
en majuscules.
Comment utiliser ces variables dans vos scripts ? C'est très simple, il
suffit de les appeler par leur nom !
Exemple :
#!/bin/bash
Comme toutes les commandes, vos scripts bash peuvent eux aussi
accepter des paramètres. Ainsi, on pourrait appeler notre script
comme ceci :
Essayons :
#!/bin/bash
#!/bin/bash
Les tableaux
echo ${tableau[2]}
tableau[2]='valeur2'
#!/bin/bash
Réponse :
valeur1
#!/bin/bash
LES CONDITIONS
Si
SI test_de_variable
ALORS
------> effectuer_une_action
FIN SI
if [ test ]
then
echo "C'est vrai"
fi
if [ test ]; then
echo "C'est vrai"
fi
#!/bin/bash
nom="Bruno"
if [ $nom = "Bruno" ]
then
echo "Salut Bruno !"
fi
Salut Bruno !
Notez aussi que vous pouvez tester deux variables à la fois dans le
if :
#!/bin/bash
nom1="Bruno"
nom2="Marcel"
if [ $nom1 = $nom2 ]
then
echo "Salut les jumeaux !"
fi
Sinon
SI test_de_variable
ALORS
------> effectuer_une_action
SINON
------> effectuer_une_action
FIN SI
if [ test ]
then
echo "C'est vrai"
else
echo "C'est faux"
fi
#!/bin/bash
nom="Bruno"
if [ $nom = "Bruno" ]
then
echo "Salut Bruno !"
else
echo "J'te connais pas, ouste !"
fi
#!/bin/bash
if [ $1 = "Bruno" ]
then
echo "Salut Bruno !"
else
echo "J'te connais pas, ouste !"
fi
137
$ ./conditions.sh Bruno
Salut Bruno !
$ ./conditions.sh Jean
J'te connais pas, ouste !
Sinon si
SI test_de_variable
ALORS
------> effectuer_une_action
SINON SI autre_test
ALORS
------> effectuer_une_action
SINON SI encore_un_autre_test
ALORS
------> effectuer_une_action
SINON
------> effectuer_une_action
FIN SI
Sachez que l'on peut mettre autant de « sinon si » que l'on veut ;
là, j'en ai mis deux. En revanche, on ne peut mettre qu'un seul
« sinon », qui sera exécuté à la fin si aucune des conditions
précédentes n'est vérifiée.
if [ test ]
then
echo "Le premier test a été vérifié"
elif [ autre_test ]
then
echo "Le second test a été vérifié"
elif [ encore_autre_test ]
then
echo "Le troisième test a été vérifié"
else
echo "Aucun des tests précédents n'a été vérifié"
fi
#!/bin/bash
if [ $1 = "Bruno" ]
then
echo "Salut Bruno !"
elif [ $1 = "Michel" ]
then
echo "Bien le bonjour Michel"
elif [ $1 = "Jean" ]
then
echo "Hé Jean, ça va ?"
else
echo "J'te connais pas, ouste !"
fi
Les tests
Voyons maintenant un peu quels sont les tests que nous pouvons
faire. Pour l'instant, on a juste vérifié si deux chaînes de caractères
étaient identiques, mais on peut faire beaucoup plus de choses
que cela !
#!/bin/bash
if [ $1 != $2 ]
then
echo "Les 2 paramètres sont différents !"
else
echo "Les 2 paramètres sont identiques !"
fi
$ ./conditions.sh Bruno Bernard
Les 2 paramètres sont différents !
$ ./conditions.sh Bruno Bruno
Les 2 paramètres sont identiques !
Condition Signification
Vérifie si les deux chaînes sont identiques. Notez
$chaine1 = $chaine2
que bash est sensible à la casse : « b » est donc
140
Condition Signification
différent de « B ».
Il est aussi possible d'écrire « == » pour les habitués
du langage C.
$chaine1 != $chaine2 Vérifie si les deux chaînes sont différentes.
-z $chaine Vérifie si la chaîne est vide.
-n $chaine Vérifie si la chaîne est non vide.
#!/bin/bash
if [ -z $1 ]
then
echo "Pas de paramètre"
else
echo "Paramètre présent"
fi
$ ./conditions.sh
Pas de paramètre
$ ./conditions.sh param
Paramètre présent
Tests sur des nombres
Condition Signification
Vérifie si les nombres sont égaux (equal). À ne pas
$num1 -
confondre avec le « = » qui, lui, compare deux chaînes de
eq $num2
caractères.
141
Condition Signification
Vérifie si les nombres sont différents (nonequal).
$num1 -
Encore une fois, ne confondez pas avec « != » qui est
ne $num2
censé être utilisé sur des chaînes de caractères.
$num1 -
Vérifie sinum1est inférieur ( < ) ànum2(lowerthan).
lt $num2
$num1 - Vérifie sinum1est inférieur ou égal ( <= )
le $num2 ànum2(lowerorequal).
$num1 -
Vérifie sinum1est supérieur ( > ) ànum2(greaterthan).
gt $num2
$num1 - Vérifie sinum1est supérieur ou égal ( >= )
ge $num2 ànum2(greaterorequal).
#!/bin/bash
if [ $1 -ge 20 ]
then
echo "Vous avez envoyé 20 ou plus"
else
echo "Vous avez envoyé moins de 20"
fi
$ ./conditions.sh 23
Vous avez envoyé 20 ou plus
$ ./conditions.sh 11
Vous avez envoyé moins de 20
Tests sur des fichiers
Un des avantages de bash sur d'autres langages est que l'on peut
très facilement faire des tests sur des fichiers : savoir s'ils existent, si
on peut écrire dedans, s'ils sont plus vieux, plus récents, etc. Le
tableau suivant présente les différents types de tests disponibles.
Condition Signification
-e $nomfichier Vérifie si le fichier existe.
-d $nomfichier Vérifie si le fichier est un répertoire. N'oubliez pas que
142
Condition Signification
sous Linux, tout est considéré comme un fichier, même
un répertoire !
Vérifie si le fichier est un… fichier. Un vrai fichier cette
-f $nomfichier
fois, pas un dossier.
-L $nomfichier Vérifie si le fichier est un lien symbolique (raccourci).
-r $nomfichier Vérifie si le fichier est lisible (r).
-w $nomfichier Vérifie si le fichier est modifiable (w).
-x $nomfichier Vérifie si le fichier est exécutable (x).
$fichier1 -
Vérifie sifichier1est plus récent quefichier2(newerthan).
nt $fichier2
$fichier1 -
Vérifie sifichier1est plus vieux quefichier2(olderthan).
ot $fichier2
#!/bin/bash
if [ -d $repertoire ]
then
echo "Bien, vous avez compris ce que j'ai dit !"
else
echo "Vous n'avez rien compris..."
fi
Entrez un répertoire : /home
Bien, vous avez compris ce que j'ai dit !
Entrez un répertoire : rienavoir.txt
Vous n'avez rien compris...
&& : signifie « et » ;
|| : signifie « ou ».
#!/bin/bash
$ ./conditions.sh koala
Bravo !
Vous connaissez le mot de passe
Notez que les tests sont effectués l'un après l'autre et seulement s'ils
sont nécessaires. Bash vérifie d'abord s'il y a au moins un
paramètre. Si ce n'est pas le cas, il ne fera pas le second test
puisque la condition ne sera de toute façon pas vérifiée.
144
Inverser un test
if [ ! -e fichier ]
then
echo "Le fichier n'existe pas"
fi
#!/bin/bash
if [ $1 = "Bruno" ]
then
echo "Salut Bruno !"
elif [ $1 = "Michel" ]
then
echo "Bien le bonjour Michel"
elif [ $1 = "Jean" ]
then
echo "Hé Jean, ça va ?"
else
echo "J'te connais pas, ouste !"
fi
#!/bin/bash
case $1 in
"Bruno")
echo "Salut Bruno !"
;;
"Michel")
echo "Bien le bonjour Michel"
;;
"Jean")
echo "Hé Jean, ça va ?"
;;
*)
echo "J'te connais pas, ouste !"
;;
esac
case $1 in
"Bruno")
Là, on teste une valeur. Cela signifie « Si$1est égal à Bruno ». Notez
que l'on peut aussi utiliser une étoile comme joker : « B* »
acceptera tous les mots qui commencent par un B majuscule.
;;
146
*)
esac
#!/bin/bash
case $1 in
"Chien" | "Chat" | "Souris")
echo "C'est un mammifère"
;;
"Moineau" | "Pigeon")
echo "C'est un oiseau"
;;
*)
echo "Je ne sais pas ce que c'est"
;;
esac
En résumé
LES BOUCLES
Les consignes sont les mêmes que pour le chapitre sur les
conditions : il faut être vigilant sur la syntaxe. Une espace de trop
ou de moins, l'oubli d'un caractère spécial et plus rien ne
fonctionne. Soyez donc très rigoureux lorsque vous codez !
while [ test ]
do
echo 'Action en boucle'
done
while [ test ]; do
148
#!/bin/bash
Comme il s'agit d'un OU (||), tant que l'un des deux tests est vrai,
on recommence la boucle. Cette dernière pourrait se traduire
par : « Tant que la réponse est vide ou que la réponse est
différente de oui ».Nous sommes obligés de vérifier d'abord si la
variable n'est pas vide, car si elle l'est, le second test plante
(essayez, vous verrez).
Essayons ce script :
Il existe aussi le mot clé until, qui est l'exact inverse de while. Il
signifie « Jusqu'à ce que ».Remplacez juste while par until dans le
code précédent pour l'essayer.
149
#!/bin/bash
Vous pouvez donc vous servir du for pour faire une boucle sur une
liste de valeurs que vous définissez :
150
#!/bin/bash
#!/bin/bash
liste_fichiers=`ls`
#!/bin/bash
for fichier in `ls`
do
echo "Fichier trouvé : $fichier"
done
#!/bin/bash
$ ls
boucles.sh conditions.sh variables.sh
$ ./boucles.sh
$ ls
boucles.sh-old conditions.sh-old variables.sh-old
./multirenommage.sh *.txt
#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done
152
1
2
3
4
5
6
7
8
9
10
En résumé
LES FONCTIONS
# déclaration méthode 1
maFonction ()
{
bloc d’instructions
}
#appel de ma fonction
maFonction
154
ou
# déclaration méthode 2
function maFonction
{
bloc d’instructions
}
#appel de la fonction
maFonction
Par exemple :
Lorsque vous ne vous posez plus de questions, c’est qu’il est temps
d’ordonner toutes les informations.
155
En résumé :