IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Créer plusieurs variables à l'aide d'une seule variable


Sujet :

Shell et commandes POSIX

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Créer plusieurs variables à l'aide d'une seule variable
    Bonjour,

    je cherche à savoir s'il était possible avec une boucle for par exemple de générer plusieurs variables à partir d'une seule et même variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Par exemple : 
     
    for i in `seq 1 10`
    do
       while [ -z $nombre{$i} ]
       do
          read -p 'Nombre : ' nombre{i}
       done
    done


    Evidemment ceci ne fonctionne pas et j'aimerais bien connaître la raison svp.

    Merci beaucoup

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Bonjour

    Tu peux effectivement utiliser un tableau.
    Car, avoir plusieurs valeurs à partir d'un seul nom, c'est bien le concept du tableau.
    Par contre, la syntaxe que tu utilises n'est pas la bonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ toto=(je veux tes yeux que tes beaux yeux meme en photo)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ for ((i=0;i<10;i++)); do echo ${toto[$i]};done
    je
    veux
    tes
    yeux
    que
    tes
    beaux
    yeux
    meme
    en
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ for i in "${toto[@]}"; do echo $i;done
    je
    veux
    tes
    yeux
    que
    tes
    beaux
    yeux
    meme
    en
    photo
    Si ton cas est plus complexe, je t'invite à vite considérer ton script comme une manipulation de fichier (avec un(e) donnée/enregistrement par ligne)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    En réalité ce que je cherche à faire est un peu plus complexe.
    Je cherche à créer à partir de la variable "nombre" plusieurs variables "nombre1" "nombre2" ... jusqu'à "nombre10".
    Et j'avoue ne pas du tout y arriver

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    À quoi est égal nombre1 ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    nombre1, nombre2... sont saisies par l'utilisateur grâce à un read. Mais du coup le read doit être également inséré dans ma boucle for

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Donc ce n'est pas "nombre1" à partir de "nombre". Mais "nombre" à partir de "nombre1".

    À quoi égal "nombre" alors ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Mon objectif est de créer on va dire 10 variables à partir de la variable nombre.
    Donc à partir de nombre je souhaite obtenir nombre1,nombre2....nombre10

    La syntaxe est fausse mais un truc dans ce style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in `seq 1 10`
    do
       while [ -z $nombre{$i} ]
       do
          read -p 'Nombre : ' nombre{i}
       done
    done
    Pour i allant de 1 à 10, l'utilisateur saisit "nombre1, nombre2...nombre10"

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Treqz Voir le message
    Pour i allant de 1 à 10, l'utilisateur saisit "nombre1, nombre2...nombre10"
    Je pense qu'en réalité, tu voulais dire que l'utilisateur saisit les valeurs à affecter aux variables nombre1, nombre2...nombre10, non?

    Je suis d'accord avec Flodelarab: àmha, la bonne solution est effectivement de passer par un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    for i in {1..3}
    do
       while [ -z "${nombre[$i]}" ]
       do
          read -p "Nombre$i : " num
          nombre[$i]=$num
       done
    done
     
    for i in {1..3}; do echo ${nombre[$i]}; done
    Sinon, si tu veux vraiment fabriquer des variables, du coup, il faut passer par "eval" (qui est evil!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    for i in {1..3}
    do
       while eval test -z "\$nombre$i" # eval is evil
       do
          read -p "Nombre$i : " num
          eval nombre$i=\$num # eval is evil
       done
    done
     
    for i in {1..3}; do eval echo "\$nombre$i"; done #eval is evil
    Rq: il y a un petit bug (laissé en exercice au lecteur) dans le cas où l'un des "nombres" saisis est une chaine de caractères contenant des espaces, comme "a b", par exemple...

    Rq: si l'utilisateur saisit une expression bizarre, comme, au hasard, $(rm -rf /), le résultat pourrait avoir des conséquences plus ou moins gênantes (à tester)...

    Rq: En fait, non, je n'ai pas réussi à créer de problème avec cette version:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    for i in {1..3}
    do
       while eval "test -z \"\${nombre$i}\""
       do
          read -p "Nombre$i : " num
          eval nombre$i=\$num
       done
    done
     
    for i in {1..3}; do eval echo "\$nombre$i"; done
    Mais peut-être qu'en cherchant bien...

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Citation Envoyé par Treqz Voir le message
    Mon objectif est de créer on va dire 10 variables à partir de la variable nombre.
    Donc à partir de nombre je souhaite obtenir nombre1,nombre2....nombre10

    La syntaxe est fausse mais un truc dans ce style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in `seq 1 10`
    do
       while [ -z $nombre{$i} ]
       do
          read -p 'Nombre : ' nombre{i}
       done
    done
    Pour i allant de 1 à 10, l'utilisateur saisit "nombre1, nombre2...nombre10"
    Tu veux pas le répéter encore une fois ? Nous avions bien lu dès la première fois.

    En réalité ce que je cherche à faire est un peu plus complexe.
    En quoi ce que tu cherches à faire est-il plus complexe qu'un tableau ?
    Explique-nous ce dont tu as besoin et nous t'expliquerons comment t'en passer.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    en effet, il ne faut pas chercher plus loin : une variable numérotée/indexée, c'est un tableau !

    et si c'est complexe, il faut simplifier : KISS
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    C'est bon Jack a parfaitement trouvé ce que je cherchais.
    Mercééé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri de plusieurs tableux à l'aide d'une seule recherche
    Par Crazy-Frog_67 dans le forum Excel
    Réponses: 2
    Dernier message: 15/05/2018, 10h46
  2. Réponses: 4
    Dernier message: 13/02/2014, 16h54
  3. Réponses: 9
    Dernier message: 10/02/2008, 18h14
  4. Créer plusieurs tables identiques vues comme une seule
    Par maqfab dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/10/2007, 12h41
  5. Réponses: 3
    Dernier message: 06/04/2007, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo