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 :

Utilisation des tableaux en programmation shell


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 15
    Par défaut Utilisation des tableaux en programmation shell
    Bonjour ! Je suis bloqué sur un message d'erreur sur les tableaux en shell .

    mon script est censé sélectionner tous les fichiers du répertoire courant, les mettre dans un tableau (boucle for) et afficher le résultat(boucle while)

    voici mon code

    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
    #! /bin/bash
     i=0
    a=0
    repertoirecourant=`PWD`
     
    cd $repertoirecourant
     
    for fichier in *
    do
    tab[$i]=$fichier
    i=$((i+1))
    done
    while a -le  ${#tab[*]}
    do
    echo "${tab[$a]"
    a=$((a+1))
    done
    quand j’exécute, j'obtiens cet erreur
    tab[0]=fichier1: not found
    tab[1]=fichier2: not found
    tab[2]=fichier3: not found
    si mon répertoire courant contient trois fichier nommés fichier1, fichier2 et fichier3


    merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    repertoirecourant=`PWD`
    cd $repertoirecourant
    Tu as prévu ça pour le faire dans le répertoire de ton choix? Sinon ça n'a aucun intérêt:
    - récupérer le répertoire où l'on se trouve
    - se déplacer où l'on se trouve déjà

    Pourquoi ne pas faire ceci au final?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for fichier in *
    do
    echo $fichier
    done
    Mais ça posera problème s'il y a des espaces dans les noms ...

    En tout cas ton code (une fois les erreurs corrigées fonctionne chez moi ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for fichier in *
    do
    tab[$i]=$fichier
    i=$((i+1))
    done
     
    while [ $a -le ${#tab[*]} ]
    do
    echo "${tab[$a]}"
    a=$((a+1))
    done

  3. #3
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Plus simple et en raccourci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    liste=( * ) 
    i=1 
    while [ $i -lt ${#liste[@]} ]
      do  
          echo "nombre  $i :" ${liste[$i]}  
          let i=i+1 
       done

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Bonjour,

    Pour parcourir le tableau, j'aurai plus tendance à utiliser une boucle for qu'une boucle while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste=( * )
    for i in $(seq 0 $((${#liste[@]}-1)))
    do 
     echo "nombre  $i :" ${liste[$i]}
    done
    PS: becket ne l'a pas précisé, mais cette façon d'initialiser le tableau résout le problème des espaces dans les noms de fichier.

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

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

    attention, si le répertoire est vide, le tableau contiendra littéralement * !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    shopt -s nullglob
     
    liste=( * )
    for i in "${liste[@]}"; do echo "$i"; done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 15
    Par défaut
    merci pour tous vos reponse pertinente. mon code marche bien quand j'execute de cette maniere(./nomProgramme) mais ne marche plus quand j'execute plutot de cette maniere(sh nomProgramme). ce que je n'arrive pas a comprendre.Merci pour vos explications.

    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
    #!/bin/bash
    declare -a tab
    i=0;
    if test $# -eq 0
    then
    repertoire=`pwd`;
    else
    repertoire=$1;
    fi
    cd $repertoire;
    for rep in *
    do
    tab[$i]=$rep
     i=$((i+1))
    done
    # affichage dans l'ordre inverse
    while test $i -ge 0
    do
    echo "${tab[$i]}";
    i=$((i-1));
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    /bin/sh n'est alors pas un lien vers bash, mais vers un shell "strictement" POSIX, qui ne gère pas les tableaux.
    ce n'est de toutes façons pas la meilleure façon de faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
     
    shopt -s nullglob
    liste=( * )
    for ((i=${#liste[@]}-1; i>=0; i--)); do echo "${liste[i]}"; done
    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. Réponses: 1
    Dernier message: 12/12/2007, 13h46
  2. Utilisation des fichiers en programmation
    Par fred61 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/11/2007, 22h38
  3. Réponses: 2
    Dernier message: 18/10/2006, 11h36
  4. Réponses: 2
    Dernier message: 09/06/2006, 13h33
  5. Réponses: 4
    Dernier message: 10/05/2006, 10h36

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