Copier un tableau dans un autre en bash

Fermé
Jedebute_72000 Messages postés 4 Date d'inscription vendredi 25 janvier 2019 Statut Membre Dernière intervention 13 février 2019 - 26 janv. 2019 à 00:06
 Jedebute_72000 - 28 janv. 2019 à 00:17
Bonjour,
Je voudrais copier un tableau dans un autre qui contient un nom de variable. Exemple :

declare tab=(a b c)
tabcopy=( "${tab[@]}" )
echo ${tabcopy[@]}
# ça marche

x=0
tab_${x}=( "${tab[@]}" )
echo ${tab_$x[@]}

# ne marche pas. Message : erreur de syntaxe près du symbole inattendu « "${tab[@]}" »
# J'ai essayé en ajoutant des quotes (") sans succès.

Merci pour votre aide.

Configuration: Linux / Firefox 64.0

4 réponses

lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
26 janv. 2019 à 11:20
salut,

declare
, pour un tableau indexé, est inutile.

l'emploi d'une variable dans le nom d'une variable doit être découragé.
ça apporte des complications inutiles.

que veux-tu faire finalement ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
26 janv. 2019 à 11:31
Salut,

eval tab_"${x}"'=( ${tab[@]} )'


Source

0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
26 janv. 2019 à 13:07
oui, mais, «
eval
, c'est mal ! ».

il vaut mieux chercher une autre/meilleure solution, à partir des besoins finaux de l'utilisateur.
d'autant qu'après il faudra retrouver les éléments indexés d'un nom du tableau contenant une variable.

comme je l'ai dit, cette "solution" n'apporte que des complications inutiles.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022
26 janv. 2019 à 13:15
Oui je sais que
eval
c'est evil ;-)

Mais si tu as mieux, je prends ;-)
0
Jedebute_72000
26 janv. 2019 à 14:21
Merci pour la suggestion mais je vais essayer d'éviter cette solution.
0
Jedebute_72000
26 janv. 2019 à 14:17
Bonjour et merci.

Bien noté pour "declare".
J'ai un tableau de la forme :

tab=(objet1 crit1 crit2 crit3 objet2 crit1 crit2 crit3 objet3 crit1 crit2 crit3)

Je cherche tous les objets qui répondent à 1 ou 2 ou 3 critères (donnés dans le désordre).

Je propose les différents critères et demande de faire un choix.
read -p "Taper votre (vos) choix : " choix
Choix=( $choix )

Je pensais boucler sur les choix.
Je cherche tous les objets qui correspondent à un choix et les range dans tab_$x (x étant l'indice de ma boucle) puis je cherche dans tab_$x les objets qui correspondent au deuxième choix et les range dans tab_$y ($y étant le nouvel indice de ma boucle) , .....
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
26 janv. 2019 à 17:17
j'utiliserais d'abord un tableau associatif :
declare -A objets # un tableau associatif doit obligatoirement être déclaré
objets["objet1"]="crit1 crit2 crit3"
objets["objet2"]="crit1 crit2 crit3"
objets["objet3"]="crit1 crit2 crit3"

ensuite, je ne comprends pas bien ce que tu veux faire.
si tu veux ajouter des éléments dans un tableau à chaque boucle, je ne vois pas pourquoi tu voudrais changer le nom du tableau, et par là changer de tableau :/
read -p 'entrez vo(tre/s) choix : ' choix
for c in $choix
do
   for i in "${!objets[@]}"; do [[ ${objets["$i"]} =~ $c ]] && matchObjets+=( "$i" ); done
done
on peut faire sans la boucle sur les choix, en construisant une regex à partir de la variable
choix
...
0
Jedebute_72000
26 janv. 2019 à 23:38
Re-merci,
J'ai pensé aux tableaux associatifs mais le schéma étant répétitif j'ai pensé qu'il serait plus simple de manipuler un tableau indicé.

Désolé : en voulant simplifier ma question j'ai oublié la moitié du problème.
Chaque "crit" peut prendre plusieurs valeurs, par exemple :
crit1 : les lettres de a à z
crit2 : une couleur, bleu, rouge, jaune, blanc, noir
crit3 : un chiffre de 1 à 9

Je recherche tous les objets qui correspondent à 1, 2 ou 3 critère(s).
Par exemple :
- tous les objets "jaune"
- ou tous les objets "blanc" et "h"
- ou tous les objets "rouge" et "8" et "g"

Je veux seulement les afficher.
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
Modifié le 27 janv. 2019 à 01:19
pas de problème : plusieurs tabloAsso ;)
#!/bin/bash

declare -A lettre couleur chiffre critR
declare -i nbCrit match
objets=( objet_1 objet_2 objet_3 objet_n )
lettre["objet_1"]="c"
couleur["objet_1"]="jaune"
chiffre["objet_1"]=7
#etc
for i in lettre couleur chiffre
do
   read -p "critère $((++n)): $i: " critR["$i"]
   test -n "${critR["$i"]}" && nbCrit+=1
done

for o in "${objets[@]}"
do
   for c in critR
   do
      test -n "${critR["$c"]}" && test "${lettre["$o"]}" = "${critR["$c"]}" && match+=1
   done
   ((match==nbCrit)) && echo "$o"
done
j'espère qu'on aura une bonne note.

mais, bon, il te reste quand même du boulot. ;)
0
Jedebute_72000
28 janv. 2019 à 00:17
Ok, merci. Il ne restera aussi à écrire un script pour transformer mon tableau indicé en associatif (j'ai beaucoup d'"objets").
0