#1 Le 09/08/2012, à 09:17
- Ariania
Boucle for avec incrémentation de variable en shell [Résolu]
Bonjour,
Je voudrais votre aide concernant un programme que j'écris en shell.
Le but de mon programme est de lire un fichier 'T2.txt' de la forme
define host {
host_name=localhost
x =
y =
}
define host {
host_name=localhost1
x =
y =
}
......
qui se répète un nombre de fois inconnue.
Et de rajouter à des variables après "x = " . Jusque la j'arrive mais par la suite cela se complique car j'initialise dans mon programme une variable "X = 258" et je voudrais que pour le "localhost" le x = 258 pour le "localhost2" le x = 278.
Donc je voudrais incrémenter le x de 20 pour chaque host et l'écrire dans le fichier.
Est ce possible?
J'ai écrit ce programme:
#!/bin/bash
c=258
for i in T2.txt
do
(( c=c + 50 ));
sed 's/\x=/&'$c'/g' T2.txt > T.txt;
done
Mais le résultat est cela :
define host {
host_name=localhost
x=308
y=
}
et le x reste a 308 pour tous les hosts
J'espère que j'ai été claire sinon je peux vous expliquer en cas de doute.
Merci d'avance de vos réponse.
Cordialement,
Dernière modification par Ariania (Le 09/08/2012, à 11:08)
Hors ligne
#2 Le 09/08/2012, à 10:02
- pingouinux
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Bonjour,
c=258
while read lig
do
[[ ${lig%%=*} == host_name ]] && ((c+=20))
sed "s/x *=/&$c/" <<<"$lig"
done <T2.txt
Voici le résultat sur ton exemple :
define host {
host_name=localhost
x =278
y =
}
define host {
host_name=localhost1
x =298
y =
}
Hors ligne
#3 Le 09/08/2012, à 10:07
- Ariania
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Bonjour,
Vous etes mon sauveur. Parce que je casse la tete depuis 2 jours. Et vous avez trouvé cela tout de suite.
Merci beaucoup, je m'en vais tester et je vous tiens au courant.
Cordialement,
Hors ligne
#4 Le 09/08/2012, à 10:12
- Ariania
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Re-Bonjour,
Une autre question encore désolé de vous importuner.
Le programme que vous m'avez donné n'écrit pas dans le fichier comment dois je faire pour ?
Cordialement,
Hors ligne
#5 Le 09/08/2012, à 10:15
- pingouinux
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Explications sur ce que tu avais fait :
#!/bin/bash
c=258
for i in T2.txt
do
(( c=c + 50 ));
sed 's/\x=/&'$c'/g' T2.txt > T.txt;
done
Tu ne passes qu'une seule fois dans la boucle, et la variable i contient T2.txt, mais n'est pas utilisée.
sed n'est donc exécuté qu'une seul fois, et modifie de la même façon toutes les lignes contenant "x =". Tu as d'ailleurs oublié l'espace entre x et = dans ton script.
Hors ligne
#6 Le 09/08/2012, à 10:17
- pingouinux
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Réponse à #4 : (Seule la dernière ligne est modifiée)
c=258
while read lig
do
[[ ${lig%%=*} == host_name ]] && ((c+=20))
sed "s/x *=/&$c/" <<<"$lig"
done <T2.txt >T.txt
Hors ligne
#7 Le 09/08/2012, à 10:21
- Ariania
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Merci beaucoup pour l'explication de mon programme qui ne fonctionnait pas. Je comprend mieux d'où venait mon erreur. Ètant nouvelle dans le développement en shell je comprend petit à petit.
Merci aussi pour votre dernière réponse.
Merci énormément pour votre réactivité grace à vous je vais pouvoir continuer mon projet.
Cordialement,
PS: Une dernière chose comment je fais pour mettre le post en résolu
Hors ligne
#8 Le 09/08/2012, à 10:23
- pingouinux
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Il faut modifier ton premier message, et ajouter [Résolu] dans le titre.
Bonne continuation. Peut-être à une autre fois.
Hors ligne
#9 Le 09/08/2012, à 10:23
- Ariania
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Merci beaucoup à vous aussi
Hors ligne
#10 Le 09/08/2012, à 10:44
- Ariania
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Re-Bonjour,
Une autre question je voudrais ècrire une valeur fixe pour y dans le fichier.
J'ai trouvé cette solution mais elle m'à l'air un peu lourde:
#!/bin/bash
c=253
b=241
while read lig
do
[[ ${lig%%=*} == host_name ]] && ((c+=40))
sed "s/x *=/& $c/" <<<"$lig"
done <T2.txt >T.txt
while read lig
do
[[ ${lig%%=*} == host_name ]]
sed "s/y *=/& $b/" <<<"$lig"
done <T.txt >T1.txt
rm -rf T.txt
Qu'en pensez-vous?
Merci
PS: j'ai enlevé [Résolu] j'espère que l'on q le droit.
Hors ligne
#11 Le 09/08/2012, à 10:57
- pingouinux
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Pourquoi ne pas tout faire en une seule fois ?
#!/bin/bash
c=253
b=241
while read lig
do
[[ ${lig%%=*} == host_name ]] && ((c+=40))
sed "s/x *=/& $c/;s/y *=/& $b/" <<<"$lig"
done <T2.txt >T.txt
Hors ligne
#12 Le 09/08/2012, à 11:04
- Ariania
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Oui J'y ai pensé mais mon erreur était la suivante:
#!/bin/bash
c=253
b=241
while read lig
do
[[ ${lig%%=*} == host_name ]] && ((c+=40))
sed "s/x *=/& $c/" <<<"$lig"
sed "s/y *=/& $b/" <<<"$lig"
done <T2.txt >T.txt
Ce qui ne fonctionnait pas du tt c'est pour cela que je me suis rabattu sur cette solution.
Merci beaucoup je pense que le sujet est vraiment résolu.
Hors ligne
#13 Le 09/08/2012, à 11:08
- pingouinux
Re : Boucle for avec incrémentation de variable en shell [Résolu]
Normal. Chacun des sed sortait une ligne, ce qui fait que tout était en double.
Hors ligne
#14 Le 09/08/2012, à 11:13
- Ariania
Re : Boucle for avec incrémentation de variable en shell [Résolu]
ah oui c'est exactement ce qui se passait.
Je comprend mieux.
Merci beaucoup.
Hors ligne