#1 Le 22/08/2012, à 14:34
- Ariania
Création d'un fichier avec une variable passée en paramètre SHELL
Bonjour,
Je vous explique ce que je veux faire:
1- lister les fichiers d'un répertoire
2- exécuter un script sur un fichier
3- dans le script récupérer le nom du fichier (concaténation de l'adresse IP + ".cfg") afin d'écrire dans un fichier x.x.x.cfg
voici mes scripts:
SCRIPT1: Ce script liste les fichiers commencant par 141 et lance le script CreationMap.sh pour chaque fichier avec le nom du fichier en paramètre
#!/bin/bash
for i in 141*
do
./CreationMap.sh $i
done
SCRIPT2: Ce script liste les fichiers commencant par 141 et lance le script CreationMap.sh pour chaque fichier avec le nom du fichier en paramètre
#!/bin/bash
nomfile="$1"
res=$(echo $1 | sed -e "s/ /_/g")
echo $res
res+=.cfg
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n host_name = "$i"\n x = "'$x'" \n y = \n \n }" > $nomfile;
} ' $1
Mais en sortie j'ai les noms de tous les fichiers qui sont ds les fichiers du type x.x.x.x
Pourquoi cela?
Merci d'avance pour vos réponses
Cordialement,
Dernière modification par Ariania (Le 22/08/2012, à 14:44)
Hors ligne
#2 Le 22/08/2012, à 17:16
- Bousky
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je ne suis pas sûr d'avoir compris le problème... Tu veux faire quoi exactement ? Ou plutôt : tu as quoi au départ (Comment sont nommés les fichiers ? Que contiennent-ils ?) et tu veux obtenir quoi ?
A part ça, quelques remarques :
Il semblerait que tu ais oublié la description du script 2 en faisant un copier-coller abusif ;
Quand une variable (ou un argument) contient un nom de fichier, il faut toujours mettre des guillemets doubles autour ;
Le script 2 n'utilise nul-part la variable $res. De même, $nomfile ne me semble pas très utile ;
Dans awk, utilise printf plutôt que print ;
Par pitié, indente ton code ;
Ton utilisation de awk me semble peu utile et lourde ;
Ta commande awk lit écrit dans le même fichier. Tu cours à la catastrophe ;
On n'utilise pas "+=" sur des chaines de caractères, mais uniquement dans des expressions arithmétiques, c'est-à-dire entre ((...)) ;
C'est presque un détail, mais "echo texte | commande" est avantageusement remplacé par "commande <<< texte".
Dernière modification par Bousky (Le 22/08/2012, à 17:16)
Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)
Hors ligne
#3 Le 22/08/2012, à 17:29
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Salut,
Si j'ai bien compris ce que tu veux faire (je m'aperçois que j'ai tenu compte des remarques de Bousky) :
$ cat script1.sh
#!/bin/bash
liste=(141*)
for i in "${liste[@]}"
do
./CreationMap.sh "$i"
done
$ cat CreationMap.sh
#!/bin/bash
nomfile="$1"
res=${nomfile// /_}.cfg
echo "$res"
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n host_name = "$i"\n x = "'$x'" \n y = \n \n }"
} ' "$nomfile" >"$res"
Hors ligne
#4 Le 23/08/2012, à 07:14
- credenhill
Re : Création d'un fichier avec une variable passée en paramètre SHELL
hello
[*]On n'utilise pas "+=" sur des chaines de caractères, mais uniquement dans des expressions arithmétiques, c'est-à-dire entre ((...)) [/*]
si, c'est valide
$ a=aaa
$ a+=bbb
$ echo $a
aaabbb
$ declare -i x
$ x=1
$ x+=9
$ echo $x
10
Dernière modification par credenhill (Le 23/08/2012, à 07:23)
Hors ligne
#5 Le 23/08/2012, à 09:56
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je ne suis pas sûr d'avoir compris le problème... Tu veux faire quoi exactement ? Ou plutôt : tu as quoi au départ (Comment sont nommés les fichiers ? Que contiennent-ils ?) et tu veux obtenir quoi ?
A part ça, quelques remarques :
Il semblerait que tu ais oublié la description du script 2 en faisant un copier-coller abusif ;
Quand une variable (ou un argument) contient un nom de fichier, il faut toujours mettre des guillemets doubles autour ;
Le script 2 n'utilise nul-part la variable $res. De même, $nomfile ne me semble pas très utile ;
Dans awk, utilise printf plutôt que print ;
Par pitié, indente ton code ;
Ton utilisation de awk me semble peu utile et lourde ;
Ta commande awk lit écrit dans le même fichier. Tu cours à la catastrophe ;
On n'utilise pas "+=" sur des chaines de caractères, mais uniquement dans des expressions arithmétiques, c'est-à-dire entre ((...)) ;
C'est presque un détail, mais "echo texte | commande" est avantageusement remplacé par "commande <<< texte".
Bonjour,
Je m'excuse pour mon copiage abusif comme dans le meme script j'ai testé différentes méthodes donc lorsque j'ai voulu poser le sujet.
Et pour les chaines de caractères j'ai cherché sur google et je n'ai trouvé que "+="
Le script 2 doit pouvoir récupérer le nom du fichier qui est une adresse IP et ajouter ".cfg" a la suite. Puis il doit écrire dans ce fichier define {....}
Merci pour toutes vos informations
Hors ligne
#6 Le 23/08/2012, à 10:34
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Rebonjour,
Lorsque j'ai écrit sa res=$(echo $1 | sed -e "s/ /_/g") Je voulais remplacer tout les . des x.x.x.x par x_x_x_x pour obtenir ensuite un fichier comme cela x_x_x_.cfg
Et dans le code que vous m'avez donné j'ai les points et pas les _
Sauf si après je refait cette commande sur le fichier sed -e "s/ /_/g")
Je vais tester
Hors ligne
#7 Le 23/08/2012, à 10:48
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
ReBonjour,
J'ai pu remplacer les . par des _ en faisant ce code:
#!/bin/bash
nomfile="$1"
name=$(sed -e "s/\./_/g" <<< $1)
res=${name// /_}.cfg
echo "$res"
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n host_name = "$i"\n x = "'$x'" \n y = \n \n }"
} ' "$nomfile" >"$res"
Hors ligne
#8 Le 23/08/2012, à 11:50
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Bonjour,
Tu peux remplacer ces 2 lignes :
name=$(sed -e "s/\./_/g" <<< $1)
res=${name// /_}.cfg
par celle-ci :
res=${nomfile//./_}.cfg
La deuxième ligne servait à remplacer les espaces par "_", mais il semble ne pas y en avoir.
Hors ligne
#9 Le 23/08/2012, à 12:53
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Merci beaucoup.
J'ai voulu écrire une ligne qui serait commune à tous les fichiers x_x_x_x.cfg dans le script 2
#!/bin/bash
nomfile="$1"
res=${nomfile//./_}.cfg
echo "$res"
echo "define global { \n object_id=0 \n map_image=Cloud.png \n iconset=std_medium \n }" >> "$res"
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n host_name="$i"\n x="'$x'" \n y=\n \n }"
} ' "$nomfile" >"$res"
Cette ligne de code : echo "define global { \n object_id=0 \n map_image=Cloud.png \n iconset=std_medium \n }" >> "$res"
pour écrire au début de chaque fichier. Mais sa ne passe pas, j'ai essayé avec print j'ai une erreur.
Comment dois je faire ?
Hors ligne
#10 Le 23/08/2012, à 13:49
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
>>"$res" écrit à la fin du fichier
>"$res" crée le fichier, ou l'écrase s'il existe
Tu as inversé les deux.
echo -e "define global { \n object_id=0 \n map_image=Cloud.png \n iconset=std_medium \n }" > "$res"
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n host_name="$i"\n x="'$x'" \n y=\n \n }"
} ' "$nomfile" >>"$res"
Corrigé : echo -e au lieu de echo
Dernière modification par pingouinux (Le 23/08/2012, à 13:58)
Hors ligne
#11 Le 23/08/2012, à 14:21
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Merci beaucoup pour votre explication j'ai continué mon programme. Le voici :
#!/bin/bash
nomfile="$1"
res=${nomfile//./_}.cfg
echo "$res"
echo -e "define global { \n object_id=0 \n map_image=Cloud.png \n iconset=std_medium \n }\n" > "$res"
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n host_name="$i"\n x="'$x'" \n y=\n }\n"
} ' "$nomfile" >>"$res"
#Copie du fichier au cas il y aurait un problème lors de l'écriture
cp $res $res.bak
c=253
b=241
n=0
while read lig
do
if [[ ${lig%%=*} == host_name ]]; then
c=$(( 253+(n%30)*40 ))
b=$(( 241+(n/30)*55 ))
((n+=1))
fi
sed "s/x *=/& $c/;s/y *=/& $b/" <<<"$lig"
done <"$res.bak" >"$res"
#Suppression du fichier de sauvegarde
rm -f $res.bak
Je veux faire une sauvegarde du fichier avant de le modifier pour mettre des chiffres pour les x et les y et ensuite supprimer les sauvegardes.
mais j'ai des erreurs
141_28_98_11.cfg
./CreationMap.sh: line 24: Suppression: command not found
141_28_98_13.cfg
./CreationMap.sh: line 24: Suppression: command not found
141_28_98_14.cfg
./CreationMap.sh: line 24: Suppression: command not found
141_28_98_15.cfg
./CreationMap.sh: line 24: Suppression: command not found
Pourquoi il me semble que ma commande
Hors ligne
#12 Le 23/08/2012, à 14:52
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je pense que tu ne montres pas le bon script en #11. Il tourne chez moi.
De plus, la ligne 24 (signalée par le message d'erreur) est celle-ci : b=$(( 241+(n/30)*55 ))
Remarque : Ne pas oublier les "" : "$res" "$res.bak"
Hors ligne
#13 Le 23/08/2012, à 14:58
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je les testé de nouveau il passe mais je sais que quelque fois j'ai des erreurs sur une machine et sur l'autre je n'en ai pas.
Je suis obligée de faire mes tests sur 2 machines et je suis toujours en route pourtant
Hors ligne
#14 Le 23/08/2012, à 15:03
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je veux faire une sauvegarde du fichier avant de le modifier
C'est bien, mais il faut mettre set -e après la première ligne du fichier, ce qui arrête le script en cas d'erreur. Sinon, tu iras quand même jusqu'au rm.
Hors ligne
#15 Le 23/08/2012, à 15:04
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Ah ok merci beaucoup.
Hors ligne
#16 Le 24/08/2012, à 12:23
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Bonjour,
J'ai un nouveau problème lorsque j'ai intégré le programme à mon serveur je me suis rendu compte qu'il fallait écrire dans des fichiers qui avait déja le meme nom comment faire.
Voici le code :
#!/bin/bash
nomfile="$1"
res=${nomfile//./_}.cfg
echo "$res"
#echo -e "define global { \n map_image=cloud.png \n iconset=std_medium \n }\n" > "$res"
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n object_id=0 \n host_name="$i"\n x="'$x'" \n y=\n }\n"
} ' "$nomfile" >>"$res"
#Copie du fichier au cas il y aurait un problème lors de l'écriture
cp "$res" "$res.bak"
c=253
b=241
n=0
while read lig
do
if [[ ${lig%%=*} == host_name ]]; then
c=$(( 253+(n%30)*40 ))
b=$(( 241+(n/30)*55 ))
((n+=1))
fi
sed -e "s/x *=/&$c/;s/y *=/&$b/" <<<"$lig"
done <"$res.bak" >"$res"
#Suppression du fichier
rm -f "$res.bak"
On créait le fichier x_x_x_.cfg mais la il faut que le script écrive à a suite du fichier auie st déjà crée.
Je voudrais de l'aide. Merci d'avance.
Hors ligne
#17 Le 24/08/2012, à 12:35
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Bonjour,
Tu as la réponse dans mon message #10 :
>>"$res" écrit à la fin du fichier
>"$res" crée le fichier, ou l'écrase s'il existe
Hors ligne
#18 Le 24/08/2012, à 12:37
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Ouii j'ai fais sa mais sa renomme les fichiers comme cela
fichier avant : x_x_x_x.cfg
et sa me met après x_x_x_x_cfg.cfg
Hors ligne
#19 Le 24/08/2012, à 12:50
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
C'est dans script1.sh qu'il ne faut pas prendre les fichiers se terminant par .cfg. Quelque chose comme ceci :
#!/bin/bash
liste=(141*[0-9])
for i in "${liste[@]}"
do
./CreationMap.sh "$i"
done
Hors ligne
#20 Le 24/08/2012, à 12:56
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
mais oui justement il me faut les prendre pour pouvoir écrire à la suite.
En faite je viens de comprendre ce aue je dois faire, il faut que je prenne le fichier existant 141_28_98_11.cfg
que je le compare avec le fichier créer 141.28.98.11 et que j'ècrive à la suite.
C'est possible ?
Hors ligne
#21 Le 24/08/2012, à 13:11
- Bousky
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Juste une question : pourquoi tu tiens à remplacer les points ?
Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)
Hors ligne
#22 Le 24/08/2012, à 13:14
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je dois remplacer les points parce que c'est un fichier qui sera utilise par un addon de nagios et dans le nom il ne dois pas avoir de points
Hors ligne
#23 Le 24/08/2012, à 13:26
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je maintiens ce que j'ai dit en #19, et dirais que ton script du #16 doit ressembler à ceci :
#!/bin/bash
set -e
nomfile="$1"
res=${nomfile//./_}.cfg
echo "$res"
# On n'écrit la ligne commune que si le fichier n'existe pas
[ -f "$res" ] || echo -e "define global { \n map_image=cloud.png \n iconset=std_medium \n }\n" > "$res"
awk -F, ' {
for (i=1;i<=NF;i++)
print "define service { \n object_id=0 \n host_name="$i"\n x="'$x'" \n y=\n }\n"
} ' "$nomfile" >>"$res"
#Copie du fichier au cas il y aurait un problème lors de l'écriture
cp "$res" "$res.bak"
c=253
b=241
n=0
while read lig
do
if [[ ${lig%%=*} == host_name ]]; then
c=$(( 253+(n%30)*40 ))
b=$(( 241+(n/30)*55 ))
((n+=1))
fi
sed -e "s/x *=/&$c/;s/y *=/&$b/" <<<"$lig"
done <"$res.bak" >"$res"
#Suppression du fichier
rm -f "$res.bak"
Hors ligne
#24 Le 24/08/2012, à 13:37
- Ariania
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Oui mais en sortie j'ai cela
141_28_98_11.cfg
141_28_98_11_cfg.cfg
141_28_98_13.cfg
141_28_98_13_cfg.cfg
141_28_98_14.cfg
141_28_98_14_cfg.cfg
141_28_98_15.cfg
141_28_98_15_cfg.cfg
Hors ligne
#25 Le 24/08/2012, à 13:47
- pingouinux
Re : Création d'un fichier avec une variable passée en paramètre SHELL
Je pense que tu n'as pas modifié script1.sh. Et si tu le relances tel quel, tu auras en plus des fichiers 141_28_98_11_cfg_cfg.cfg , et ainsi de suite…
Hors ligne