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 :

Les tableaux et boucle while


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Décembre 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2011
    Messages : 61
    Par défaut Les tableaux et boucle while
    Bonjour,
    je lisais un tutoriel d'un modérateur ( http://ineumann.developpez.com/tutoriels/linux/bash-bonnes-pratiques/ )qui répondait en partie à l'une de mes questions mais qui m'en pose une autre. Pour éviter que la boucle while ne soit exécuter dans un sous shell et récupérer mes noms de fichiers dans un tableau je faisais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #!/bin/bash  
     DIR="/home/idriss/test" 
    declare -a fichiers
     tmp=$(ls $DIR) 
    while read do 
        fichiers[${#fichiers[*]}]=$REPLY
     done < tmp 
    echo ${fichers[*]}
    Au ch.II (quelques erreurs courantes) on peut lire
    Il est également possible d'affecter la sortie d'un sous-shell à une variable de la même façon que pour la sous-exécution d'une commande :
    ma question est: Es ce que cette variable peut être une case de tableau ? si oui comment je procéderais?
    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    on n'utilise pas ls dans un script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    dir=/home/idriss/repertoire
     
    shopt -s nullglob              # au cas où le répertoire est vide
    tableau=( $dir/* )             # alors le tableau sera vide, sinon il contiendrait littéralement : /home/idriss/repertoire/*
    printf '%s\n' "${tableau[@]}"  # @ plutôt que *, car @ reflète bien les éléments du tableau et non les mots séparés par l'IFS
    note que la déclaration d'un tableau indexé est facultative.

    s'il est question d'alimenter un tableau avec la sortie d'une commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    while read line; do tableau+=( "$line" ); done < <(commande)
    cf. Substitution de processus in man bash
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Décembre 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2011
    Messages : 61
    Par défaut
    Ok, merci j'avais mal lu en fait la boucle c'est while read;do cmd1; done < +redirection de flux.....
    je croyais que < c'était déjà une redirection de flux!!! en fait y'en faut 2 !!

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Citation Envoyé par N_BaH Voir le message
    on n'utilise pas ls dans un script
    Il a pas bien lu

    @Spirale21 : Tu as aussi la possibilité de faire ceci comme redirection de flux sur une sortie de commande en Bash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read l; do echo $l; done <<< "$(ls)"
    Je n'ai pas mentionné cette syntaxe dans les cours auxquels j'ai participé mais je pense le faire dans celui-ci : http://frederic-lang.developpez.com/...ux/prog-shell/ et également dans le cours que tu mentionne car elle évite en effet l'histoire du sous-shell.

    Sinon pour le cas du pipe, il suffit d'afficher tes noms de fichiers sur la sortie standard et les récupérer dans une sous-exécution (voir exemples dans le cours).

    Toutefois il reste préférable de se passer complètement de ls comme expliqué dans tutos que tu cite (cf : la partie II-B).

    Cordialement,
    Idriss

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Citation Envoyé par ok.Idriss
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read l; do echo $l; done <<< "$(ls)"
    Je n'ai pas mentionné cette syntaxe dans les cours auxquels j'ai participé mais je pense le faire [...]
    à ta place, je ne le ferais pas. pas comme ça.
    mais plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -r line; do echo "$line"; done <<< "$variable_sur_plusieurs_lignes"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read -r line; do echo "$line"; done <<<"texte
    sur plusieurs
    lignes"
    pour la redirection du flux de commandes, je préfère vraiment la Substitution de processus.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Par simple curiosité ( ) : pourquoi est-il préférable de stocker le résultat de la commande sur plusieurs lignes dans une variable ?



    Idriss

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Citation Envoyé par ok.Idriss
    pourquoi est-il préférable de stocker le résultat de la commande sur plusieurs lignes dans une variable ?
    ce n'est pas ce que je dis.
    pour éviter qu'un débutant ne prenne l'habitude d'utiliser un here-string avec une substitution de commande, je préconise l'emploi d'une variable en guise de démonstration de l'utilisation de <<<.
    quant à rediriger la sortie d'une commande, je recommande l'emploi de la Substitution de processus.

    la chaîne en ligne (here-string), pour les textes
    la substitution de processus, pour les commandes !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. [Tableaux] Boucle while + passer un tour
    Par Girzi dans le forum Langage
    Réponses: 12
    Dernier message: 28/06/2006, 10h41
  2. [Tableaux] boucle while qui ne boucle pas comme je veux
    Par oceane751 dans le forum Langage
    Réponses: 5
    Dernier message: 05/06/2006, 00h42
  3. [Tableaux] Ma boucle While ne va pas !!!
    Par tigzirt dans le forum Langage
    Réponses: 7
    Dernier message: 05/05/2006, 11h47
  4. [Tableaux] boucle while
    Par dafalri dans le forum Langage
    Réponses: 8
    Dernier message: 24/02/2006, 10h52
  5. [Tableaux] Boucle while imbriquer
    Par Le-Cortex dans le forum Langage
    Réponses: 11
    Dernier message: 09/09/2005, 14h22

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