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 16/10/2008, à 10:11

Alucard95

stocker le résultat d'une commande dans un tableau en shell

Bonjour tout le monde!!

Alors voila, je voudrais stocker le résultat d'une commande dans un tableau le tout en langage shell.

Par exemple le résultat de la commande ls va donc me ressortir plusieurs noms et je voudrais que chacun de ces noms soient affecté à une valeur du tableau :

nom_fichier1 dans tableau[1]
nom_fichier2 dans tableau[2]
...

Le problème est que je ne sais pas comment écrire cela, que doit-je mettre entre les crochets??

tableau[?]=$(ls)

Merci d'avance

Dernière modification par Alucard95 (Le 16/10/2008, à 10:26)

Hors ligne

#2 Le 16/10/2008, à 11:30

MrWaloo

Re : stocker le résultat d'une commande dans un tableau en shell

je ne connais pas trop le shell, je vais faire le parallèle en perl.

ce qu'une commande te retourne n'est pas un tableau ni même un type de variable, c'est du texte qu'il te faudrait traiter en tant que telle.

il doit certainement exister des boucles du genre foreach sur l'ensemble des fichiers d'un répertoire dans les quelles tu pourrais facilement créer un tableau ou même t'économiser cette création et traiter directement les fichiers.


"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.

Hors ligne

#3 Le 16/10/2008, à 11:36

HP

Re : stocker le résultat d'une commande dans un tableau en shell

cd "$mypath"

for file in *; do 
    somtehing_to_do "$file"
done

voilà… à moins que l'usage d'un tableau soit indispensable… si oui, pourquoi ?

remarque, de la même façon, tu devrais pouvoir alimenter ton tableau…
de plus, cette syntaxe est assez conventionnelle, à mon sens.

Dernière modification par HP (Le 16/10/2008, à 11:37)


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#4 Le 16/10/2008, à 11:43

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

Alors, en fait je vais réutiliser ce tableau pour alimenter une base de données.
Effectivement une boucle for each fonctionnerai pour le ls mais le problème c'est que j'ai aussi une autre commande snmpwalk que je dois aussi stocker et la le for ne fonctionnera pas.

Hors ligne

#5 Le 16/10/2008, à 12:31

morphoneo69

Re : stocker le résultat d'une commande dans un tableau en shell

Doit il y avoir des choses plus simple mais je propose quand même
Tu met le résultat de la commande dans un fichier. Et ensuite tu fais un traitement sur le fichier.

Hors ligne

#6 Le 16/10/2008, à 13:13

MrWaloo

Re : stocker le résultat d'une commande dans un tableau en shell

morphoneo69 a écrit :

Doit il y avoir des choses plus simple mais je propose quand même
Tu met le résultat de la commande dans un fichier. Et ensuite tu fais un traitement sur le fichier.

+1


"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.

Hors ligne

#7 Le 16/10/2008, à 13:15

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

Je vais vous dire tout mon script comme ça vous pourrez me dire si mon approche est la bonne.

Alors en fait ce que je veux faire à la base c'est identifier qu'elle machine est connectée sur chaques ports de mes switchs.
Pour cela je fais une requête snmp qui va me retourner la liste des adresses mac. Par la suite, je dois mettre ses adresses mac dans une base de donnée. Le problème est qu'il n'y a qu'une seule requête snmp qui me donne toute la liste des adresses mac en vrac. Je voulais donc les trier pour ensuite les associer au bon port sans passer par un fichier.

Voili voilou, dites moi ce que vous en penser

Hors ligne

#8 Le 16/10/2008, à 13:16

tiky

Re : stocker le résultat d'une commande dans un tableau en shell

Il faut modifier le internal field separator IFS. Par défaut, le shell bash utilise l'espace, le saut de ligne et la tabulation pour séparer les éléments d'un tableau dans une chaîne de caractère.

table=( $(ls) )

Le code suivant te génère bien un tableau, seulement si l'un des mots contient un espace, il sera considéré comme 2.

IFS='
'
table=( $(ls) )

( Attention: tu dois sauter une ligne après la première quote mais aucun espace ! )

