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 :

Erreur shell : unexpected done


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut Erreur shell : unexpected done
    Bonjour à tous,

    en éxécutant ce script, j'obtiens toujours "unexpected done", malgré que j'ai vérifié la synataxe de la boucle "for", l'erreur persiste.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    #!/bin/bash
     
    for i in `cat newcontext` ;do
    var1=`cut –f1 –d ' ' $i`
    var2=`cut –f2 –d ' ' $i`
     
    if [$var2=false];then
     
    for j in `cat adaptrules`;do
     
    c=`cut -f1 -d ' ' $j`
    cc=`cut -f2 -d ' ' $j`
     
    if [$c=$var1];then
    r=$cc
    endif
     
    done 
     
    sed /$var1/d currentconfig>>newconfig
     
    else
     
    for k in `cat adaptrules`;do
    var3=`cut –f1 –d ' ' $k`
    var4=`cut –f2 –d ' ' $k`
     
    if [$var3=$var1];then
    action=$var4
    endif
     
    done
    cat $action>>newconfig
     
    endif
     
    done
    merci pour votre aide

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    1. man bash
    2. faut des espaces autours des crochets
    3. faut des espaces autour du signe égale
    4. endif n'est pas une instruction bash
    5. for n'est pas l'instruction idéale pour lire un fichier
    6. N_BaH devrait se charger de te remonter les bretelles


    En gros, tu as tout faux, ou presque

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut
    salut Zipe31,

    merci beaucoup pour ton coup de main merci aussi à N_Bah. sinon, on est là pour apprendre, meme s'il s'agit de petites fautes

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par thouraya24
    merci aussi à N_Bah
    attends ! je n'ai encore rien dit.

    comment lire un fichier en shell.

    je ne comprends pas qu'on ponde tout un script sans en avoir tester les commandes auparavant !

    7. cut travaille sur des fichiers, pas sur des chaînes. en tout cas, pas comme ça.
    8. cut, quand on sait lire un fichier correctement, est rarement utile dans un script.
    9. il faut mettre des guillemets autour des variables. toujours, à moins de savoir pourquoi.
    ...

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut
    salut N_BAH,

    merci pour vos remarques, j'ai modifié le code comme suit mais ça marche pas toujours ...

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    #!/bin/bash
     
    for i in `cat newcontext` ;do
     
    var1=$(cut –f1 –d " " <<< "$i")
    var2=$(cut –f2 –d " " <<< "$i")
     
    if [ $var2 = false ];then
     
    for j in `cat adaptrules`;do
     
    c=$(cut -f1 -d" " <<< "$j")
    cc=$(cut -f2 -d" " <<< "$j")
     
    if [ $c = $var1 ];then
    r=$cc
    fi
     
    done 
     
    sed /$var1/d currentconfig>>newconfig
     
    else
     
    for k in `cat adaptrules`;do
    var3=$(cut –f1 –d" " <<< "$k")
    var4=$(cut –f2 –d" " <<< "$k")
     
    if [ $var3 = $var1 ];then
    action=$var4
    fi
     
    done
    cat $action>>newconfig
     
    fi
     
    done

  6. #6
    Invité
    Invité(e)
    Par défaut
    « ça marche pas » n'est pas une description, c'est un constat; ça n'aide pas.

    quelles sont les données de départ ?
    quel est le résultat attendu ?
    quel est le résultat obtenu ?

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut
    d'accord,

    pour les inputs Nom : imprime.png
