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 02/04/2018, à 18:07

Brice Jeunieaux

[Résolu] Créer une variable dont le nom dépend d'une autre variable

Bonjour / bonsoir ,

j'aimerais que la valeur d'une variable se retrouve dans le nom d'une variable, et pour le moment je sèche en ayant épuisé mes ressources intellectuelles...

Concrètement, j'essaie d'avoir quelque chose sous cette forme :

var1=4 ;
Variable$var1=Quelquechose                    # Ma variable contenant "Quelquechose" s'appellera donc 'Variable4'.

Après, je ne suis pas contre avoir une démarche similaire qui me donnerait le même résultat à la fin, mais j'ai essayé directement cette syntaxe, et forcément, ça ne veut pas, j'ai donc essayé d'autres syntaxes, mais ça ne veut pas non plus, et étant obligé d'avoir des variables dont le nom est issu en partie d'une autre variable, je sèche et c'est pourquoi j'en viens à appeler la puissance constructive du forum. wink


Merci beaucoup à vous d'éclairer ma lanterne affaiblie ! smile

Dernière modification par Brice Jeunieaux (Le 05/04/2018, à 21:43)

Hors ligne

#2 Le 02/04/2018, à 18:46

Watael

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

salut,

-> tableau associatif.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 02/04/2018, à 19:10

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Watael a écrit :

salut,

-> tableau associatif.

J'aimerais bien avoir à régler mon problème sans tableau, justement, mais bien que connaissant les tableaux associatifs, je ne vois pas où tu veux en venir ? Peux-tu expliquer en détail ? hmm

Hors ligne

#4 Le 02/04/2018, à 19:30

Watael

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

declare -a tableau # si var1 = un nombre : tableau indexé
var1=4
tableau["$var1"]="Quelque chose"
declare -A tableAsso # si var1 != un nombre : tableau associatif
var2="du texte"
tableAsso["$var2"]="quelque chose"

si ça ne te va pas, il faut expliciter la situation.

EDIT : tableAsso["$var2"] et pas tableASso["$var1"]

Dernière modification par Watael (Le 14/04/2018, à 18:05)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 02/04/2018, à 19:40

erresse

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Sinon, juste pour faire enrager Watael, il y a :

#!/bin/bash
# index-ref.sh : Référencement de variable indirecte.
# Accéder au contenu du contenu d'une variable.

a=lettre_de_l_alphabet # La variable a contient le nom d'une autre variable.
lettre_de_l_alphabet=z

echo

# Référence directe.
echo "a = $a"          # a = lettre_de_l_alphabet

# Référence indirecte.
eval a=\$$a
echo "Maintenant, a = $a" # Maintenant, a = z

echo

... mais bien sûr, "eval c'est mal" !


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#6 Le 02/04/2018, à 20:08

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Watael a écrit :
declare -a tableau # si var1 = un nombre : tableau indexé
var1=4
tableau["$var1"]="Quelque chose"
declare -A tableAsso # si var1 != un nombre : tableau associatif
var="du texte"
tableAsso["$var1"]="quelque chose"

si ça ne te va pas, il faut expliciter la situation.


Je pense que oui, je vais expliquer directement la situation, ce sera plus clair pour tout le monde...

J'ai un certain nombre de lignes dans un fichier texte, sous cette forme :

l1x;0;Brice Jeunieaux;0;0;-Aucun article-;0
l2x;1;Jean Dupré;1;4;Pommes;0
l3x;4;Manon Delafaux;2;3;Poire;0
l4x;5;André Dussollier;3;8;Citrons;1
l5x;3;Jacques Villeret;4;3;Tomates;0
l6x;8;René Androt;5;2;Concombres;0
l7x;2;Charles Beziers;6;10;Salades;0
l8x;7;Jane Darcq;7;1;Choux;2
l9x;6;Phil Dastroid;8;6;Patates;0
l10x;9;Karine Velchamps;9;6;Radis;1
l11x;10;Salim Déffraie;10;2;Tomates;0

J'aimerais avoir une variable appelée "pageCatgX" (Le X sera en fait une variable qui vaudrait 1, 2 ou 3).
J'aimerais également que cette variable "pageCatgX" soit un tableau contenant les lignes de 1*X à 4*X.

C'est pour ça qu'au début de chacune de mes lignes j'ai "l4x" par exemple. Le numéro entre le l et le x ira de $(($X*1)) à $(($X*4)).


Désolé si je m'exprime mal là dessus, mais je peux pas non plus vous expliquer toute la démarche depuis le début, sinon il faudrait que je vous parle de tout mon projet pour en comprendre le fonctionnement interne... lol

Hors ligne

#7 Le 02/04/2018, à 20:33

pingouinux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Bonsoir,
Pour répondre à la question initiale, dans la même optique que erresse #5 :

var1=4 ;
eval Variable$var1=Quelquechose
echo "Variable4=$Variable4"

Il faut bien entendu être sûr du contenu de la variable var1, et notamment qu'elle ne contienne pas de code malveillant.

En ligne

#8 Le 02/04/2018, à 20:44

Watael

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

je peux pas non plus vous expliquer toute la démarche depuis le début, sinon il faudrait que je vous parle de tout mon projet pour en comprendre le fonctionnement interne

ce serait pourtant, peut-être, mieux, parce que si le projet est entamé de travers... hmm
c'est en général le cas quand on en arrive à ce type de complication.
KISS!

si tu veux mettre un fichier dans un tableau, il y a mapfile.
après tu te débrouilles* pour lire le nombre d'indices que tu veux...

*demandes conseil en étant clair sur tes souhaits


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 02/04/2018, à 20:46

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

pingouinux a écrit :

Bonsoir,
Pour répondre à la question initiale, dans la même optique que erresse #5 :

var1=4 ;
eval Variable$var1=Quelquechose
echo "Variable4=$Variable4"

Il faut bien entendu être sûr du contenu de la variable var1, et notamment qu'elle ne contienne pas de code malveillant.

Bonsoir,

je ne comprends pas qu'est-ce que ce code fait (je ne l'ai pas encore testé sur mon programme), mais quel est le but de la commande eval ?
Cela semble intéressant car si ça peut résoudre mon problème en si peu de lignes, alors cette commande se trouve pile poil dans l'esprit de mon programme.


EDIT : C'est bon j'ai lancé ce morceau de code, et dans ma situation, c'est vraiment ce qu'il me faut mais je rencontre une erreur car ma 'Variable4' contiendra en fait un tableau, donc est-ce que les eval ne fonctionnent pas avec les tableaux ou bien je m'y prends mal ?

Dernière modification par Brice Jeunieaux (Le 02/04/2018, à 21:13)

Hors ligne

#10 Le 02/04/2018, à 21:11

pingouinux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Voici le retour de help eval :

eval: eval [arg ...]
    Execute arguments as a shell command.
   
    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.
   
    Exit Status:
    Returns exit status of command or success if command is null.

En ligne

#11 Le 02/04/2018, à 21:14

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

pingouinux a écrit :

Voici le retour de help eval :

eval: eval [arg ...]
    Execute arguments as a shell command.
   
    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.
   
    Exit Status:
    Returns exit status of command or success if command is null.

Mince, j'ai édité entre-temps... hmm
Le petit bout de code en guise de démonstration fonctionne à merveille, mais pas pour ma variable qui contiendra un tableau... hmm

Hors ligne

#12 Le 02/04/2018, à 21:18

nam1962

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Je suis ce fil  ! smile


[ Modéré ]

Hors ligne

#13 Le 03/04/2018, à 08:33

credenhill

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

hello
ou aussi

$ var1=111
$ var2=222
$ var3=333
$ x=2
$ varx=var$x
$ echo $varx
var2
$ echo ${!varx}
222
$ x=1
$ varx=var$x
$ echo ${!varx}
111

Hors ligne

#14 Le 03/04/2018, à 10:22

kholo

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

salut,
je pense que le problème de base vient de là :

var1=4

en fait dans le moteur tout est prétexte à tableau alors pourquoi var1 et pas var[1] ?
le problème vient de lFS et des cafouillages qui en résultent.
En restant propre, pas la peine de toucher à IFS
on déclare var

var=()

et on rempli

var=()
var[0]="un truc"
var[1]="un autre truc"

ou on ajoute une ligne d'un tableau à 1 élément au tableau var

var=()
var+=("un truc")
var+=("un autre truc")
NB a écrit :

c'est ici que naissent les embrouilles :
var+="un truc" est pour CONCATÉNER du texte

ensuite l'accès aux éléments du tableau

echo "la valeur 0 est ${var[0]}"

ou à tous les éléments :
si je fais :