Note: La méthode proposée par HP est meilleure pour traiter séquentiellement des fichiers.

Dernière modification par tiky (Le 16/10/2008, à 13:16)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#9 Le 16/10/2008, à 13:51

MrWaloo

Re : stocker le résultat d'une commande dans un tableau en shell

1. A quoi ressemble ce que retourne ta commande snmp ?

2. Certain pensent certainement le contraire, mais je pense que bash est un langage pour des scripts simples...
Sans tout remettre en question, as-tu choisi le langage ou est-il imposé ?

2.1. Net::SNMP pour perl, si jamais...


"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.

Hors ligne

#10 Le 16/10/2008, à 13:58

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

1. ma requête me retourne une liste d'adresse mac sous cette forme:
"00 00 68 19 65 78 "
"00 00 68 19 66 3E "
"00 00 E2 8F D2 9F "
"00 01 E6 48 8A A8 "
"00 01 E6 73 CE 93 "
"00 01 E6 76 DD 1B "
"00 02 55 56 B8 18 "
"00 02 55 56 B9 3C "

2. c'est moi qui est choisi le bash parce que je le connais un peu mais je ne suis pas réfractaire au perl wink.

Hors ligne

#11 Le 16/10/2008, à 14:03

MrWaloo

Re : stocker le résultat d'une commande dans un tableau en shell

@tiky : le IFS modifié, le restera pour le script, pour la session bash ou à jamais ?


"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.

Hors ligne

#12 Le 16/10/2008, à 14:14

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

IFS='
'
port=$(snmpwalk -Oqv -v2c -c public adresse_ip 1.3.6.1.2.1.17.4.3.1.1)

echo $(port[1])

Voila mon code et cela me génère cette erreur :

9: port[1]: not found

Cela veut donc dire qu'il ne m'enregistre pas ma commande comme si "port" était un tableau faut t-il changer cette syntaxe :
port=$(snmpwalk -Oqv -v2c -c public adresse_ip 1.3.6.1.2.1.17.4.3.1.1)
et mettre quelque chose comme port[?]?

Ce qui me gène dans le fait de rediriger le résultat de ma commande c'est que je vais devoir mettre ça en place pour une dizaine de switchs donc autant de fichier, ça va faire un peu lourd.

Hors ligne

#13 Le 16/10/2008, à 14:18

tiky

Re : stocker le résultat d'une commande dans un tableau en shell

MrWaloo a écrit :

@tiky : le IFS modifié, le restera pour le script, pour la session bash ou à jamais ?

Oui c'est pour tout le script, mais rien n'empêche de sauvegarder la valeur initiale de IFS pour la restaurer ensuite.

Alucard95:
Tu n'as pas bien lu mon poste, il faut entourer de parenthèse () pour que ce soit interprété comme un tableau. Elles ne sont pas superflues !

table=( $( ... ) )

Dernière modification par tiky (Le 16/10/2008, à 14:25)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#14 Le 16/10/2008, à 14:23

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

quand je rajoute les parenthèse j'ai ce message:

Syntax error: "(" unexpected

J'ai par la suite rajouté des "" comme ça

table="( $( ... ) )"

et la je retrouve mon not found

Hors ligne

#15 Le 16/10/2008, à 14:31

MrWaloo

Re : stocker le résultat d'une commande dans un tableau en shell

