Bonjour,

J'aimerai améliorer mon script, c'est à dire fusionner la ligne 7 et la ligne 8 en une et une seule ligne.

Le script fait la chose suivante :
On va supposer que dans un fichier il y est une série de ligne avec le format suivant :
Path: premier_serveur!deuxieme_serveur!troisième_serveur!...!n_serveur!not-for-mail

Le but est d'avoir ceci :
premier_serveur
deuxieme_serveur
troisieme_serveur
...
n_serveur
not-for-mail

J'ai créé un fichier texte que j'ai appelé message.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
cat message.txt
Path: premier_serveur!deuxieme_serveur!troisieme_serveur!not-for-mail
Le script bash que j'ai fait fonctionne.
Cependant les améliorations que j'ai tenté d'apporter afin de fusionner la ligne 7 et la ligne 8 en une et une seule ligne se sont avérées infructueuses.
En effet cela boucle à l'infini et je ne comprends pas pourquoi.
Es ce que vous pouvez m'expliquer pourquoi ?

Ci dessous le script qui fonctionne + les 2 tentatives d'améliorations (échecs) avec les commentaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48
49
50
51
 
#!/bin/bash
#Script qui fonctionne
#============================================
ligne=$(grep "Path: ")
liste_serveurs=${ligne#Path: }
while [ -n "$liste_serveurs" ]
do
	serveur=${liste_serveurs%%\!*} # premier élement (le point d'exclamation est supp)
	liste_serveurs=${liste_serveurs#$serveur} # on l'enlève de la liste
	liste_serveurs=${liste_serveurs#\!} # on supprimer le point d'exclamation restant
	echo $serveur
done
#============================================
 
#===========================================================================================
# POSSIBILITE D'AMÉLIORATION :
# faire de la ligne 7 et la ligne 8 une et une seule ligne
#===========================================================================================
 
<<commentaire
Première tentative :
==================
ligne=$(grep "Path: ")
liste_serveurs=${ligne#Path: }
while [ -n "$liste_serveurs" ]
do
	serveur=${liste_serveurs%%\!*}
	liste_serveurs=${liste_serveurs#${serveur}\!}
	echo $serveur
done
 
Résultat :
Boucle infinie et affiche not-for-mail (le dernier élément de la liste)
==================
 
Deuxième tentative :
==================
ligne=$(grep "Path: ")
liste_serveurs=${ligne#Path: }
while [ -n "$liste_serveurs" ]
do
	serveur=${liste_serveurs%%\!*}
	liste_serveurs=${liste_serveurs#$\{serveur\}\!}
	echo $serveur
done
 
Résultat :
Boucle infinie et affiche premier_serveur (le premier élément de la liste)
==================
commentaire