Affichages : 240
Taille : 16,8 Ko,

    le script génère un nouveau fichier de configuration (newconfig) en utilisant la configuration courante (currentconfig), les données de contexte (newcontext) and les règles d'adaptations (adaptrules).
    le résultat attendu est un fichier de configuration qui ressemble à currentconfig
    et le résultat obtenu : un message d'erreur. lors de l''exécution, le script se bloque en affichant le manual de la commande "cut"

    merci N_BaH

  8. #8
    Invité
    Invité(e)
    Par défaut
    est-ce que tu peux faire un copier/coller des données, plutôt qu'une capture d'écran, afin qu'on puisse travailler sur les données sans avoir à les recopier à la main ?

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut
    d'accord,

    adaptrules

    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
     
    best listenerbr
     
    promotions listenerp
     
    vertical listlayout
     
    horizontal gridlayout
     
    high high
     
    normal low
     
    medium medium
     
    large large
    newcontext

    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
     
     
    best false
     
    promotions true
     
    vertical false
     
    horizontal true
     
    normal false
     
    high true
     
    medium false
     
    large true
    currentconfig

    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
     
    speciality
     
    location
     
    searchb
     
    listenerBR
     
    hypertext
     
    hyperimg
     
    listlayout
     
    normal
     
    medium

  10. #10
    Invité
    Invité(e)
    Par défaut
    je te l'ai dit sur une autre discussion : l'instruction for boucle sur chaque mot, donc pour la commande cut, il n'y a pas de deuxième champs !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ for i in `cat newcontext`; do echo "$i"; done
    best
    false
    promotions
    true
    vertical
    [...]
    tu dois faire lire les fichiers comme c'est montré dans le tuto (Comment lire un fichier) donné en lien plus haut.

    EDIT : et les tirets des options ne sont pas les bons. ça doit être - et pas !

    EDIT 2 : les lignes vides dans les fichiers sont là exprès ? elles peuvent gêner la lecture...

    EDIT 3 : il serait peut-être bon de réviser ton algorithme, qui, plus je lis ton script, me paraît erroné.
    pour quelques valeurs, expose-nous leurs relations avec celles des autres fichiers, l'opération qui doit être effectuée, et le résultat attendu.
    Dernière modification par Invité ; 24/07/2017 à 16h16.

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut
    bonjour N_BaH,

    j'ai utilisé le "read" comme indiqué dans votre tutoriel, aussi j'ai tout modifié dans mon script. je vous donne une petite description pour vous montrer comment ca marche:

    pour chaque donnée de contexte (premier champ de contextdata), on cherche son action (deuxieme champ de 'adaptrules),
    apres, on vérifie si cette action est présente dans "currentconfig".
    si cette dernière est présente dans currentconfig et que le deuxieme champ de contextdata est egal à false,
    alors on supprime l'action de currentconfig
    sinon, si l'action est absente et que le deuxieme champ de contextdata est egal a true, alors, l'action est ajouté à current config.
    à la fin j'aimerais bien obtenir le fichier currentconfig mis à jour.

    dessous je vous montre le nouveau 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    #!/bin/bash
     
    while read var1 var2 ;do
     
    while read c cc;do
    if test "$c" = "$var1" ;then
    r=$cc
    fi
    done <adaptrules
     
    exist=false
    while read var; do
     
    if test "$var" = "$r";then
    exist=true 
    fi
    done < currentconfig
     
     
    if test "$var2" = false  && test "$exist" = true; then
     
    sed -i "/$r/d" currentconfig
     
    fi
     
    if test "$var2" = true && test "$exist" = false; then
     
    echo "$r">> currentconfig
     
    fi
     
    done < newcontext
    à ce stade, il m'affiche une erreur au niveau du sed (command expects followed by text)

  12. #12
    Invité
    Invité(e)
    Par défaut
    pour sed, il faut faire un copier/coller du message exact, entre balise code.
    mais il semblerait que tu ne sois pas sur GNU/Linux.

    et si tu pouvais ne pas changer les noms des fichiers...

    d'un point de vue algorithmique, il est inutile de lire les fichiers au-delà de la correspondance avec le mot cherché, il faut ajouter un break.
    mais lire l'intégralité de fichiers pour chaque ligne d'un autre suggère de trouver une meilleure solution.
    as-tu envisagé de faire un join ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ join -j 1 <(sort -k1,1 newcontext) <(sort -k1,1 adaptrules)
    best false listenerbr
    high true high
    horizontal true gridlayout
    large true large
    medium false medium
    normal false low
    promotions true listenerp
    vertical false listlayout

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 163
    Par défaut
    Bonjour N_Bah,

    Oui vous avez raison, je code sous un MacOs. Pour le message retourné, le voilà Nom : mac.png
Affichages : 249
Taille : 72,1 Ko

    sinon, j'ai jamais utilisé le break ou le join, du coup j'ai pas bien compris ce que vous voulez me dire à partir de "inutile de lire les fichiers..."

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par thouraya24 Voir le message
    Oui vous avez raison, je code sous un MacOs.
    Du coup, le bon forum est plutôt shell et commandes posix/
    car les outils sont différents entre macos et linux. Ils n'ont généralement pas les mêmes options.

    Sinon, ce serait une bonne idée d'indenter le code (avec emacs, Fraise ou Sublime Test, par exemple) pour en améliorer la lisibilité.

    sinon, j'ai jamais utilisé le break ou le join, du coup j'ai pas bien compris ce que vous voulez me dire à partir de "inutile de lire les fichiers..."
    Dans le code que tu proposes, tu as une première boucle qui lit le premier fichier ligne par ligne, et, pour chaque ligne lue, tu lis l'intégralité du 2ème fichier (avec la 2ème boucle imbriquée).
    C'est le genre de chose qu'on évite généralement de faire car ça peut être très coûteux en temps: si chaque fichier a juste 1000 lignes, le nombre de lignes lues sera de l'ordre de 1000 000...
    Si chaque fichier a 1 million de lignes, àmha, tu as le temps d'aller prendre un loooooong café avant de voir le résultat...

Discussions similaires

  1. shell unexpected token `done'
    Par clubinfo dans le forum Programmation système
    Réponses: 1
    Dernier message: 10/05/2011, 12h00
  2. [MySQL] Erreur mysql unexpected T_STRING
    Par nO_life dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/11/2008, 20h58
  3. erreur incrompréhensible unexpected T_STRING
    Par oceane751 dans le forum Langage
    Réponses: 2
    Dernier message: 28/08/2008, 15h11

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