récupèration de paramètres - Shell/Batch - Programmation
Marsh Posté le 10-05-2006 à 10:55:53
ReplyMarsh Posté le 10-05-2006 à 14:19:57
bassene a écrit : J'ai un fichier properties1.conf composer de paramétres : |
Il suffit de lire chaque ligne de "properties2" et, si la ligne est dans "properties1", la remplacer par celle-là sinon la garder telle qu'elle
bassene a écrit : je veux un script shell |
Bien Monseigneur...
#!/bin/sh |
Tu lances le script qui t'affiche à l'écran le résultat. Si c'est correct, tu le rediriges vers un fichier que tu renommes ensuite en "properties2.conf"
PepMat a écrit : Regarde FOR /F avec les options Delims et Tokens |
Il parle de script shell Unix, pas batch MsDOS !!!
Marsh Posté le 10-05-2006 à 16:54:07
Sve@r a écrit : Il parle de script shell Unix, pas batch MsDOS !!! |
Oups, ^^
désolé
en meme temps c'est meme pas écrit dans le titre,
alors je rejète la faute sur le manque de clarté.
De plus, je pensais que la politique de la maison était d'éviter de donner la solution sur un plateau à toute personne qui 'exige' du code sans montrer ce qu'il a déjà produit.
Tu es trop gentil de lui macher tout le travail.
Marsh Posté le 10-05-2006 à 18:23:09
PepMat a écrit : Oups, ^^ |
C'est vrai que le terme "script shell" est noyé dans la masse. Moi, c'est en voyant "systeme=unix" que j'ai compris; puis ensuite j'ai vu "script shell".
PepMat a écrit : Tu es trop gentil de lui macher tout le travail. |
En fait, ce sujet m'a intéressé parce que je ne voyais pas, au début, comment le faire. Mais c'est vrai que 1) vu sa façon de donner des ordres et 2) vu la politique de forum, j'aurais vraiment pas dû.
On mettra ça sur le compte "jour de bonté"
Marsh Posté le 11-05-2006 à 11:24:56
bonjour,
merci du coup de main,
en ce moment j'ai chngé de méthode :
j'ai un fichier qui propertiesParam qui contient une liste de paramétres genre :
--propertiesParam.txt--
system;
soundcard;
disk;
memory;
et le script va sur le fichier properties.conf récupérer la valeur de ces paramètres que sont :
system=unix
soundcard=creative
disk=20
memory=512
ainsi un nouveau fichier est générè avec le nouveau contenu des paramètre.
voici mon code :
. ./propertiesParam.txt
typeset -i i=1
MYSEDPARAM=""
while [ "$PARAMN" -ge "$i" ] ; do
MYSEDPARAM="$MYSEDPARAM | sed -e \"s/\$IN$i/\$OUT$i/\""
i=$(($i+1))
done
#echo "MYSEDPARAM=$MYSEDPARAM"
$MYSEDPARAM > propertiestest.tmp
avec ce bout de code j'arrive via un sed à faire les report de valeurs mais cé pas encore ce que je cherche.
Merci de prendre de votre temps pour me lire.
Marsh Posté le 11-05-2006 à 19:19:37
bassene a écrit : . ./propertiesParam.txt |
J'arrive pas à comprendre pourquoi tu exécutes "propertiesParam.txt" comme si c'était un shell.
Si encore il contenait des lignes "token=valeur" tu obtiendrais des variables mais là...
bassene a écrit : MYSEDPARAM="$MYSEDPARAM | sed -e \"s/\$IN$i/\$OUT$i/\"" |
Je ne comprends rien à cette ligne. Il te manque "echo" pour que la variable soit affichée et envoyée dans le sed. Et il te manque les backquottes pour que le résultat de cette commande aille dans la variable. Et les backslash après le sed sont inutiles.
A la limite, cette instruction serait correcte et devrait correspondre à ce que j'imagine si c'était écrit ainsi
MYSEDPARAM=`echo $MYSEDPARAM | sed -e "s/\$IN$i/\$OUT$i/"` |
Mais même là, je n'arrive pas à comprendre où est-ce qu'on trouve la chaîne "$IN" dans la variable "MYSEDPARAM" ou ailleurs...
Sinon tu te compliques quand-même bien la vie...
1) tu récupères chaque ligne de "propertiesParam.txt" se terminant par ";"
2) tu supprimes ce ";" => tu obtiens un token (un mot significatif)
3) tu vas rechercher la ligne commençant par ce token suivi de "=" dans "properties.conf" et tu écris cette ligne
Ce script est même plus court que le premier
#!/bin/sh |
Ce tuto devrait combler pas mal de tes lacunes en shell...
=> http://fr.lang.free.fr/cours/Shell_v1.4.pdf
Marsh Posté le 12-05-2006 à 12:25:17
En fait c'est à partir d'un script type je dois l'industrialiser.
tu as d'un File.list qui contient une liste de fichiers
---File.list--
fichier1.txt
fichier2.txt
Et fichier1.param et fichier2.param qui contiennent une liste de paramètres de fichier1.txt et fichier2.txt
--fichier1.param--
system;
disk;
ram;
--fichier2.param--
system;
disk;
memory;
Donc mon programme dois prendre en entrée File.list et récupérer un nom de fichier (fichier1.txt puis fichier2.txt ...) et ouvrir leur correspondant fichier1.param lire les paramètres qui'ils contiennent et aller les extraire depuis fichier1.txt puis fichier2.txt
---fichier1.txt--
system=unix
disk=20
ram=512
Voilà en tout l'utilité de mon script j'espère avoir été clair niveau explication.
Suis débutant en shell, merci pour le lien Sve@r.
Marsh Posté le 12-05-2006 à 19:01:07
bassene a écrit : En fait c'est à partir d'un script type je dois l'industrialiser. |
Pas vraiment compliqué. Au lieu de traiter un fichier avec son nom en dur, il suffit de les prendre un par un dans "File.list". Faut juste englober le script précédent avec une boucle intelligente et créer soi-même les noms des fichiers à partir du nom lu
#!/bin/sh |
Marsh Posté le 15-05-2006 à 15:21:58
j'ai lancé ton script mais le fichier temporaire crée est vide penses tu qu'il n'arrives pas à récupèrer ce qui est aprés le token ?
Marsh Posté le 16-05-2006 à 20:01:31
bassene a écrit : j'ai lancé ton script mais le fichier temporaire crée est vide penses tu qu'il n'arrives pas à récupèrer ce qui est aprés le token ? |
Hum... j'ai tapé ce script sans le tester... et je pourrai pas le tester avant le 22 mai (suis pas au burau avant cette date).
Tu peux essayer de mettre "set -x" avant le "grep" et "set +x" après le grep histoire que le débugging t'affiche la ligne "grep" réellement exécutée.
Sinon, il y a ptet un truc à corriger
Au lieu de
# Suppression du ";" final
token=`echo $lig |sed -e "s/;$//"`
Mettre
# Suppression du ";" final
token=`echo $lig |sed -e "s/;\$//"`
Sinon ça doit être un truc de ce style
Mais le meilleur debugging est l'affichage des variables histoire de voir si elles contiennent bien ce qu'elles devraient contenir...
Marsh Posté le 18-05-2006 à 19:47:26
#grep -e "$LINE" ../mco_stage1/$1/$FILE >> ../mco_tmp/$FILE.diff
echo "grep -e "$LINE" ../mco_stage2/$1/$FILE | sed -e "s/\$LINE//" ../mco_stage2/$1/$FILE"
voici deux commande la première en commentaire marche , mais la seconde ne tourne pas quelqu'un peut il me dire pourquoi.
Je veux que la valeur de mon grep soit remplacer par un espace dans le fichier concerné.
Marsh Posté le 19-05-2006 à 11:18:24
bassene a écrit : #grep -e "$LINE" ../mco_stage1/$1/$FILE >> ../mco_tmp/$FILE.diff |
Dans la 2°, je ne comprends pas trop le "echo". Mais le plus gros problème de la 2° ligne, c'est que tu donnes à "sed" 2 éléments à traiter
- le fichier "../mco_stage2/$1/$FILE"
- l'entrée standard venue du pipe
En tout état de cause, "sed" ne pourra pas traiter les 2 éléments...
bassene a écrit : Je veux que la valeur de mon grep soit remplacer par un espace dans le fichier concerné. |
res=`grep -e "$LINE" ../mco_stage2/$1/$FILE` |
Marsh Posté le 19-05-2006 à 14:59:54
Merci pour ton aide , le script tourne correctement.
bon week end.
Marsh Posté le 09-05-2006 à 23:58:26
bonjour,
j'ai besoin d'un petit coup de main pour avancer , voici le probléme :
J'ai un fichier properties1.conf composer de paramétres :
system=unix
disque=20
ram=512
properties2.conf
system=unix
disque=20
ram=512
sound=creative
je veux un script shell ouvre properties1.conf récuupère la valeur des paramètres et les reporte dans properties2.conf pour les paramétres identiques sans m'écraser les autres paramètres du fichier comme sound qui ne sont pas concerné par la modification.
Merci du coup de main d'avance.