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 GNU Discussion :

Création d'une boucle for à partir de deux variables


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Création d'une boucle for à partir de deux variables
    Bonjour,

    Je cherche à créer une boucle for à partir de deux variables qui seront des lettres :
    Les variables sont renseignées par l'utilisateur :
    lettre_debut
    lettre_fin

    Je veux que ma boucle parcourt les lettres de la première à la dernière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in {$lettre_debut .. $lettre_fin}; do echo $i; done
    J'ai testé la boucle avec des données déjà déterminées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in {A .. E}; do echo $i; done
    cela fonctionne par contre, dès que je cherche à utiliser des variables, cela ne fonctionne pas.
    J'ai pensé à utiliser un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in ${tableau[@]}  ; do echo $i; done
    mais se pose le problème de la création du tableau pour qu'il contienne les valeurs de $lettre_debut à $lettre_fin

    Est-ce que je fais des erreurs de syntaxes ?
    Est-ce qu'il y a des pistes auxquelles je n'ai pas pensé ?

    Merci pour votre aide.
    Patrick

  2. #2
    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
    Bonjour,
    Est-ce que je fais des erreurs de syntaxes ?
    oui et non.
    oui, parce qu'il ne devrait pas y avoir d'espaces entre les .. et les "bornes".
    non, parce le développement des accolades intervient avant celui des variables.

    Est-ce qu'il y a des pistes auxquelles je n'ai pas pensé ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ lettres=( {a..z} {A..Z} )
    $ declare -A Lettres
    $ for l in "${lettres[@]}"; do Lettres[$l]=$((n++)); done
    $ begin=A; end=E
    $ for l in ${lettres[@]:${Lettres[$begin]}:${Lettres[$end]}-${Lettres[$begin]}+1}; do echo $l; done
    A
    B
    C
    D
    E
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Décorticage
    Merci pour cette proposition qui fonctionne comme je l’attendais.

    Pour que je continue à progresser, je la décompose pour voir si j'ai bien tout compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lettres=( {a..z} {A..Z} )
    Déclaration d'un tableau contenant les lettres de a à z en minuscule et en majuscule.

    Déclaration d'un tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for l in "${lettres[@]}"; do Lettres[$l]=$((n++)); done
    Affectation de chaque élément de lettres dans le tableau Lettres

    Déclaration des deux variables qui bornent l'intervalle (dans mon cas, je demande à utilisateur du script de fournir ces variables).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for l in ${lettres[@]:${Lettres[$begin]}:${Lettres[$end]}-${Lettres[$begin]}+1}; do echo $l; done
    On parcourt le tableau entre les deux bornes en incrémentant la valeur de s$begin à chaque boucle.

    Est-ce bien ça ?

    Coopérativement,
    Patrick

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 076
    Points : 4 392
    Points
    4 392
    Par défaut
    bonjour
    Citation Envoyé par patlabar Voir le message
    On parcourt le tableau entre les deux bornes en incrémentant la valeur de $begin à chaque boucle.
    Est-ce bien ça ?
    Non, la boucle "for" ne fait que parcourir un slice

    lettres est un tableau mais Lettres est un tableau associatif !
    Lettres est un tableau qui prend en index un caractère et a pour valeur l'index de ce caractère dans l'autre tableau lettres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "${Lettres['A']}" # donne 26
    Grâce à ce tableau associatif, il est donc simple de calculer les positions des caractères désirées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin=A; end=E
     
    beginindex=${Lettres[$begin]}    # 26
    endindex=${Lettres[$end]}    # 30
    long=$((endindex-beginindex+1))    # 5
    Maintenant que nous avons les bornes, il est facile de faire un slice sur le tableau lettres : ${tableau[@]:index:longeur}donc ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "${lettres[*]:beginindex:long}"
    #echo "${lettres[*]:26:5}"
    $moi= ( !== ) ? : ;

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Merci pour ces éclaircissements supplémentaires. J'ai de la matière pour travailler.

    Patrick

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

Discussions similaires

  1. [2008] Création d'une table permanente à partir de deux tables temporaires
    Par facteur dans le forum Développement
    Réponses: 11
    Dernier message: 29/07/2021, 16h54
  2. [SHELL] Une boucle FOR à partir d'un fichier
    Par Jon Shannow dans le forum Shell et commandes GNU
    Réponses: 22
    Dernier message: 27/10/2011, 17h14
  3. javascript : création d'une boucle "for"
    Par Ekinea dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/08/2009, 14h20
  4. Boucle for à partir de deux variables de deux listes
    Par bourgui78 dans le forum Général Python
    Réponses: 2
    Dernier message: 08/08/2008, 17h24
  5. création d'une boucle for pour interrogation requête sql
    Par philder62 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/12/2007, 16h14

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