Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2011, 15h53   #1
Membre du Club
 
Inscription : décembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 183
Points : 47
Points : 47
Par défaut les tableaux à 2 dimensions ?

Hello

Je me demande si un tableau à 2 dimensions est possible ?
je compte m'en servir pour un petit script iptables.

l'idée c'est 1 tableau pour les ip, le second pour les ports

on pourrait donc :

Code :
var_tab_ip="ip1 ip2 ip3 " , "22 80 110"
il faudrait ensuite boucler sur les le(s) tableaux de manière à obtenir
Code :
1
2
3
4
5
6
début de la boucle:
iptables [ip1] [22]
iptables [ip2] [80]
iptables [ip3] [110]
fin de la boucle
echo "de l'insertion des règle"
mais je ne sais pas si c'est possible ?
Merci d'avance
panthere noire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 16h39   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Il n'est pas possible en bash d'utiliser un tableau à deux dimensions avec les fonctions natives.

Mais avec un peu de logique on peut utiliser un algo qui fait comme si
une page d'exemple : http://abs.traduc.org/abs-5.0-fr/ch26.html

ceci dit tu peux aussi jouer avec awk ou autre chose qu'un bash.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/06/2011, 16h40   #3
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 980
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 980
Points : 6 095
Points : 6 095
Salut.

Tu doit pouvoir faire des tableaux de tableaux ...

Exemple :

Code :
1
2
3
4
5
6
#!/bin/bash
 
array2[0]=1
array[0]=$array2
 
echo ${array[0][0]}
Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 07/06/2011, 17h47   #4
Membre du Club
 
Inscription : décembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 183
Points : 47
Points : 47
merci pour vos 2 réponses voila en plus clair , ceci peut être pour un débutant (comme moi )

Code :
1
2
3
4
5
6
7
8
 
array2[0]=1
array3[0]=3
array[0]=$array2
array[1]=$array3
 
echo ${array[1][0]}
echo ${array[0][0]}
Edit:
petit souci on dirait que ça coince
Code :
1
2
3
4
5
6
7
 
arrayip="1 3 6 "
arrayport="22 40 44"
array[0]=$arrayip
array[1]=$arrayport
echo ${array[1][1]}
echo ${array[0][1]}
renvoie
panthere noire est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/06/2011, 00h39   #5
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
La réponse de ok.Idriss m'intrigue, est ce que ca ne serait pas une erreur de sa part ?
Je veux dire que cela ne me semble pas possible de cette manière et que j'ai l'impression que le bash se contente d'ignorer le deuxième crochet (sans vomir d'erreur de syntaxe au passage).

Merci d'éclairer ma lanterne.
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2011, 09h51   #6
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 980
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 980
Points : 6 095
Points : 6 095
Bonjour.

