[Resolu] Bash :: lecture de fichier => dans variable

Bonjour, all …

je cherche à récupèrer certaines infos d’un fichier pour les retourner dans une variable tableau !

#!/bin/sh
fichier=/etc/network/interfaces
I=0

for x in $(grep iface $fichier | awk '{print $2}')
do
        if [ "$x" != "lo" ]; then
                IFACE[$I]=$x;
                echo IFACE[${I}]' = '${IFACE[$I]};
                let I++;
        fi
done

for i in $IFACE
do
        echo ${IFACE[$i]}; 
done

Sauf qu’à-priori ma deuxième boucle n’est pas bonne puisque je n’ai que le premier élément affiché …
Je suis sûr qu’il me faille compter d’abord le nb d’élèments pour ensuite l’inclure dans la boucle afin d’arriver au résultat, n’est-ce pas ?!

Pour ce qui est de connaître le nb d’éléments, je sais faire :

nb=${#IFACE[*]}

après, j’ai un blanc …

PS : faut peut être que j’aille manger … :stuck_out_tongue:

pas besoin de compter le nombre d’éléments: il y a I éléments à la fin de la première boucle.
Mais de toutes les manières, même ta première boucle ne passe pas: ou as tu vu jouer ce let et ce ++ ? La variable $I n’est même pas numerique, puisque le numerique n’existe pas en shell.
Il te faut trouver une autre logique que l’utilisation d’indices.
Tu fais trop de c/c++, ça te déforme :laughing:

Et tu devrais tester tes scripts, avant de demander aux autres de les débuguer, tu aurais l’air plus sérieux :laughing:

[quote=“mattotop”]pas besoin de compter le nombre d’éléments: il y a I éléments à la fin de la première boucle.
Mais de toutes les manières, même ta première boucle ne passe pas: ou as tu vu jouer ce let et ce ++ ? La variable $I n’est même pas numerique, puisque le numerique n’existe pas en shell.
Il te faut trouver une autre logique que l’utilisation d’indices.
Tu fais trop de c/c++, ça te déforme :laughing:
Et tu devrais tester tes scripts, avant de demander aux autres de les débuguer, tu aurais l’air plus sérieux :laughing:[/quote]

Que de conclusions terriblements hâtives … j’apprécie énormèment. :imp:

-1- Je ne suis aucunèment développeur, web peut-être, mais encore moins programmeur …
-2- contrairement à ce que tu avances, du fait que la première boucle ne fonctionnerait pas, que le let est une abérration … le script est fonctionnel à-priori, puisque qd je le lances soit par ‘sh script.sh’ ou par ‘./script.sh’ (dans ce cas avec un chmod 0755), il exécute bien ce qui lui est demandé, à savoir dans la première boucle de créer une variable tableau, de l’incrémenter, lui attribuer une valeur et enfin afficher l’ensemble !
-3- je ne cherches aucunèment à paraître, que ce soit sérieux ou non. Ensuite, je n’ai nullement demander de me déboguer cela, mais de m’aider à comprendre comment faire - demande implicite, non explicite -.

J’ai une idée en tête, je fais donc des tests en bash - environnement que je ne maîtrise pas du tout, et je ne serais pas mort de pas le maîtriser ! -

Tu serais gentil d’éviter à l’avenir les conclusions hâtives, et d’envoyer paître les gens dans leur baraquement, sous je ne sais quel prétexte. Un peu plus de convivialité te rendrait plus amical.

PS : Si, par hasard, je me trompe sur tes sentiments à mon égard, je te prie de m’excuser…

excuse accepté :smiley:

Ensuite pour du bash voila quelques aides

marcg.developpez.com/ksh/
linux.developpez.com/guide/x3665.html

dsl, j’apprécie pas l’humour, là !

[quote]
Ensuite pour du bash voila quelques aides

marcg.developpez.com/ksh/
linux.developpez.com/guide/x3665.html[/quote]

merci…
et, justement le ‘let I++’, je l’ai vu et lu sur certains tutos bash, j’ai testé, et ça marche.

Du calme … matt ne te cherche pas, ne t’ennerve donc pas. “Kipe coule” tout ca… Et quand bien même il te chercherait t’ennerver serait aller dans son sens. Allez hop concentre toi sur ton tuto bash plutot :stuck_out_tongue:

quote="PengouinPdt"
Que de conclusions terriblements hâtives … j’apprécie énormèment. :imp:
(…)[/quote]Comme dit hoshin: :smt003
Désolé de ma rugosité.
Bon, je vais lire le reste du fil, pour voir si j’ai mieux à dire comme >conclusions< :wink:

quote="PengouinPdt"
PS : Si, par hasard, je me trompe sur tes sentiments à mon égard, je te prie de m’excuser…[/quote]Bon déjà, considères ça comme acquis, et encore désolé pour ma part…

[code]#!/bin/sh
fichier=/etc/network/interfaces
I=0
i=0
for x in $(grep iface $fichier | awk ‘{print $2}’)
do
if [ “$x” != “lo” ]; then
IFACE[$I]=$x;
echo IFACE[${I}]’ = '${IFACE[$I]};
let I++;
fi
done

while [ “$i” -lt “$I” ]
do
echo ${IFACE[$i]};
let "i = $i + 1"
done [/code]C’est peut etre pas un codage propre mais je pense que ca doit faire ce que tu cherche.

tldp.org/LDP/abs/abs-guide.pdf

ps: Ici c’est une bonne ambiance faut pas prendre mal tous ce qui est dit

quote=“PengouinPdt”
-2- contrairement à ce que tu avances, du fait que la première boucle ne fonctionnerait pas, que le let est une abérration … le script est fonctionnel à-priori, puisque qd je le lances soit par ‘sh script.sh’ ou par ‘./script.sh’ (dans ce cas avec un chmod 0755), il exécute bien ce qui lui est demandé, à savoir dans la première boucle de créer une variable tableau, de l’incrémenter, lui attribuer une valeur et enfin afficher l’ensemble !
(…)[/quote]Ben écoutes, c’est le premier truc que j’ai fait aussi, CE MATIN:

[code]console@MAT64LIN:~$ cat >>intftest.sh
#!/bin/sh
fichier=/etc/network/interfaces
I=0

for x in $(grep iface $fichier | awk ‘{print $2}’)
do
if [ “$x” != “lo” ]; then
IFACE[$I]=$x;
echo IFACE[${I}]’ = '${IFACE[$I]};
let I++;
fi
done

for i in $IFACE
do
echo ${IFACE[$i]};
done
console@MAT64LIN:~$ chmod +x intftest.sh
console@MAT64LIN:~$ ./intftest.sh
./intftest.sh: 9: Syntax error: Bad substitution
[/code] Alors ça c’est ce qui s’est passé sur ma machine de ce matin quand j’ai commencé à te répondre, et c’est ce qui a motivé ma réponse critique quand au fait d’essayer les scripts avant de les “débuguer”.
MAIS
quand je reviens chez moi sur mon portable, j’obtiens

[code]roc@roc:~$ cat >>intftest.sh
#!/bin/sh
fichier=/etc/network/interfaces
I=0

for x in $(grep iface $fichier | awk ‘{print $2}’)
do
if [ “$x” != “lo” ]; then
IFACE[$I]=$x;
echo IFACE[${I}]’ = '${IFACE[$I]};
let I++;
fi
done

for i in $IFACE
do
echo ${IFACE[$i]};
done
roc@roc:~$ chmod +x intftest.sh
roc@roc:~$ ./intftest.sh
IFACE[0] = eth0
IFACE[1] = eth1
eth0[/code]Je comprends donc mieux que tu n’ai pas aimé que j’ai pu douter du fait que tu avais testé ton script. Voilà voilà. :unamused:

Alors comme je ne suis pas non plus développeur, que je ne connais pas tout du sh, que je ne connaissais pas le let, et qu’en débuguant mon shell de ce matin râlait sur le let, je me suis permis de me moquer un peu.

Bon, pour revenir à ton pb, puisque le let fonctionne, voici la solution:

[code]roc@roc:~$ cat intftest.sh
#!/bin/sh
fichier=/etc/network/interfaces
I=0

for x in $(grep iface $fichier | awk ‘{print $2}’)
do
if [ “$x” != “lo” ]; then
IFACE[$I]=$x;
echo IFACE[${I}]’ = '${IFACE[$I]};
let I++;
fi
done

#for i in $IFACE
#do
while [ $I -gt 0 ]
do
let I–;
echo ${IFACE[$I]};
done
roc@roc:~$ ./intftest.sh
IFACE[0] = eth0
IFACE[1] = eth1
eth1
eth0
[/code]

bon, j’ai trouvé d’ou venait la difference:

console@MAT64LIN:~$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 Jun 29 2006 /bin/sh -> dashetroc@roc:~$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 2007-02-10 20:04 /bin/sh -> bashdash etant plus posix que bash, j’en déduis que le let est spécifique au bash, et n’est pas portable en shell standard.

Bon, merci à toi, mattotop, - et les autres, aussi -…

J’y suis arrivé, légèrement différement :

[code]#!/bin/bash

IFC=/sbin/ifconfig
RTE=/sbin/route

fichier=/etc/network/interfaces
I=0

ExecScript() {
nb=${#ETH[*]}-1;
#echo $nb’ valeurs dans le tableau ETH’;

for ((i=0;$i<=$nb;i++))
do
	if [ "${IP[$i]}" != "" ]; then 
		echo ETH[${i}]' : '${ETH[$i]}' '${IP[$i]}'/'${MASK[$i]}' bdc:'${BDC[$i]}' net:'${NET[$i]}' Red:'${LAN[$i]};
		... instructions n ...
	fi
done

}

SearchIFace() {
for x in $(grep iface $fichier | awk ‘{print $2}’)
do
if [ “$x” != “lo” ]; then
ETH[$I]=$x;
#echo ETH[${I}]’ = '${ETH[$I]};
IP[$I]=$IFC ${ETH[$I]} | grep Bcast | awk '{print $2}' | cut -d : -f 2;
BDC[$I]=$IFC ${ETH[$I]} | grep Bcast | awk '{print $3}' | cut -d : -f 2;
MASK[$I]=$IFC ${ETH[$I]} | grep Bcast | awk '{print $4}' | cut -d : -f 2;
NET[$I]=$RTE -n | grep ${MASK[$I]} | awk '{print $1}';
LAN[$I]="${NET[$I]}/24";
let I++;
fi
done
}

SearchIFace
ExecScript

… n new instructions …
[/code]

Bon, en fait, maintenant je m’expliques …
le trip auquel j’ai pensé ce week-end, et qui m’a pris une bonne partie de la journée …

était de me demander comment récupèrer les interfaces, à partir du fichier interfaces, l’éventrer un peu, et récupèrer les infos correspondantes, afin de fignoler un script iptables pour protéger mon laptop un temps soit peu, et ce quelque soit l’interface réseau déclarée, active de surcroît.

On peut certainement faire plus simple, mais j’aboutit au trip que je voulais :smiling_imp:

PS : y’a aucune rancune ou ressenti de ma part, j’ai juste exprimé que les propos de mattotop me paraissaient un peu dur … à avaler, aussi.
De fait, comme en plus, il le reconnait, comment ne pas pardonner :stuck_out_tongue: :wink:

résolu?

beh, comme tu peux le lire : oui :smiling_imp: