Il y a plusieurs instructions répétitives dans ce script et on peut simplifier tout cela en utilisant des
tableaux.
Un
tableau est un peu comme une variable, à la différence près qu'il comporte plusieurs cases. Par exemple, on peut définir un tableau
nom regroupant les noms de toutes ces interfaces graphiques :
Code : Bash | set nom = (Twm Fluxbox KDE LXDE Xfce GNOME Enlightenment)
|
Vous le voyez, un tableau se remplit avec
set, comme pour une variable simple, mais on utilise des parenthèses pour regrouper ses différentes cases. Ici, nous avons un tableau de 7 cases. Pour afficher le contenu de l'une d'elles :
Code : Bash
Cette instruction affiche le contenu de la 4ème case du tableau, c'est-à-dire
LXDE.
Et pour afficher la totalité du tableau (sans les parenthèses) :
Code : Bash
De la même manière, on peut définir un tableau pour la lettre représentant chaque interface et un autre pour la commande qui la lance. Comme toutes ces commandes commencent par
/usr/local/, il n'est pas utile de répéter cette partie :
Code : Bash | set lettre = (T F K L X G E)
set commande = (bin/twm bin/startfluxbox kde4/bin/startkde bin/startlxde bin/startxfce4\
bin/gnome-session bin/enlightenment_start)
|
Comme le tableau
commande est assez long, on ne peut pas tout faire tenir sur une seule ligne. On utilise donc le caractère
\, qui signifie qu'on continue une instruction à la ligne suivante.
Du coup, au début du script, on peut remplacer les lignes :
Code : Bash | if (-x /usr/local/bin/twm) echo 'T : Twm' >> menuBureaux
if (-x /usr/local/bin/startfluxbox) echo 'F : Fluxbox' >> menuBureaux
|
par
Code : Bash | if (-x /usr/local/$commande[1]) echo "$lettre[1] : $nom[1]" >> menuBureaux
if (-x /usr/local/$commande[2]) echo "$lettre[2] : $nom[2]" >> menuBureaux
|
Cette fois-ci, il faut obligatoirement utiliser des guillemets
" " après
echo, et pas des apostrophes
' '. Regardez la différence :
Code : Bash | echo "$lettre[1] : $nom[1]"
echo '$lettre[1] : $nom[1]'
|
Ce code affiche :
Code : Console | T : Twm
$lettre[1] : $nom[1] |
Nous pouvons maintenant réécrire le début du script : la création du fichier
menuBureaux.
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #!/bin/csh
#Definition des tableaux
set nom = (Twm Fluxbox KDE LXDE Xfce GNOME Enlightenment)
set lettre = (T F K L X G E)
set commande = (bin/twm bin/startfluxbox kde4/bin/startkde bin/startlxde bin/startxfce4\
bin/gnome-session bin/enlightenment_start)
#Creation du menu
if (-e menuBureaux) rm menuBureaux
foreach i (1 2 3 4 5 6 7)
if (-x /usr/local/$commande[$i]) echo "$lettre[$i] : $nom[$i]" >> menuBureaux
end
|
Par la même occasion, on peut en profiter pour créer un tableau
disponible, dans lequel on enregistrera si chaque interface est disponible ou pas sur votre système. Essayez de modifier le code vous-mêmes.
Secret (cliquez pour afficher)Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/bin/csh
#Definition des tableaux
set nom = (Twm Fluxbox KDE LXDE Xfce GNOME Enlightenment)
set lettre = (T F K L X G E)
set commande = (bin/twm bin/startfluxbox kde4/bin/startkde bin/startlxde bin/startxfce4\
bin/gnome-session bin/enlightenment_start)
set disponible = (0 0 0 0 0 0 0)
#Creation du menu
if (-e menuBureaux) rm menuBureaux
foreach i (1 2 3 4 5 6 7)
if (-x /usr/local/$commande[$i]) then
echo "$lettre[$i] : $nom[$i]" >> menuBureaux
set disponible[$i] = 1
endif
end
|
Si vous avez Twm, Fluxbox et GNOME, le tableau
disponible contiendra alors :
1 1 0 0 0 1 0. Vous pouvez vérifier avec
echo $disponible, si vous voulez. Ce tableau va nous être très utile dans la suite du script.
Ensuite, l'utilisateur fait son choix :
Code : Bash | #Echange avec l'utilisateur
set choisi = 0
while ($choisi == 0)
echo "Choisissez votre interface graphique :"
cat menuBureaux
set choix=$<
...
end
|
Pour pouvoir tester les prochaines étapes, nous allons retirer la boucle while pour le moment.
L'utilisateur tape alors une lettre. Il faut vérifier si celle-ci correspond à l'une des cases du tableau
lettre et récupérer le numéro de cette case. Pour ça, on se sert d'une boucle
foreach :
Code : Bash | foreach i (1 2 3 4 5 6 7)
if (lettre[$i] == $choix && disponible[$i] == 1) then
set choisi = 1
echo "exec /usr/local/$commande[$i]" > .xinitrc
echo "Votre prochaine session emploiera l'interface graphique $nom[$i]."
endif
end
|
Là, il y a deux conditions dans le
if, séparées par le symbole
&&, qui signifie
ET.
- Première condition : le contenu de la case i du tableau lettre correspond à ce que l'utilisateur a tapé.
- Seconde condition : l'interface i est disponible, d'après le tableau disponible.
Les instructions suivant le
then sont exécutées uniquement si les deux conditions sont vraies. Si on veut exécuter une série d'instruction dès que l'une des deux conditions est vraie, il faut les séparer par le symbole
||, qui signifie
OU.
Si on veut continuer à distinguer "gestionnaire de fenêtres" et "bureau" dans le message de la ligne 5, il faut introduire une nouvelle variable et un test supplémentaire :
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12 | foreach i (1 2 3 4 5 6 7)
if ($lettre[$i] == $choix && $disponible[$i] == 1) then
set choisi = 1
if ($i < 3) then
set interface = "gestionnaire de fenetres"
else
set interface = "bureau"
endif
echo "exec /usr/local/$commande[$i]" > .xinitrc
echo "Votre prochaine session emploiera le $interface $nom[$i]."
endif
end
|
Si
$i < 3, c'est que l'utilisateur a choisi
Twm ou
Fluxbox, qui sont des gestionnaires de fenetres. Sinon, c'est qu'il a choisi un bureau.
Maintenant que ces problèmes sont réglés, on peut remettre la boucle
while, au cas où l'utilisateur taperait n'importe quoi ou demanderait une interface non disponible.
Le script complet est alors :
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 | #!/bin/csh
#Definition des tableaux
set nom = (Twm Fluxbox KDE LXDE Xfce GNOME Enlightenment)
set lettre = (T F K L X G E)
set commande = (bin/twm bin/startfluxbox kde4/bin/startkde bin/startlxde bin/startxfce4\
bin/gnome-session bin/enlightenment_start)
set disponible = (0 0 0 0 0 0 0)
#Creation du menu
if (-e menuBureaux) rm menuBureaux
foreach i (1 2 3 4 5 6 7)
if (-x /usr/local/$commande[$i]) then
echo "$lettre[$i] : $nom[$i]" >> menuBureaux
set disponible[$i] = 1
endif
end
#Echange avec l'utilisateur
set choisi = 0
echo "Choisissez votre interface graphique :"
cat menuBureaux
set choix=$<
#Modification de .xinitrc
while ($choisi == 0)
foreach i (1 2 3 4 5 6 7)
if ($lettre[$i] == $choix && $disponible[$i] == 1) then
set choisi = 1
if ($i < 3) then
set interface = "gestionnaire de fenetres"
else
set interface = "bureau"
endif
echo "exec /usr/local/$commande[$i]" > .xinitrc
echo "Votre prochaine session emploiera le $interface $nom[$i]."
endif
end
end
echo "Voici votre nouveau fichier .xinitrc :"
cat .xinitrc
|
Comme il y a plusieurs boucles et conditions imbriquées, les
indentations sont maintenant indispensables pour s'y retrouver.