Citation:
Envoyé par AnozerOne Voir le message
Je veux dire que cela ne me semble pas possible de cette manière et que j'ai l'impression que le bash se contente d'ignorer le deuxième crochet
En effet, j'ai cette impression aussi. Bref, c'était une piste à explorer (car valable d'un point de vue algorithmique) ... mais bon ça ne fonctionne pas

Sinon comme l'a montré frp31, il y a d'autres façons de simuler les tableau 2D notamment dans l'advanced bash scripting guide au chapitre des tableaux.

Sinon bash ne m'a pas signalé d'erreur de syntaxe.

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2011, 11h49   #7
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
C'est bien ce qui me semblait, si il y a bien un truc qui manque au bash c'est la possibilité qu'une fonction retourne un valeur (exit ne compte pas).
On aurait ainsi pu faire une fonction ArrayGet et ArraySet, bien plus lisible à mon humble avis.

Court se cacher dans un coin pour éviter les foudres des utilisateurs réguliers de bash
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2011, 12h27   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Citation:
Envoyé par AnozerOne Voir le message
si il y a bien un truc qui manque au bash c'est la possibilité qu'une fonction retourne un valeur (exit ne compte pas).
Extrait du man bash :

Code :
1
2
3
4
5
6
7
return [n]
    La fonction shell en cours d'exécution se termine en renvoyant la valeur n. Si n est omis,
    la valeur renvoyée est celle de la dernière commande exécutée dans le corps de la 
    fonction. Si cette commande est exécutée en dehors d'une fonction, mais durant 
    l'exécution d'un script avec la commande . (source) ce script s'arrête, et la valeur 
    renvoyée est n ou celle de la dernière commande exécutée. Si elle est utilisée en dehors
    d'une fonction ou d'un script exécuté par ., le code retour est Faux.
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/06/2011, 12h48   #9
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Huhu, bon bah j'ai plus qu'à RTFM

EDIT : Hmm en fait je l'avais bien lu, mais bon être dans la capacité de retourner seulement une valeur entre 0 et 255 n'est pas ce que je voulais dire par la capacité de retourner une valeur, ca ne peut servir essentiellement que comme code de retour ...
Même si oui on peut utiliser une variable globale intermédiaire et $? on ne peut pas faire cela :

Code :
1
2
3
4
5
6
Mafonction() { # prenant un argument
   ...
   return $unevaleur # valeur modifiée en fonction de la valeur de l'argument
}
 
echo "Mafonction 5"
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2011, 17h05   #10
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Exemple de script que je fais en ce moment utilisant des tableaux à plusieurs dimensions :

http://www.secteur7.net/div/qmenu

Et c'est en sh, avec bash les possibilités sont plus nombreuses.

Exemple dans le code de qmenu :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
draw_item() 
{

    eval [ \"\${I_${MID}_1}\" ] || return

    local COL=${2:-$NCOL}
    POS=$( eval tput cup $(($1+1)) \$\(\("\${RA_$MID}"+1\)\) )
    eval printf \"\${POS}\${COL}%\${WI_$MID}s\${POS}%s\${NCOL}\" \" \" \" \${I_${MID}_${1}} \${TSL}\"

    eval local MN=\"\${MN_$MID}\" ; eval IID_$MN=\"\${IID}\"

}
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 12h08   #11
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Je viens de découvrir les associative array en bash (introduit depuis bash 4.1)

Citation:
#!/bin/bash

declare -A xDarray

xDarray[0 1]=1
xDarray[1 0]=2
xDarray[9 -5 6]=3

echo ${xDarray[0 1]}
echo ${xDarray[1 0]}
echo ${xDarray[9 -5 6]}

sleep 5
Ca peut permettre de virtuellement créer et utiliser un tableau de X dimensions de façon très triviale, bon après c'est à proscrire dans de grosses loop ou autre, mais ca reste cool à utiliser quand il n'y a pas besoin de performance ou une gestion critique de la mémoire utilisée.
Etant donné que le paramètre est un string on peut même utiliser des index négatifs.

PS : Le xD, même s'il représente une X dimension est aussi un smiley et oui c'est voulu, car je considère cela plus comme un gadget à utiliser avec parcimonie dans un script perso qu'autre chose
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 12h53   #12
Membre du Club
 
Inscription : décembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 183
Points : 47
Points : 47
Citation:
Envoyé par FRUiT Voir le message
Exemple de script que je fais en ce moment utilisant des tableaux à plusieurs dimensions :

http://www.secteur7.net/div/qmenu

Et c'est en sh, avec bash les possibilités sont plus nombreuses.

Exemple dans le code de qmenu :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
draw_item() 
{

    eval [ \"\${I_${MID}_1}\" ] || return

    local COL=${2:-$NCOL}
    POS=$( eval tput cup $(($1+1)) \$\(\("\${RA_$MID}"+1\)\) )
    eval printf \"\${POS}\${COL}%\${WI_$MID}s\${POS}%s\${NCOL}\" \" \" \" \${I_${MID}_${1}} \${TSL}\"

    eval local MN=\"\${MN_$MID}\" ; eval IID_$MN=\"\${IID}\"

}
Ouch
c'est pas facilement lisible le truc, je ne pense pas que je vais m'en servir, mai ça peux servir a d'autre. le but c'est que sa fonctionne déjà

Merci pour le code.
panthere noire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 13h16   #13
Membre du Club
 
Inscription : décembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 183
Points : 47
Points : 47
Citation:
Envoyé par AnozerOne Voir le message
Je viens de découvrir les associative array en bash (introduit depuis bash 4.1)



Ça peut permettre de virtuellement créer et utiliser un tableau de X dimensions de façon très triviale, bon après c'est à proscrire dans de grosses loop ou autre, mais ca reste cool à utiliser quand il n'y a pas besoin de performance ou une gestion critique de la mémoire utilisée.
Etant donné que le paramètre est un string on peut même utiliser des index négatifs.

PS : Le xD, même s'il représente une X dimension est aussi un smiley et oui c'est voulu, car je considère cela plus comme un gadget à utiliser avec parcimonie dans un script perso qu'autre chose
c'est une bonne chose de plus en shell
Mais comment on boucle dessus avec une boucle for ?

pour les 2 tableau direct on fait:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#!/bin/bash
 
declare -A xDarray
 
xDarray[0 1]=1
xDarray[0 2]=3
xDarray[1 0]=2
xDarray[2 0]=4
 
 
#echo ${xDarray[0 1]}
#echo ${xDarray[0 2]}
#echo ${xDarray[1 0]}
#echo ${xDarray[2 0]}
 
for var in ${xDarray[@]}
do
	echo $var
done
J'ai besoins des 2 dimensions en même temps (donc le nombre d'éléments est le même dans chaque tableau)
en gros :
Code :
1
2
3
4
5
 
for var1 var2 in ${xDarray[@]}
do
	echo "colonne 1"$var1 "colonne 2" $var2
done
panthere noire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 13h25   #14
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Tu veux faire quoi exactement ?

Je veux dire boucler sur le tableau dans un ordre particulier ou non ?
Tu veux faire quoi avec chaque élément du tableau, etc ...
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 14h05   #15
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par panthere noire Voir le message
Ouch
c'est pas facilement lisible le truc, je ne pense pas que je vais m'en servir
Le trux à en retenir, c'est que sous bash, tu peux combiner la méthode eval, ET la méthode des tableaux natifs bash (donc avoir un tableau a une dimension de la forme ${array[x]}, et en plus un tableau de ce tableau avec eval). Ca fait une syntaxe un petit peu moins compliquée.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 17h32   #16
Membre du Club
 
Inscription : décembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 183
Points : 47
Points : 47
Citation:
Envoyé par AnozerOne Voir le message
Tu veux faire quoi exactement ?

Je veux dire boucler sur le tableau dans un ordre particulier ou non ?
Tu veux faire quoi avec chaque élément du tableau, etc ...
pour l'ordre cela n'importe peux,
pour la suite : on peux prendre iptables pour y voir un peux plus claire.hum..

iptables -A INPUT -p tcp --dport $port -m iprange $ip

il suffi donc d'avoir les port et l'ip dans 2 tableau qui seron remplis auparavant.

pour reprendre le code plus bas:

Code :
1
2
3
4
5
 
for port ip in ${xDarray[@]}
do
	 iptables -A INPUT -p tcp --dport $port  -m iprange $ip
done
avidement la syntaxe n'est pas correct ...
merci pour vos réponse
panthere noire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 17h46   #17
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
xDarray[ip port]=<valeur>

Tu as comme clefs l'ip et le port, mais utilises tu aussi la valeur stockée "<valeur>" ?
Ça peut paraître très débile comme question, mais comme tu n'en parles pas je préfères demander, car si tu n'utilises pas la valeur stockée, alors un tableau en 1 dimension suffit. (ne t'offusque pas si cela te semble évident, personne n'est à l'abri d'une bête erreur de conception)
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 02h39   #18
Membre du Club
 
Inscription : décembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 183
Points : 47
Points : 47
Citation:
Envoyé par AnozerOne Voir le message
xDarray[ip port]=<valeur>

Tu as comme clefs l'ip et le port, mais utilises tu aussi la valeur stockée "<valeur>" ?
Ça peut paraître très débile comme question, mais comme tu n'en parles pas je préfères demander, car si tu n'utilises pas la valeur stockée, alors un tableau en 1 dimension suffit. (ne t'offusque pas si cela te semble évident, personne n'est à l'abri d'une bête erreur de conception)
ben oui j'utilise les valeur
par exemple:

Code :
1
2
3
4
5
6
7
8
9
 
var_tab_port_spring_client="8459 8455 8454 8452 8451 8450"
var_tab_ip_ping="91.1.0.0-91.255.255.255 94.1.0.0-94.255.255.255"
# bon les ip/port son bidon évidement...
for ? in $var_tab*
do
     iptables -A INPUT -p udp  -m state --state RELATED,ESTABLISHED -m multiport --source-port $var_tab_port_spring_client -m iprange --src-range $var_tab_ip_ping  -j ACCEPT
 
done
comment je fait avec la boucle fort a ce moment là?
je peux pas utiliser le port comme reference ,ni l'ip, mai je peux boucler sur le nombre d'élément, chose que j'ai trouver dans le prescedant post, reste a faire reference aux bon tableaux ?
panthere noire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 12h20   #19
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
 
declare -A xDarray
 
xDarray[0 1]=1
xDarray[0 2]=3
xDarray[1 0]=2
xDarray[2 0]=4
 
for index in "${!xDarray[@]}"
do
   echo "index: $index, valeur stockée: ${xDarray[$index]}."
   # on récupère les 2 index, note que le nombre d'espaces ne sera pas pris en compte entre les 2 index avec cette méthode, mais il faut un au minimum
   # et puis il vaut mieux simplement être rigoureux et ne faire qu'un espace comme au début du script
   set $index
   echo "index 1 = $1"
   echo "index 2 = $2"
done
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 18h53   #20
Membre du Club
 
Inscription : décembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 183
Points : 47
Points : 47
merci pour ta réponse,

mais ta boucle liste les tableaux sur le premier index, puis passe à l'index suivant.

il me faut lors du même passage avoir accès aux "valeur stockée" des 2 index sur la même ligne (sinon un tableau simple suffit)
panthere noire est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h37.


 
 
 
 
Partenaires

Hébergement Web