for ((n=0;n<${#var[@]};n++ ))
do
    echo "element $n : ${var[$n]}"
done

ou si je fais

n=0
for element in "${var[@]}"
do
    echo "element $n : $element"
    ((n++))
done

mon retour sera

element 0 : un truc
element 1 : un autre truc

par défaut, les tableaux sont indexés en numérique mais on peut très bien utiliser du texte
l'avantage d'avoir des nombres est que l'on peut faire des calculs plus ou moins complexes dessus.

voilà tu n'as plus d'excuse à utiliser var1 et eval
car eval c'est mal wink

Hors ligne

#15 Le 04/04/2018, à 15:33

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Watael a écrit :

je peux pas non plus vous expliquer toute la démarche depuis le début, sinon il faudrait que je vous parle de tout mon projet pour en comprendre le fonctionnement interne

ce serait pourtant, peut-être, mieux, parce que si le projet est entamé de travers... hmm
c'est en général le cas quand on en arrive à ce type de complication.
KISS!

*demandes conseil en étant clair sur tes souhaits

Je ne sais pas si ça pourrait vraiment aider mais on ne sait jamais donc voilà :

je programme une base de donnée sous forme d'un fichier .txt et je la manipule avec un fichier en Bash.
J'affiche mes données à un endroit de l'écran, et ça ressemble grosso-modo à "Numéro commande - Nom client - Nb articles - Libellé article - etc...".
J'ai également créé un système de défilement, lorsque le nombre de "lignes de données" (comme j'aime à les appeler) est supérieur à 15.
En gros, j'en affiche quinze à la verticale à un endroit de l'écran, et avec un appui touche, j'affiche les 15 suivantes, etc... Bref, un système de pages.

Ce système est actuellement "parfaitement" fonctionnel, mais malheureusement uniquement pour un nombre de "lignes de données dont le modulo(15)=0.
Je n'arrive donc à afficher correctement mes données que lorsque j'ai des pages de 15 lignes. Si j'ai 33 lignes, j'aurais donc 2 pages, et 3 lignes restantes.

J'ai donc des complications pour afficher le reste des lignes de données ne remplissant pas une page complète et c'est pourquoi j'ai voulu changer de système.

Ainsi, je veux créer un système qui, après avoir compté le nombre de lignes dans la BD (ça, je sais faire), va faire une boucle et va "ajouter les 15 premières lignes à la page 1", les 15 lignes suivantes à la page 2, etc etc, et grâce à une opération de modulo, va "comprendre" quand j'arriverai à ce fameux reste de lignes qui ne remplissent pas une page, et les affecter à une nouvelle page.


Donc, l'objectif de mon sujet est de réussir à créer une variable VariableX dont le 'X' sera le numéro de la page, et après je pense pouvoir me débrouiller pour faire rentrer dans ce tableau les lignes correspondante à la 'X'ième page...


EDIT : Ce que j'ai mis en gras sont les parties importantes de cette fonctionnalité d' "appartenance des lignes à une telle ou une telle page et de défilement des pages".

Dernière modification par Brice Jeunieaux (Le 04/04/2018, à 15:41)

Hors ligne

#16 Le 04/04/2018, à 15:36

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

@Watael Si jamais tu voudrais explorer par toi-même le script pour en comprendre le fonctionnement, je mets mon Github juste en dessous wink :

https://github.com/bricejeunieaux/Crepe

Hors ligne

#17 Le 04/04/2018, à 17:33

kholo

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

salut,
coquilles et améliorations primaires :

déprécié : usage de function

function nbLignesEntrees() {
... du code
}
nbLignesEntrees() {
... du code
}

tu as modifié le nom de ta bd mais pas dans le code (ou l'inverse)
du coup erreur au lancement : trouve pas la bd

ta bd est nommée en dur, il vaut mieux mettre son nom dans une variable

déprécié : les quottes inversées `  unefonction ` sont à remplacer par $(unefonction)

nbLignesBD=`wc -l bdEnt.txt | cut -d ' ' -f 1`
nbLignesBD=$(wc -l bdEnt.txt | cut -d ' ' -f 1)

pas besoin du +1 si tu mets <= à la place de <

a<$nbLignesBDReel+1
a<=$nbLignesBDReel

tongue

plus concis

nbLignesRencontrees=$(($nbLignesRencontrees+1))
$(($nbLignesRencontrees++))

... tout cela serait plus facilement gérable en tableau...

Hors ligne

#18 Le 04/04/2018, à 20:26

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Déjà, merci kholo pour toutes ces petites observations. tongue
J'avais remarqué certaines bourdes, sans pour autant les avoir remplacé, me focalisant sur les problèmes du système de défilement (honte sur moi ? ^^).
Désolé si je vais avoir plein de questions ci-dessous, mais tes recommandations m'intriguent, donc c'est parti :


kholo a écrit :

déprécié : usage de function

function nbLignesEntrees() {
... du code
}
nbLignesEntrees() {
... du code
}

Pourquoi vaut-il mieux enlever le 'function' ? Une utilité ou autre sens si avec ?


kholo a écrit :

tu as modifié le nom de ta bd mais pas dans le code (ou l'inverse)
du coup erreur au lancement : trouve pas la bd

Tu dois avoir une ancienne version de mon script+BD, je ne sais pas comment (moi qui ai écrit l'ancien nom ci-dessus ou ancien fichier Github ?)
En tout cas, normalement, la version avec les noms corrects ('crepeScript.sh' et 'crepeBD.txt') se trouve actuellement sur Github.


kholo a écrit :

ta bd est nommée en dur, il vaut mieux mettre son nom dans une variable

Quel est le problème avec le fait de nommer un fichier "en dur" ? Y a-t-il un inconvénient à cela ?


kholo a écrit :

déprécié : les quottes inversées `  unefonction ` sont à remplacer par $(unefonction)

nbLignesBD=`wc -l bdEnt.txt | cut -d ' ' -f 1`
nbLignesBD=$(wc -l bdEnt.txt | cut -d ' ' -f 1)

Ça aussi, je savais qu'il y avait deux syntaxes différentes, mais je n'en ai toujours pas compris les subtilités de l'une par rapport à l'autre...


kholo a écrit :

pas besoin du +1 si tu mets <= à la place de <

a<$nbLignesBDReel+1
a<=$nbLignesBDReel

tongue

Ça tombe bien, je m'en suis fait la réflexion à un moment dans un fichier (uploadé ou non, je ne sais plus), à corriger pour ma pomme ! tongue


kholo a écrit :

plus concis

nbLignesRencontrees=$(($nbLignesRencontrees+1))
$(($nbLignesRencontrees++))

... tout cela serait plus facilement gérable en tableau..

Je dois reconnaître que l'on a vite fait de se perdre avec du code non explicite et non-clair (+50XP pour moi).
Par contre, je ne vois pas comment tu voudrais t'y prendre en le faisant avec un tableau ? Je vais y réfléchir...

Encore merci pour toutes ces remarques que je vais m'empresser de prendre en compte avant de finir le système de défilement... big_smile

Hors ligne

#19 Le 05/04/2018, à 12:47

kholo

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

bon,

Brice Jeunieaux a écrit :

Pourquoi vaut-il mieux enlever le 'function' ? Une utilité ou autre sens si avec ?

c'est juste déprécié... comme les quottes inversées

Brice Jeunieaux a écrit :

Tu dois avoir une ancienne version de mon script+BD, je ne sais pas comment (moi qui ai écrit l'ancien nom ci-dessus ou ancien fichier Github ?)
En tout cas, normalement, la version avec les noms corrects ('crepeScript.sh' et 'crepeBD.txt') se trouve actuellement sur Github.

les fichiers sont bons mais c'est ton script qui pointe encore sur les anciens noms et donc empêche le fonctionnement...
sauf si tu as fais des modifs depuis mon téléchargement

Brice Jeunieaux a écrit :

Quel est le problème avec le fait de nommer un fichier "en dur" ? Y a-t-il un inconvénient à cela ?

techniquement aucun, mais si tu vas pour faire quelque chose de générique, en mettant le nom de fichier dans une variable, l'étape d'après est une routine pour choisir un fichier.

Pour les tableaux, comme je l’écrivais précédemment ce n'est que du jonglage avec des écritures.

j'en profite pour ajouter que ton fichier txt est en définitive un csv.
les lignes vides ne doivent pas être primordiales tout comme les espaces dans ta ligne d’entête.
une façon simple pour parser un fichier texte :

unFichier="le/fichier/que/tu/veux"
while read ligne
do
    echo "une ligne : $ligne"
done < "$unFichier"

puis, à la place de

echo "une ligne : $ligne"

..., tu ajoutes un parseur pour chaque ligne avec le bon séparateur

IFS=';' ligne=( $ligne )
element0="${ligne[0]}"
...

NB : element0 à adapter...

Dernière modification par kholo (Le 05/04/2018, à 12:49)

Hors ligne

#20 Le 05/04/2018, à 14:28

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

kholo a écrit :

Pour les tableaux, comme je l’écrivais précédemment ce n'est que du jonglage avec des écritures.

j'en profite pour ajouter que ton fichier txt est en définitive un csv.
les lignes vides ne doivent pas être primordiales tout comme les espaces dans ta ligne d’entête.
une façon simple pour parser un fichier texte :

unFichier="le/fichier/que/tu/veux"
while read ligne
do
    echo "une ligne : $ligne"
done < "$unFichier"

puis, à la place de

echo "une ligne : $ligne"

..., tu ajoutes un parseur pour chaque ligne avec le bon séparateur

IFS=';' ligne=( $ligne )
element0="${ligne[0]}"
...

NB : element0 à adapter...

Je ne savais pas ce qu'était un CSV, je n'ai pas une tonne de connaissance, je me développe petit-à-petit, et j'avoue que ça m'a fait rire de lire la définition d'un CSV, parcequ'en créant ma BD, je pensais avoir eu l'idée du siècle en utilisant ce système de lignes, de séparateur et de taper dessus à coup de grep, mais c'est quelque chose de banal sur Internet, en fait... lol

Pour ce qui est des tableaux, en lien avec la problématique de mon topic, je pense que j'ai eu suffisamment de réponses pour découvrir par moi-même le fonctionnement des solutions qui me sont proposées (je n'ai pas encore eu le temps de trop y jeter un coup d'œil, à cause de priorités du quotidien...), donc je pense que je vais considérer ce sujet comme résolu le temps de travailler sur la chose... wink

Hors ligne

#21 Le 06/04/2018, à 10:52

kholo

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

bon,
on passe tous par là...
on réinvente la roue, on fini par voir le vélo autour pour, finalement, se rendre compte que c'était une moto !
bonne lecture ! wink

Hors ligne

#22 Le 06/04/2018, à 19:26

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

kholo a écrit :

bon,
on passe tous par là...
on réinvente la roue, on fini par voir le vélo autour pour, finalement, se rendre compte que c'était une moto !
bonne lecture ! wink

Ahah, j'adore ton "proverbe", si je puis dire ! wink
Merci encore pour tes conseils quant aux coquilles, c'est le genre de petites connaissances qui font progresser ! smile

Hors ligne

#23 Le 17/04/2018, à 15:41

Watael

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

@Watael Si jamais tu voudrais explorer par toi-même le script pour en comprendre le fonctionnement, je mets mon Github juste en dessous wink :

https://github.com/bricejeunieaux/Crepe

ce script n'est apparemment pas un "Système de Gestion de Base de Données" (il n'y a aucune gestion des données), mais plus vraisemblablement un "Système de Gestion de l'Affichage d'un Fichier CSV"...?
cela me parait inutilement alambiqué, et, comme je l'ai déjà dit, te fait aller dans des complications bien vaines.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#24 Le 17/04/2018, à 16:59

Brice Jeunieaux

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Watael a écrit :

@Watael Si jamais tu voudrais explorer par toi-même le script pour en comprendre le fonctionnement, je mets mon Github juste en dessous wink :

https://github.com/bricejeunieaux/Crepe

ce script n'est apparemment pas un "Système de Gestion de Base de Données" (il n'y a aucune gestion des données), mais plus vraisemblablement un "Système de Gestion de l'Affichage d'un Fichier CSV"...?
cela me parait inutilement alambiqué, et, comme je l'ai déjà dit, te fait aller dans des complications bien vaines.

Pour l'instant, effectivement, je ne fais qu'afficher et mettre en forme les données d'un fichier CSV, mais le réel traitement des données est prévu pour plus tard... C'est peut-être donc un bien grand nom pour pas grand chose, en réalité, vu le développement actuel de mon projet, mais l'idée de vouloir me créer quelque chose de bien complet me motive... wink

Hors ligne

#25 Le 17/04/2018, à 17:07

nam1962

Re : [Résolu] Créer une variable dont le nom dépend d'une autre variable

Et je suis toujours ce fil smile


[ Modéré ]

Hors ligne