Assignement de valeurs dans un tableau dynamiquement

Résolu/Fermé
romegonic Messages postés 28 Date d'inscription lundi 26 juillet 2010 Statut Membre Dernière intervention 17 avril 2014 - 14 janv. 2013 à 13:05
romegonic Messages postés 28 Date d'inscription lundi 26 juillet 2010 Statut Membre Dernière intervention 17 avril 2014 - 15 janv. 2013 à 10:15
Bonjour,

Je souhaite chercher un ensemble de chemins et les charger dynamiquement dans un tableau, afin de les traiter ensuite.

Or je ne trouve pas dans unix l'équivalent de linux : eval tab_dir=\($directory\)

code linux OK :

for chemin in "${tableau_paths[@]}"
do
if [ -d /usr/$chemin ];then
directory=$(eval 'ls -d /usr/$chemin/profiles/*/config/cells/*Cell*/nodes'); eval tab_dir=\($directory\)
for dir in "${tab_dir[@]}"
do
dmgr=$(eval 'echo ${dir} | cut -d"/" -f5' | cut -c1-8)
chemin_serveurs[$i]='ls -d ${dir}/${dmgr}*/servers'; 2>/dev/null
i=$(($i+1))
done
fi
done

Sous Unix le shell n'encaisse pas eval tab_dir=\($directory\), et si je fais un tab_dir[$j] e, incrémentant $j, j'ai un autre problème, je trouve parfois plusieurs chemins correspondant à mon filtre et ils les charge tous dans la même case de tab_dir (exemple : tab_dir[2]="chemin_02 chemin_03").
En gros je voudrais placer chemin_02 dans tab_dir[2], et voyant un espace il incrémente $j et assigne chemin_03 dans tab_dir[3].

Merci par avance pour votre aide et si je n'ai pas été clair dites le moi.


A voir également:

4 réponses

Utilisateur anonyme
14 janv. 2013 à 14:19
salut,

'eval' ne devrait pas être nécessaire pour faire fonctionner ton code.
En plus, c'est toxique, mieux vaut ne pas l'utiliser.

Et 'ls' est inutile, c'est le shell qui réalise le développement des chemins.
Si tu ne veux récupérer que les répertoires finit le chemin par un slash
$ mkdir unRepertoire
$ touch unFichier
$ echo ./*/
$ ./unRepertoire/
0
romegonic Messages postés 28 Date d'inscription lundi 26 juillet 2010 Statut Membre Dernière intervention 17 avril 2014
Modifié par romegonic le 14/01/2013 à 14:49
Merci pour la réponse.

Pour être plus clair, je vérifie l'existence de plusieurs répertoires, et dans chacun d'entre eux, il se peut qu'il y ait également 2-3 sous répertoires, qui correspondent donc tous au critère initial.

Le but étant de stocker tous ces "chemins à analyser" dans un tableau, dès lors se pose à moi le problème d'un ls -d chemin, qui retourne plusieurs répertoires car on va stocker dans une case du tableau un truc comme "chemin_1 chemin_2 chemin_3" alors qu'on voudrait que chemin_1 aille par exemple dans tableau[7], chemin_2 dans tableau[8] etc ...
Le but est donc d'éclater "chemin_1 chemin_2 chemin_3", sans utliser un cut ou un awk, car on ne sait pas à la base combien de chemins correspondront à la demande (ls -d)
Le eval du code linux ci-dessus permettait de dispatcher en ce sens les chemins trouvés, dans les cases du tableau.

Dans mon cas précis, sans utiliser eval ni ls, comme tu le conseilles :
directory='echo /usr/was70_portal/profiles/*/config/cells/*Cell*'

Je recupère :

# echo $dirtoto
/usr/was70_portal/profiles/eulxrbfrUatNodeProf03/config/cells/ehlr08frUatCell04 /usr/was70_portal/profiles/eulxrbfrUatNodeProf04/config/cells/ehlr08frUatCell05

Et ce que je veux c'est être capable de dispatcher les N chemins trouvés (ici 2 en l'occurence), chacun dans une case d'un tableau.
0
Utilisateur anonyme
14 janv. 2013 à 14:55
Ça ira bien mieux si tu n'utilises ni 'ls', ni 'eval'.

for chemin in "$listPaths[@]}"
do
   # $chemin est un répertoire ?
   chemin=/usr/$chemin
   test -d "$chemin" && printf '%s\n' $chemin/profiles/*/config/cells/*Cell*/nodes
done
au lieu du 'printf', tu pourrais utiliser une autre boucle 'for' pour ajouter chaque répertoire trouvé à un tableau.

Et pense à positionner l'option 'nullglob' sur 'on' avec shopt.

Encore une fois pour être sûr que tu m'entendes
Ça ira bien mieux si tu n'utilises ni 'ls', ni 'eval'.
0
romegonic Messages postés 28 Date d'inscription lundi 26 juillet 2010 Statut Membre Dernière intervention 17 avril 2014
15 janv. 2013 à 10:15
Merci pour ton retour, heureusement tu ne m'a pas encore engueulé pour avoir utilisé une structure de données réputée lourde, le tableau :-)

Le sujet peut être cloturé.
0