de vagues et lointains souvenirs de bash me font poser la question :
Il ne manque pas des ` au début et à la fin de la commande ?
pour donner :

port=(`snmpwalk -Oqv -v2c -c public adresse_ip 1.3.6.1.2.1.17.4.3.1.1`)

Dernière modification par MrWaloo (Le 16/10/2008, à 14:52)


"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.

Hors ligne

#16 Le 16/10/2008, à 14:32

tiky

Re : stocker le résultat d'une commande dans un tableau en shell

Alucard95 a écrit :

quand je rajoute les parenthèse j'ai ce message:

Syntax error: "(" unexpected

J'ai par la suite rajouté des "" comme ça

table="( $( ... ) )"

et la je retrouve mon not found

Tu utilises quel shell pour interpréter ton code?

Essaie ceci avec bash:

#!/bin/bash
IFS='
'
table=( $(ls) )
echo ${table[0]}

Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#17 Le 16/10/2008, à 14:33

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

Alors j'ai modifier mon echo $(port[1]) en echo ${port[1]} et la j'ai l'erreur bad subtitution

Hors ligne

#18 Le 16/10/2008, à 14:35

tiky

Re : stocker le résultat d'une commande dans un tableau en shell

Alucard95 a écrit :

Alors j'ai modifier mon echo $(port[1]) en echo ${port[1]} et la j'ai l'erreur bad subtitution

Relis le man de bash et regarde le wiki: http://www.bash-hackers.org/wiki/doku.php/ pour revoir ( ou voir ) les bases.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#19 Le 16/10/2008, à 14:41

HP

Re : stocker le résultat d'une commande dans un tableau en shell

tiky a écrit :

Essaie ceci avec bash:

#!/bin/bash
IFS='
'
table=( $(ls) )
echo ${table[0]}
#!/bin/bash
index=0

for file in *; do 
    table["$index"]="$file"
    index+=1
done

echo ${table[0]}

cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#20 Le 16/10/2008, à 14:46

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

tiky a écrit :

Essaie ceci avec bash:

#!/bin/bash
IFS='
'
table=( $(ls) )
echo ${table[0]}

J'ai bien fait un copier/coller de ce code et j'obtiens ceci:

$ sh mon_script.sh
mon_script.sh: 4: Syntax error: "(" unexpected

je remet les guillemets et je retrouve l'erreur bad substitution

Hors ligne

#21 Le 16/10/2008, à 14:46

morphoneo69

Re : stocker le résultat d'une commande dans un tableau en shell

met les droit d'executions sur ton script (chmod +x)

Hors ligne

#22 Le 16/10/2008, à 14:47

tiky

Re : stocker le résultat d'une commande dans un tableau en shell

HP a écrit :
tiky a écrit :

Essaie ceci avec bash:

#!/bin/bash
IFS='
'
table=( $(ls) )
echo ${table[0]}
#!/bin/bash
index=0

for file in *; do 
    table["$index"]="$file"
    index+=1
done

echo ${table[0]}

Je sais bien que la méthode que tu proposes est meilleure, je l'ai d'ailleurs dit dans un poste précédent mais le code que j'ai donné et juste pour tester que ma méthode fonctionne bien avec son shell.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#23 Le 16/10/2008, à 14:48

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

excuse moi ticky lorsque je lance mon script avec bash au lieu de sh ton code fonctionne

Hors ligne

#24 Le 16/10/2008, à 14:49

tiky

Re : stocker le résultat d'une commande dans un tableau en shell

Alucard95 a écrit :
tiky a écrit :

Essaie ceci avec bash:

#!/bin/bash
IFS='
'
table=( $(ls) )
echo ${table[0]}

J'ai bien fait un copier/coller de ce code et j'obtiens ceci:

$ sh mon_script.sh
mon_script.sh: 4: Syntax error: "(" unexpected

je remet les guillemets et je retrouve l'erreur bad substitution

Ne MET pas sh devant... je veux justement qu'il soit interprété par bash et pas par dash... et toi tu lui demandes exactement le contraire !
Et quand tu mes des doubles quotes ( les guillemets c'est ça «» ), tu dis ceci à ton shell:
Merci de pas faire de word splitting dans la chaîne qui suit. Donc forcément, tu n'obtiens pas un tableau.

Dernière modification par tiky (Le 16/10/2008, à 14:52)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#25 Le 16/10/2008, à 14:52

Alucard95

Re : stocker le résultat d'une commande dans un tableau en shell

HP a écrit :
#!/bin/bash
index=0

for file in *; do 
    table["$index"]="$file"
    index+=1
done

echo ${table[0]}

Je ne comprend pas très bien cette syntaxe elle fonctionne avec ma requête snmp??
car le "for file in *;" cela veut bien dire pour chaque fichier?

C'est possible d'adapter ta syntaxe à la requête snmpwalk?

Hors ligne