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

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

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    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 éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 302
    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 302
    Points : 12 800
    Points
    12 800
    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 du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    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
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 586
    Points : 19 468
    Points
    19 468
    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

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

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    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.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 302
    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 302
    Points : 12 800
    Points
    12 800
    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.

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

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    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 éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 302
    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 302
    Points : 12 800
    Points
    12 800
    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 du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    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.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 302
    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 302
    Points : 12 800
    Points
    12 800
    Par défaut
    Donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "================================
    La valeur saisie doit être comprise entre 0 et ${#filelist[@]}
    ================================"
    n'est pas cohérent, puisque tu proposes une liste à partir de 1.

    Et juste une remarque sur ton script, il est plus propre que tu ne sembles le croire, dis toi qu'à part la commande stat et ls, tout le reste est de la built-in, pas de commandes extérieures au shell utilisé.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Pour info, y a un truc qui permet de faire des menus en bash:
    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
    #!/bin/bash
    # Bash Menu Script Example
     
    PS3='Please enter your choice: '
    options=("Option 1" "Option 2" "Option 3" "Quit")
    select opt in "${options[@]}"
    do
        case $opt in
            "Option 1")
                echo "you chose choice 1"
                ;;
            "Option 2")
                echo "you chose choice 2"
                ;;
            "Option 3")
                echo "you chose choice 3"
                ;;
            "Quit")
                break
                ;;
            *) echo invalid option;;
        esac
    done
    J'imagine que ça peut t'aider...

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

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    Par défaut
    ha m..de,

    j'avais pas vu ce truc de zéro
    J'ai voulu aller plus vite que la musique.

    Merci pour ton commentaire sur mon code

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

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    Par défaut
    Merci jack-ft pour ton idée.

    Elle est effectivement sympa et je la connaissais. Là où le bas blesse dans mon cas de figure, c'est que je ne connais pas le nombre de cas. En effet, si je rajoute un programme lançable, il doit apparaître automatiquement dans la liste.

    Cela dit, je me sers du case, entre autre dans une fonction qui me permet d’émettre un son différent selon le paramètre indiqué. Dans ce cas, comme cette fonction est appelée par les autres programmes, le nombre d'items est fixe. De plus le cas "*)" me sert si je ne saisi pas de paramètre à l'appel de cette fonction.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 586
    Points : 19 468
    Points
    19 468
    Par défaut
    <hors sujet>
    Là où le bas blesse
    le bât !
    </hors sujet>

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

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    Par défaut
    Désolé N_BaH,

    C'est vrai que je suis un âne bâté

    < - hors sujet - >

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Aenean Voir le message
    Merci jack-ft pour ton idée.

    Elle est effectivement sympa et je la connaissais. Là où le bas blesse
    [HS]Pourquoi c'est jamais le haut qui blesse?[/HS]

    dans mon cas de figure, c'est que je ne connais pas le nombre de cas. En effet, si je rajoute un programme lançable, il doit apparaître automatiquement dans la liste.
    Oui, j'ai bien compris. Tu peux néanmoins conserver le "select" et utiliser la variable REPLY en t'inspirant de cet exemple:

    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
    title="Select example"
    prompt="Pick an option:"
    options=("A" "B" "C")
     
    echo "$title"
    PS3="$prompt "
    select opt in "${options[@]}" "Quit"; do 
     
        case "$REPLY" in
     
        1 ) echo "You picked $opt which is option $REPLY";;
        2 ) echo "You picked $opt which is option $REPLY";;
        3 ) echo "You picked $opt which is option $REPLY";;
     
        $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;;
        *) echo "Invalid option. Try another one.";continue;;
     
        esac
     
    done
    Du coup, il faut remplacer le "case $REPLY" par des tests adéquats.

    À ce sujet, que se passe-t-il dans ton code si quelqu'un répond "coucou" plutôt qu'un numéro?

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

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 49
    Points
    49
    Par défaut
    Joli ton HS. Permet moi de pas rajouter ce que je pensai rajouter

    C'est vrai que ton idée est à creuser.

    Que se passe-t-il si quelqu'un répond "coucou" ? Je viens de tester. Que je réponde "8" sur une liste de 7 items ou "coucou", j'ai un exit qui sort du script. Tu pourras me dire que qu'un retour vers le choix du programme serait peut-être judicieux.

    A ça je répond que :
    1. Je sais pas faire
    2. Si réponse hors range, alors sortie au cas où l'appel du script est un loupé. Comme de toutes façons j'appelle ce lanceur via un alias du genre "x", le rappeler n'est pas un souci.

  18. #18
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Pfff! Faut tout lui faire!

    Que penses-tu de ceci:

    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 ; echo *.sh))
     
    echo "
    Liste des programmes disponibles :
    ================================"
     
    PS3='================================
    Indiquez le numéro du programme à lancer : '
     
    select opt in "${filelist[@]}"; do
      if [[ ! "$REPLY" =~ [0-9]+ ]] # est-ce un nombre?
      then echo "================================
    Option invalide. La valeur saisie doit être un nombre compris entre 1 et ${#filelist[@]}
    ================================"; continue
      elif [[ $REPLY -le 0 ]] || [[ $REPLY -gt ${#filelist[@]} ]] 
      then echo "================================
    La valeur saisie doit être comprise entre 1 et ${#filelist[@]}
    ================================"; continue
      else
        programme="$chemin/programmes/${filelist[$((REPLY -1))]}"
        echo "
    $programme
    " ; break
      fi
    done
    (et avec 39,2°C de fiévre!)

+ 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