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

Linux Discussion :

Traiter un fichier en ignorant les répétitions


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Traiter un fichier en ignorant les répétitions
    Bonsoir,

    Je cherche à traiter des chaines de caractères situé dans un fichier mais ne sachant pas où trouver mes premières commande après plusieurs essais raté je suis bloqué. Je recherche plus des commandes où creuser mes recherches que des solutions toutes pondue mais je suis pas contre ;-)

    Dans un fichier j'ai une liste comme ceci (liste de paquet, dépôt et leur clé)

    paquet1, deb http://blabla.com jaunty main, 098UY935
    paquet2, deb http://blabla.com jaunty main, 098UY935
    paquet3, deb http://blublu.com jaunty main, 12RT56U8
    paquet3, deb http://blublu.com jaunty main, 12RT56U8
    paquet4, deb http://bloblo.com jaunty main, 23GJGH45

    J'ai essayer avec la fonction gawk mais je suis un peut perdu. A part afficher les résultats je n'arrive pas à les utiliser pour les placer dans des fichiers ou des commandes

    gawk -F", *" '{print $2}' a-tester affiche deb http://blabla.com jaunty main
    gawk -F", *" '{print $3}' a-tester affiche 098UY935

    La suite où je bloque le plus est comment ignorer les informations qui ce répète (adresse de dépôt et/ou clé de dépôt) afin d'éviter des traitement inutile, actuellement j'approche les 900 paquets à traiter (dépôt local). Je pensait aux tableaux mais je ne suis pas sur que ce soit une bonne idée.

    Voilou, je suis plus bloqué par manque de connaissance des commandes disponible qu'autre chose et ça sape la motivation quand on ce retrouve à fouiller dans toutes les directions à la fois et à l'aveuglette.

    Merci par avance pour vos conseils

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Bonjour percherie,

    Je ne suis pas sûr de bien comprendre.
    Tu veux faire afficher les champs 2 et 3 dans des fichiers différents ? comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    awk -F', ' '{print $2 > "fichier01.out"; print $3 > "fichier02.out"}' a-tester
    cat fichier01.out
    deb http://blabla.com jaunty main
    deb http://blabla.com jaunty main
    deb http://blublu.com jaunty main
    deb http://blublu.com jaunty main
    deb http://bloblo.com jaunty main
    cat fichier02.out
    098UY935
    098UY935
    12RT56U8
    12RT56U8
    23GJGH45
    mais cette ligne ne va pas supprimer les doublons
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par percherie Voir le message
    Bonsoir,

    Je cherche à traiter des chaines de caractères situé dans un fichier mais ne sachant pas où trouver mes premières commande après plusieurs essais raté je suis bloqué. Je recherche plus des commandes où creuser mes recherches que des solutions toutes pondue mais je suis pas contre ;-)

    Dans un fichier j'ai une liste comme ceci (liste de paquet, dépôt et leur clé)

    paquet1, deb http://blabla.com jaunty main, 098UY935
    paquet2, deb http://blabla.com jaunty main, 098UY935
    paquet3, deb http://blublu.com jaunty main, 12RT56U8
    paquet3, deb http://blublu.com jaunty main, 12RT56U8
    paquet4, deb http://bloblo.com jaunty main, 23GJGH45

    J'ai essayer avec la fonction gawk mais je suis un peut perdu. A part afficher les résultats je n'arrive pas à les utiliser pour les placer dans des fichiers ou des commandes

    gawk -F", *" '{print $2}' a-tester affiche deb http://blabla.com jaunty main
    gawk -F", *" '{print $3}' a-tester affiche 098UY935

    La suite où je bloque le plus est comment ignorer les informations qui ce répète (adresse de dépôt et/ou clé de dépôt) afin d'éviter des traitement inutile, actuellement j'approche les 900 paquets à traiter (dépôt local). Je pensait aux tableaux mais je ne suis pas sur que ce soit une bonne idée.

    Voilou, je suis plus bloqué par manque de connaissance des commandes disponible qu'autre chose et ça sape la motivation quand on ce retrouve à fouiller dans toutes les directions à la fois et à l'aveuglette.

    Merci par avance pour vos conseils
    Ta question est un peu obscure alors je vais être très général

    Si tu as un seule ligne d'info à traiter (style date, pwd, id), tu peux stocker simplement cette ligne via les backquottes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    info=`date`
    info=`id`
    info=`pwd`
    Si tu as maintenant un flot d'informations à traiter (un listing de fichiers venus d'un ls, le contenu d'un fichier venu d'un cat, le résultat d'un ping ou d'un traceroute) et que tu dois traiter ces informations ligne par ligne, il te faut un outil de découpage de blocs en ligne.

    Cet outil est donné par read. Et comme t'as plusieurs lignes à traiter, il te faut une boucle de traitement. Il suffit donc de piper le flot d'informations dans une boucle de read
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ls -l |while read ligne
    do
        echo "contenu: $ligne"
    done
    Le ls -l (ou toute autre commande quelconque que t'as envie de traiter) enverra toutes ses lignes au pipe qui le retransmettra au read qui stockera la ligne lue dans la variable "ligne". Tant que le read lit une ligne, il renvoie "vrai" et la boucle se fait, une fois qu'il n'y a plus rien à lire, il renvoie "faux" et la boucle se termine.
    Te voilà donc maintenant avec une boucle de traitement. Et dans cette boucle, tu possèdes une ligne d'information à traiter. Te faut donc un outil de découpage de l'info. L'outil le plus basique est cut. Cet outil te permet d'extraire des champs (à toi de définir quel caractère délimite un champ) ou même des caractères.
    Exemple permettant d'afficher le home de tous les utilisateurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cat /etc/passwd |while read ligne
    do
        user=`echo $ligne |cut -f1 -d:`
        home=`echo $ligne |cut -f6 -d:`
        echo "Le home de $user est $home"
    done
    A partir de là, t'as en main les outils de base te permettant de manipuler un flot d'informations, quel que soit l'origine du flot. Le reste n'est qu'une question d'algo

    Commandes à assimiler
    - grep => affiche toutes les lignes contenant une chaine demandée
    - cut => coupe des datas en colonnes
    - awk/gawk => permet de programmer un algorithme complexe sur des lignes de datas
    - sed => permet de transformer des datas à la volée
    - tr => autre outil analogue à sed mais avec d'autres possibilités
    - sort => trie un flot de datas
    95% des scripts de traitement d'info n'utilisent que ces quelques commandes
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Mars 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2007
    Messages : 199
    Points : 291
    Points
    291
    Par défaut
    Pour faire chauffer le "man" , je propose les commandes suivantes (en vrac) :

    bash, cat, sed, date, mkdir, echo, read, export, cd, rm, true, false, ls, chgrp, chown
    kill, ln, mount, pwd, sleep, touch, tempfile, uname, ping, df, du, diff, seq, od, tar, cpio
    dd, fdisk, mkfs, grep / egrep, basename, dirname, ps, wc, cut, awk/gawk, tr, sort, uniq
    let / expr / bc, cp, mv, tail, head, find, more / less, who

    test / [ ], if else fi, while do done, until do done, case $var in esac
    for var in liste do done, break, continue, exit, function

    Attention : Pour certaines commandes, l'explication se trouvera au sein du "man bash".

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Merci pour les explications je vais pouvoir progresser dans mes compréhension et d'ailleurs je me rend compte que la solution que j'ai trouvé hier est complexe du à l'utilisation de awk alors que cut semble faire ce que je recherche. Je vais refaire un essais.

    D'ailleurs j'aurai une question de syntaxe, avec l'insertion de donnée j'ai un problème de syntaxe mais avec l'utilisation de pipe cela fonctionne mais j'ai également appris que les variables situé dedans sont perdu une fois le pipe terminé. Voici ce que ça donne.

    Code fonctionnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # Ajout des dépots avec controle de présence
    awk -F", *" '{print $2}' proglist | sort -u | #on injecte le tri unique sur l'entrée standard de "while read..."
    while read line #on lit ligne à ligne l'entrée standard et on affecte la ligne à la variable "line"
    do
        if ! grep -q "$line" /etc/apt/sources.list; then # on vérifie si la ligne est présente dans le fichier cible
        echo $line | sudo tee -a /etc/apt/sources.list # on l'ajoute au fichier cible
        fi
    done
    Code avec erreur : Syntax error: redirection unexpected
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Ajout des dépots avec controle de présence
    while read line #on lit ligne à ligne l'entrée standard et on affecte la ligne à la variable "line"
    do
        if ! grep -q "$line" /etc/apt/sources.list; then # on vérifie si la ligne est présente dans le fichier cible
        echo $line | sudo tee -a /etc/apt/sources.list # on l'ajoute au fichier cible
        fi
    done < <( awk -F", *" '{print $2}' proglist | sort -u ) #on injecte le tri unique sur l'entrée standard de "while read...
    J'aimerai comprendre ce qui cloche, en attendant je vais reprendre tout ça avec la commande cut qui m'a l'air plus simple et peut être moins gourmand en ressource (j'en sais rien du tout en fait).

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    En traitant le fichier proglist contenant les lignes suivante (il y a des espaces différent après les virgules selon les lignes)
    paquet1, deb http://blabla.com jaunty main , A98UY935
    paquet2, deb http://blibli.com jaunty main, I2345678
    paquet3, deb http://blibli.com jaunty main, I2345678
    paquet4, deb http://blibli.com jaunty main, I2345678
    paquet5, deb http://blabla.com jaunty main, A98UY935
    paquet6, deb http://blabla.com jaunty main, A98UY935
    paquet7, deb http://blublu.com jaunty main, UDH4FK8Z
    paquet8, deb http://blabla.com jaunty main, A98UY935
    Je suis passé de :
    awk -F", *" '{print $2}' proglist | sort -u

    à :
    cut -f2 -d, proglist | sed -e "s/^[ ]*//" | sed -e "s/[ ]*$//" | sort -u

    Quel est la commande la plus intéressante à votre avis? Sinon je n'arrive toujours pas à insérer la nouvelle commande dans la boucle while sans passer par un pipe "|" (voir réponse précédente)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    On peut faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while IFS=',' read prems deuz troiz
     do
       echo $deuz
    done < proglist | sort -u |\
       grep -vf /etc/apt/sources.list >> /etc/apt/sources.list
    ...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par percherie Voir le message
    mais j'ai également appris que les variables situé dedans sont perdu une fois le pipe terminé.
    Effectivement, ca peut être un gros soucis

    Il y a toutefois une méthodes pour pallier le pb en n'utilisant pas de pipe dans le traitement de fichier (c.a.d. remplacer le cat fic |while read lig)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/sh
    exec 3<fichier_a_traiter       # Création d'un canal input contenant le fichier
     
    # Lecture du canal 3 (donc le fichier)
    while read lig 0<&3
    do
        echo "ligne: $lig"
    done
    S'il faut traiter un flot issu d'une commande, rien n'interdit alors de rediriger la commande vers un fichier temporaire pour ensuite le traiter de cette façon
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Mars 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2007
    Messages : 199
    Points : 291
    Points
    291
    Par défaut
    Envoyé par percherie
    mais j'ai également appris que les variables situé dedans sont perdu une fois le pipe terminé.
    J'ai posté une explication concernant les pertes de variables en cas de "fork", tu peux lire mon intervention (ericduval) dans la discution suivante : http://www.developpez.net/forums/d31...chier-colonne/

    Nota : vous remarquerez la césure de l'URL

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ericduval Voir le message
    J'ai posté une explication concernant les pertes de variables en cas de "fork", tu peux lire mon intervention (ericduval) dans la discution suivante : http://www.developpez.net/forums/d31...chier-colonne/
    J'ai lu ton post. Tu utilises la méthode de base de la redirection en entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read lig
    do
        ...
    done < fichier
    Le gros problème de cette syntaxe, c'est que toute commande de saisie, quelle qu'elle soit, située dans le do...done prendra sa saisie dans le fichier. Ce n'est pas forcément une bonne chose. Imagine qu'à un moment donné, tu aies envie de poser une question à l'utilisateur...

    Avec ma méthode, on crée un nouveau canal input qu'on peut ensuite utiliser comme n'importe quel canal. Mais on conserve quand-même le stdin clavier si on désire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exec 3<fichier
    while read lig 0<&3     # La ligne sera chargée à partir du canal 3
    do
        ...
        echo "Voulez-vous interrompre le script ?"
        read rep       # Cette réponse sera prise dans le clavier
        test $rep = "oui" && break
    done
    Et permet aussi un traitement en parallèle de plusieurs fichiers (style appareillage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    exec 3<fichier1
    exec 4<fichier2
    exec 5<fichier3
    while true
    do
        read info1 0<&3
        read info2 0<&4
        read info3 0<&5
     
        ... (traitement de $info1, $info2, $info3 avec éventuellement sortie de boucle si nécessaire)...
    done
    Ca permet même la lecture écriture du même fichier sans passer par un fichier temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    exec 3<fichier
    rm -f fichier     # Le fichier est effacé mais il a été mis en mémoire
    while read lig 0<&3
    do
        ...traitement...
    done > fichier
    Et quand j'ai fait mes tests, j'y suis allé comme un furieux jusqu'à tester sur des fichiers de 1Go, ça marche toujours...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Au final je me suis orienté sur la solution de N_bash avec l'utilisation de while et IFS qui fait la même chose que awk (pour mon objectif). Bon j'ai essayé de crée une fonction mais par manque de connaissance elle est assez lourde (utilisation de if), peut être qu'il y a plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    depadd() {
    while IFS=',' read paquet depot cle
     do
    # en fonction de l'argument, on récupère un partie différente du fichier
    if [ $1 = 'depot' ]; then 
    	echo $depot
    elif [ $1 = 'cle' ]; then 
    	echo $cle
    fi
    # on trit le fichier en unique
    done < $2 | sort -u
    }
    Sinon merci Sve@r pour exec je cherchai quelque chose comme ça au début de la mise en place du script. J'ai juste pas encore compris en détail la syntaxe qui permet d'exploiter le canal crée (j'ai pas cherché de doc). Si j'ai bien compris, pour appelé le canal nommé 3 il suffit de faire 0<&3
    Est ce qu'on peut donner des nom à un canal ou juste un chiffre ou nombre?

  12. #12
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Mars 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2007
    Messages : 199
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    J'ai lu ton post. Tu utilises la méthode de base de la redirection en entrée
    C'était un exemple simple juste pour expliquer fork / pas fork.

    Bravo pour ton explication et les exemples sur l'usage d'un "canal input".

    Percherie écrit : Est ce qu'on peut donner des nom à un canal ou juste un chiffre ou nombre?
    Juste des chiffres compris entre 3 et 9. (0, 1 et 2 étant réservé par respectivement stdin, stdout et stderr)

    Tu peux lire (en anglais) un article concernant l'usage de redirection entrée/sortie sur
    http://www.faqs.org/docs/abs/HTML/io-redirection.html

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Citation Envoyé par percherie
    Bon j'ai essayé de crée une fonction mais par manque de connaissance elle est assez lourde (utilisation de if), peut être qu'il y a plus simple.
    Avec quels paramètres utilises-tu ta fonction ?

    le deuxième je me doute que c'est ton fichier proglist, mais le premier...??
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Le premier paramètre est le numéro de colonne ou son nom (je sais pas encore ce qui est le mieux à prendre). Pour l'instant j'ai depot pour l'adresse des dépôts, et cle pour les clés à télécharger. peut être que le mieux est d'utiliser des valeurs numérique pour identifier les colonnes ce qui donnerai 2 et 3 mais là ça peut poser problème avec l'utilise de awk si il est utilisé.

    Le deuxième paramètre est le nom du fichier à traiter.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Ah, oui ! d'accord...

    Tu devrais sortir ta condition de la boucle : elle n'a pas à être exécutée pour chaque ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    depadd() {
    if [ $1 = depot ]; then
       select=depot
    elif [ $1 = cle ]; then
       select=cle
    else 
       echo "Usage : ..."
    fi
    while IFS=',' read paquet depot cle
     do
       echo ${!select} # cf. indirection, ou développement indirect
    done < $2 | sort -u
    }
    mais si tu ne tiens pas particulièrement à faire un test, parce que la façon d'appeler la fonction est définie une fois pour toute dans le script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    depadd() {
    while IFS=',' read paquet depot cle
     do
       echo ${!1}
    done < $2 | sort -u
    }
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Merci mais étrangement j'ai un message d'erreur même en suivant d'autre exemple comme celui ci : http://abs.traduc.org/abs-5.3-fr/ch34.html#ex78

    Voici l'erreur en question : Bad substitution

    Mon fichier à l'entête suivante : #!/bin/bash

    La méthode dite de l'indirection est ce que je recherche mais je n'arrive pas à comprendre pourquoi ça bloque, peut être la configuration de mon poste mais je n'ai rien changer de particulier à part les mises à jours.

    Si tu a une idée sur la question ça me dépannerai bien.

    ps : je suis sur ubuntu jaunty 9.04, je remonte également le problème sur leur forum

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    Que répond ?
    voire même?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ericduval Voir le message
    Juste des chiffres compris entre 3 et 9. (0, 1 et 2 étant réservé par respectivement stdin, stdout et stderr)
    Entre 3 et 64 (le nombre maximal de descripteurs pouvant être ouverts en même temps par un processus)

    Et je crois que ce nombre est passé à 128 sur les derniers linux
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Membre à l'essai
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    128, ça en fait un paquet quand même ;-)

    Sinon le code echo "$0 -- $SHELL" me retourne test.sh -- /bin/bash

    Et aptitude show bash me retourne
    Paquet*: bash
    Essentiel*: oui
    État: installé
    Automatiquement installé: non
    Version*: 3.2-5ubuntu1
    Priorité*: nécessaire
    Section*: shells
    Responsable*: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com>
    Taille décompressée*: 1266k
    Dépend: base-files (>= 2.1.12), debianutils (>= 2.15)
    Pré-dépend: libc6 (>= 2.8), libncurses5 (>= 5.6+20071006-3)
    Recommande: bash-completion (>= 20060301-0)
    Suggère: bash-doc
    Est en conflit: bash-completion (< 20060301-0)
    Remplace: bash-completion (< 20060301-0), bash-doc (<= 2.05-1)
    Description*: The GNU Bourne Again SHell
    Bash is an sh-compatible command language interpreter that executes commands
    read from the standard input or from a file. Bash also incorporates useful
    features from the Korn and C shells (ksh and csh).

    Bash is ultimately intended to be a conformant implementation of the IEEE POSIX
    Shell and Tools specification (IEEE Working Group 1003.2).

    The Programmable Completion Code, by Ian Macdonald, is now found in the
    bash-completion package.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    donc, tu es bien en bash...
    ton shebang est bien formé...
    ??

    tu peux nous coller ton script actuel (celui avec les indirections) ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/03/2011, 17h17
  2. Réponses: 5
    Dernier message: 19/06/2008, 23h03
  3. awk - ignorer les commentaires d'un fichier
    Par wildmary dans le forum Linux
    Réponses: 5
    Dernier message: 30/10/2007, 15h31
  4. Réponses: 1
    Dernier message: 06/08/2007, 10h39
  5. Réponses: 6
    Dernier message: 05/08/2007, 07h15

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