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 unexpected EOF


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 14
    Par défaut Erreur unexpected EOF
    Bonjour, je suis débutante en shell et bash. je cherchais à faire un script pasDeTresorIci.sh.
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /bin/bash
     
    #Usage : ./pasDeTresorIci i j testTresor
     
    head -n$1 $3 | tail -n1 | while IFS=',' read carac; do   #je le fait afficher juste la ligne que je veux étudier
            carac=cut -c$2                                                 #je recupere le carac qui m'interesse 
            if [ carac == 'X' ];then exit 1                             # je fais le test
            else exit 0
            fi
    done
    il doit vérifier a la ligne i si le caractère j est une crois X ou un O
    testTresor est de la forme :
    O,O,O,O
    O,O,O,O
    O,O,X,O
    O,O,O,O
    Je me suis servie de quelques forums sur le site pour faire mon code j'espère qu'il fait déjà à peu près ce que j'espère qu'il fasse ...

    Pour l'instant je sais juste que lors de l'appel dans la console il me dit unexpected end of file ligne 10 soit la dernière ligne
    Merci d'avance!
      0  0

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Tu copies-colles ton code sur https://www.shellcheck.net/, et tu auras automatiquement toutes les remarques que j'allais te faire.

    • Il manque la substitution de commande.
    • Il manque les guillemets autour des variables
    • On accède à la R-value d'une variable en mettant un dollar à gauche : $carac
      0  0

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 14
    Par défaut
    merci beaucoup Flodelarab !

    On doit toujours mettre des "" autour des variables ?
    Substitution de commande ca veut dire qu'on met le résultat d'une commande dans une variable avec $ ?

    De plus : dans la suite de l'exo je ceux creer un script chasseAuTresor.sh qui tant que pasDeTresorIci demande de rentrer une nouvelle position et refait le test.
    peut on écrire :

    voici mon code en entier qui ne semble pas marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nope=$(./pasDeTresorIci "$1" "$2" "$3")                                                      
    while "$nope"; do                              #sous entendur while nope = 0 puisque c'est l'éxécution normal , considère-t-on nope comme une variable ici ?                            
            echo "entrer un nvlle position (ligne colone) : "
            read -r nvI nvJ
            "$1"=$(nvI)  "$2"=$(nvJ)
    done
    echo "vous avez trouver le  tresor !!"
    j'aurai bien aimé utiliser $? pour le while je sais pas si c'est possible ?
    Doit on exporter le premier script pasDeTresorIci dans chasseAuTresor ?
    Un parametre est il une variable ? donc entre ""?
    un read lit il des varaibles ? donc aussi enrtre "" ?
    Merci d'avance
      0  0

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nope=$(./pasDeTresorIci "$1" "$2" "$3")                                                      
    while "$nope"; do
    nope est exécuté une seule fois, avant la boucle; sa valeur ne changera plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ./pasDeTresorIci "$1" "$2" "$3"
    do
       : ...
    done
    et, oui, il faut toujours mettre des guillemets autour des variables. TOUJOURS !
    à moins de savoir pourquoi.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.
      0  0

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 14
    Par défaut
    merci, aussi je ne sais pas si tu as vu le code de pasDeTresorIci.sh mais je crois que finalement il ne fait pas ce que j'aimerai qu'il fasse car j'affiche la ligne que je veux et je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    head -n"$1" | tail -n1 | while IFS=',' read carac; do
    carac=$(cut -n"$2")  #mais pour moi ca du coup c'est sencer lire le 2eme caractère mais sauf que le while IFS=',' read carac je crois que ca decoupe chaque 0 ou X de ma carte et ca le met dans carac car ils sont separé par une ",", peut être faudrait il fait plutot :
    head -n"$1" | tail -n1 | while IFS read carac #mais du coup il faudrai cut le k-ieme carac qui ne serait pas "$2" mais "$2"+"$2"-1 car il y a $2 carac + ce meme nombre -1 de virgule mais je sais pas comment faire j'avais essayer ceci :
    nbCarac="$2"+"$2"-1 
    carac=$(cut -c"$nbCarac")
    j'ai aussi essayer en recupérant le j-ième champs separé par une virgule avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    carac=$(cut -d, -f"$2")
    mais ca ne marche pas non plus et je n'arrive pas a afficher dans echo mon carac aussi

    je rappel que ma carte a cette forme
    O,O,O,O
    O,X,O,O

    de plus dans chasseAuTresor.sh j'ai des erreurs au niveau du read pour les nouvelles valeurs nvI et nvJ je ne suis pas sur qu'on les récupère comme cela (il me dit qu'elle ne sont pas utilisées) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read -r nvI nvJ
    "$1"=$("nvI")  "$2"=$("nvJ") #sans les "" aussi ca ne marche pas
    mon code actuel de pasDeTresorIci.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /bin/bash
     
    #Usage : ./pasDeTresorIci i j testTresor
     
    head -n"$1" "$3" | tail -n1 | while read carac; do
            carac=$(cut -d, -f"$2")
            if [ "$carac" == 'X' ];then echo "1 car $carac" exit 1
            else echo "0 car "$carac"" exit 0
            fi
    done
    mon code actuel de chasseAuTresor.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while ./pasDeTresorIci.sh "$1" "$2" "$3"; do
            echo "entrer un nvlle position (ligne colone) : "
            read -r nvI nvJ
                    "$1"="$nvI"
                    "$2"="$nvJ"
            done
    done
    echo "vous avez trouver le  tresor !!"
    quand j'exécute j'obtient cela :
    Nom : Capture.PNG
Affichages : 84
Taille : 17,0 Ko

    l7 et 8 sont "$1"="$nvI" et "$2"="$nvJ"

    J'espère que tu as compris ce que j'ai voulu dire
    Merci encore
      0  0

  6. #6
    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
    tu devrais construire un tableau associatif à partir de ton fichier.
    en utilisant le numéro de ligne et l'emplacement sur la ligne en tant qu'index (séparés par une virgule, par exemple), ça te permettrait de retrouver directement la valeur de la cellule indiquée.

    ce serait plus propre !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.
      0  0

  7. #7
    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
    Citation Envoyé par annap Voir le message
    mon code actuel de chasseAuTresor.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while ./pasDeTresorIci.sh "$1" "$2" "$3"; do
            echo "entrer un nvlle position (ligne colone) : "
            read -r nvI nvJ
                    "$1"="$nvI"
                    "$2"="$nvJ"
            done
    done
    echo "vous avez trouver le  tresor !!"
    Tu confonds variables et arguments positionnels...
    La bonne syntaxe pour valoriser des arguments positionnels serait plus du genre (dans ton cas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ./pasDeTresorIci.sh "$1" "$2" "$3"; do
            echo "entrer un nvlle position (ligne colone) : "
            read -r nvI nvJ
                    set "$nvI" "$nvJ" "$3"
            done
    done
    echo "vous avez trouver le  tresor !!"
    Le repositionnement de "$3" n'est pas facultatif, sinon set ne déclarera que 2 arguments et non 3.

    PS: ton script n'est pas du pure bash puisqu'il utilise des commandes externes tel que head,tail,cut dont tu pourrais te passer si tu utilisais un tableau comme le disait si bien N_BaH.

    PS2: A quoi sert le 2ème done dans ta boucle ???
      1  0

Discussions similaires

  1. Grep serveur distant erreur : unexpected EOF while looking for matching `"'
    Par dadou9101lol dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 02/03/2020, 14h16
  2. Réponses: 7
    Dernier message: 25/03/2011, 15h21
  3. [FPDF] erreur unexpected $end
    Par BenoitDenis dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 03/04/2006, 14h21
  4. Shell - erreur unexpected end of file
    Par claralavraie dans le forum Linux
    Réponses: 7
    Dernier message: 12/01/2006, 09h59
  5. Erreur unexpected end of file
    Par snoop dans le forum Linux
    Réponses: 6
    Dernier message: 22/03/2004, 10h37

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