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 :

Lister un tableau avec le N° de l'enregistrement


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
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut Lister un tableau avec le N° de l'enregistrement
    Bonsoir à tous et à toutes,

    Je voudrai faire un tableau contenant les scripts présents dans un dossier. Je voudrai ensuite afficher ce tableau, ligne par ligne, en indiquant le N° de chaque enregistrement du tableau.

    Pour ça, j'ai fait le bout de script suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    filelist=$(ls -dlRh --time-style long-iso $chemin/programmes/*.sh |  awk '{print $8}')
     
    for i in "${!filelist[@]}"
    do
        compteur=$((i + 1))
        echo "$((i + 1))"
        echo "${filelist[$i]}"
        # echo "$i - ${filelist[$i]}"
    done
    Le souci c'est qu'en sorti j'ai ça et je ne vois vraiment pas pourquoi :
    1
    /home/abach/scripts/lanceur/programmes/cameras.sh
    /home/abach/scripts/lanceur/programmes/create_scripts.sh
    /home/abach/scripts/lanceur/programmes/move_cameras.sh
    /home/abach/scripts/lanceur/programmes/piwigallerie.sh
    /home/abach/scripts/lanceur/programmes/renomme_log_lanceur.sh
    /home/abach/scripts/lanceur/programmes/sauve-scripts.sh
    /home/abach/scripts/lanceur/programmes/sdoogee.sh
    Si quelqu'un a une idée, je l'en remercie par avance.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    J'ai pas tout regardé, mais pour utiliser un tableau, il faut créer un tableau...
    Donc la 1ere ligne est fausse, à corriger comme ceci (en rouge):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filelist=($(ls -dlRh --time-style long-iso $chemin/programmes/*.sh |  awk '{print $8}'))
    Sinon, toute ta ligne avec ls...| awk... doit pouvoir être remplacer par une simple commande stat avec les bon paramètres d'affichage...
    Et à faire avant que N_BaH te tombe dessus

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut
    P..ain j'ai cherché des heures

    Avant que N_BaH ne me tombe dessus, je vais me pencher sur la commande stat. Je savais même pas qu'elle existe...

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut
    Géniale la commande stat...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cd $chemin/programmes
    filelist=($(stat --format %n *.sh))
    cd $chemin
    Plus court et bien plus propre...
    J'ai simplement pas trouvé comment ne prendre QUE prendre le nom du fichier sans faire le cd avant et après mais ça c'est vraiment pas grave.
    De plus, cette commande m'intéresserait aussi dans d'autres contextes mais elle n'est récursive.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bah, ton ls aussi affichait la forme complète...
    Sinon, personnellement, j'aurais fait le cd directement dans le sous-shell, comme ça, pas besoin de refaire un cd ensuite, sauf si on ne veut pas revenir au même endroit...
    Et donc tes 3 lignes deviennent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filelist=($(cd $chemin/programmes ; stat --format %n *.sh))
    Car le shell parent lui ne changera pas de répertoire.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    on va faire comme si j'avais rien vu.

    mais pourquoi
    afficher [l]e tableau [...] en indiquant le N° de chaque enregistrement du tableau
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    on va faire comme si j'avais rien vu.

    mais pourquoi
    L'idée du bazar c'est de faire un lanceur "universel" qui gère et uniformise les différentes logs ainsi que la gestion des PID pour éviter que le même programme enfant soit lancé plusieurs fois en même temps.

    J'ai donc mis "lanceur.sh" dans un répertoire "$HOME/scripts" et les programmes "enfants" dans "$HOME/scripts/programmes"

    Si j'exécute le lanceur en indiquant le programme (et qu'il existe), pas de pb, il est lancé.
    S'il n'existe pas, j'indique simplement que ce programme n'existe pas
    Si j'exécute le lanceur sans lui passer le nom du programme je voudrai afficher la liste des programmes (idéalement sans l'extension ".sh") avec en tête un numéro incrémental.
    Un simple read me permet de choisir le programme à exécuter avec bien sur le test de validité de la valeur saisir (supérieure à 0 et inférieure au nombre de programmes présents dans "$HOME/scripts/programmes"

    Actuellement mon code ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    filelist=($(cd $chemin/programmes ; stat --format %n *.sh))
     
    echo "
    Liste des programmes disponibles :
    ================================"
    for i in "${!filelist[@]}"
    do
        echo -n "$((i + 1)) : "
        echo "${filelist[$i]}"
        # echo "$i - ${filelist[$i]}"
    done
    echo "================================"
    echo -n "Indiquez le numéro du programme à lancer : "
    read numero
    if [[ $((numero -1)) -ge ${#filelist[@]} ]] || [[ $((numero -1)) -lt 0 ]]
    then
        echo "================================
    La valeur saisie doit être comprise entre 0 et ${#filelist[@]}
    ================================"
    else
        programme="$chemin/programmes/${filelist[$((numero -1))]}"
        echo "
    $programme
    "
    fi
    Je me doute que ça doit faire hurler les connaisseurs mais je fais avec mes connaissances actuels et ce "projet" est aussi un moyen d'apprendre pour moi, d'où mes questions parfois saugrenues à vos yeux

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Citation Envoyé par Aenean Voir le message
    je voudrai afficher la liste des programmes (idéalement sans l'extension ".sh")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "${filelist[$i]%.sh}"
    Et comme ce qui t'interresse est juste le nom des fichiers, stat n'est pas vraiment utile, un echo peut le remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filelist=($(cd $chemin/programmes ; echo *.sh))
    Un autre détail, tu dis qu'il faut saisir un nombre entre 0 et le nombre d'élément dans ton tableau mais en fait cela commence à 1 dans ton script...

  9. #9
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut
    disedorgue

    Faut vraiment encore que j'apprenne un tas de trucs... mais heureusement

    Pour ce qui est de ma liste, effectivement, "i" commence à zéro. Mais dans ma liste, j'affiche "$((i + 1))". Donc elle commence bien à 1. Ensuite, je récupère la valeur de mon read à laquelle je soustrais 1 pour revenir à la valeur de mon "i"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read numero
    if [[ $((numero -1)) -ge ${#filelist[@]} ]] || [[ $((numero -1)) -lt 0 ]]
    En fait, rien que sur ce petit truc, j'ai appris un tas de choses qui à vous semblent évidentes :
    • la commande stat
    • l'imbrication du ls avec le stat ou l'echo dans la variable
    • la parenthèse avant le "$" pour créer le tableau

    Certains trucs sont très proches des langages que j'ai appris en informatique industriels, d'autres pas du tout. C'est là l'un des intérêts que je vois à ce genre de trucs pour moi.

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. [Tableaux] Lister le tableau avec UNION => Problème
    Par tutomania dans le forum Langage
    Réponses: 4
    Dernier message: 25/09/2006, 19h20
  3. balise <img> dans un tableau avec firefox
    Par yannock dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 25/10/2004, 16h44
  4. pb de coord de tex dans tableau avec multitex
    Par sebh dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/01/2004, 21h36
  5. Réponses: 13
    Dernier message: 14/10/2003, 14h31

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