Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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. hmm

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