Menu

Remplir un tableau dans une boucle for [Résolu/Fermé]

Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
-
Bonjour, je débute en script bash et j'ai un souci pour remplir un array via une boucle for.
Voici mon script:

tablo=("A" "B" "C" "D" "E" "F" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z")
declare -A tablo2

for lettre in ${tablo[@]}
do
    tablo2[$lettre]=$lettre
done

echo 'Clé => '${!tablo2[@]}
echo 'Valeur => '${tablo2[@]}


Et la logiquement, je devrais avoir un array avec pour clé les 26 lettres de l'aphabet et pour valeur la meme chose que les clés.
Or ce que j'obtiens c'est un tableau avec 0 comme clé et Z comme valeur

Donc comment faire pour obtenir un tableau de ce type avec ma boucle:
Clé A = Valeur A
Clé B = Valeur B
Clé C = Valeur C
...

Merci et bonne journée

Afficher la suite 

8 réponses

0
Merci
salut,

tel quel ton script fonctionne :
tablo2
a bien 26 indices de A à Z, ayant comme valeur A...Z
#!/bin/bash

declare -A tablo2
tablo=( {A..Z} )
for lettre in "${tablo[@]}"; do tablo2["$lettre"]="$lettre"; done
for i in "${!tablo2[@]}"; do echo "clé $i => valeur ${tablo2["$i"]}"; done


PS: n'oublie pas les guillemets, sinon tu auras de mauvaises surprises.
Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
1
0
Merci
Bonjour merci de ta réponse.
J'ai fait un copier coller de ton script et malheureusement lorsque je l’exécute dans la console j’obtiens toujours le même résulta a savoir:

Clé => 0
Valeur => Z

De plus, quand j’exécute cette commande pour avoir la taille du tableau j'obtiens 1

echo ${#tablo2[@]}


Ya un truc qui m'échappe mais quoi?
zipe31
Messages postés
36336
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
31 mars 2019
6030 -
Salut,

Je vois que tu es sous Mac, donc, quel shell utilises-tu ? Comment lances-tu ton script ?
Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
1
0
Merci
Bonjour je suis sous bash et je lance mon script en entrant le chemin absolu dans la consol
zipe31
Messages postés
36336
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
31 mars 2019
6030 -
Rajoutes
set -x
après le shebang, relances ton script et fais-nous un copier/coller de la sortie.
Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
1
0
Merci
ok voici ce que j'obtiens:


+ tablo=({A..Z})
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=A
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=B
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=C
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=D
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=E
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=F
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=G
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=H
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=I
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=J
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=K
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=L
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=M
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=N
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=O
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=P
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=Q
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=R
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=S
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=T
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=U
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=V
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=W
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=X
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=Y
+ for lettre in '"${tablo[@]}"'
+ tablo2["$lettre"]=Z
+ for i in '"${!tablo2[@]}"'


il semble que le problème vienne du fait que la clé prenne pour valeur le nom de ma variable et non la valeur de ma variable
Utilisateur anonyme -
non, la sortie du debug fait la même chose sur mon installation, excepté qu'à la fin elle montre l'itération du tableau associatif.

SAUF si je ne déclare pas le tableau associatif :
+ for i in "${!tablo2[@]}"
+ echo 'clé 0 => valeur Z'
clé 0 => valeur Z
ton premier code montre que tu déclares bien le tableau associatif (
declare -A
).

la version de bash sur macOSx aurait-elle pu être bridée ?
zipe31
Messages postés
36336
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
31 mars 2019
6030 > Utilisateur anonyme -
Salut,
la version de bash sur macOSx aurait-elle pu être bridée ?
Bridée ? Non, mais à la bourre, oui ;-(
Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
1
0
Merci
je pense savoir d’où viens le problème. La version bash installé sur ma machine est une version 3 qui apparemment n'autorise pas les tableaux associatif. Pour ça il faut une version 4 de bash
Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
1
0
Merci
ok ça fonctionne avec la dernière version de bash le problème est que je suis obliger de changer le shebang
#!/bin/bash
par
#!/usr/local/bin/bash

Se qui n'est pas tres portable.

Je cherche de mon coté mais si toute fois vous avez une solution pour que je puisse utiliser le shebang classique je suis preneur.
Merci beaucoup pour votre aide
si c'est ta machine perso, tu renommes
/bin/bash
en
/bin/bash.orig
, et tu fais un lien de
/usr/bin/bash
vers
/bin/bash

...
Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
1
0
Merci
Ok merci, je mets en résolu.
Pour ceux que ça intéresse voici comment j'ai fait pour mettre à jour bash sur osx

donc en premier, il faut vérifier si xcode est à jour.
Pour faire la maj via le terminal entrer:

xcode-select --install


ensuite executer
brew install bash

si vous avez une erreur lors de l'installation, il ce peu que ce soit du au fait que xcode n'est pas à jour (ce fut le cas pour moi).

j'ai ensuite executé ces commandes pour changer le shell par defaut
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells' sudo chsh -s /usr/local/bin/bash 



script trouvé ici : https://translate.googleusercontent.com/translate_c?depth=1&hl=fr&prev=search&rurl=translate.google.fr&sl=en&sp=nmt4&u=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F6047648%2Fbash-4-associative-arrays-error-declare-a-invalid-option&usg=ALkJrhhYnFERaOaZs057jvn6lHuEY81ABQ

ensuite vérifier la version de bash en faisant
bash --version


la normalement la derniere version doit s'afficher en ce qui me concerne ça donne ça
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin15.6.0)
Copyright (C) 2016 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>

Ceci est un logiciel libre ; vous être libre de le modifier et de le redistribuer.
AUCUNE GARANTIE n'est fournie, dans les limites permises par la loi.


Voila ensuite il faut utiliser #!/usr/local/bin/bash comme shebang et non #!/bin/bash sinon ce sera l’ancienne version qui ce lancera.

je vais tester la solution de "qqchquicommenceparQ" pour garder le shebang d'origine, je reviens des que j'y serais arrivé
Messages postés
40058
Date d'inscription
lundi 21 janvier 2008
Statut
Modérateur
Dernière intervention
3 avril 2019
9383
0
Merci
Bonjour

Merci d'avoir participé à ce forum.
Il semble que votre problème ai trouvé une réponse.

Si la réponse vous satisfait je vous invite à mettre en résolue, c'est très simple.

Merci de cliquer sur >CE LIEN<

PS: Si vous l'avez résolu vous même, il pourrait être intéressant de poster la solution pour les autres internautes.

Cordialement
lamouchetsetse
Messages postés
59
Date d'inscription
samedi 2 août 2014
Statut
Membre
Dernière intervention
16 septembre 2018
1 -
Juste pour info, sous osx il n'est pas possible de changer le nom ou de poser un lien sur bash. Cette fonctionnalité à été bridé par sécurité.
Pour faire sauté ce bridage il faut ouvrir un shell en mode récupération et entrer la commande
sudo csrutil disable
et redémarer la machine