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 :

problème avec echo -n et read


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut problème avec echo -n et read
    Bonjour tout le monde,

    Voila c'est un peu difficile à expliquer mon problème, donc pour cela je vais vous mettre mon script et tenter de vous expliquer ensuite.

    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
     
    tar tvf ../PACKAGE/archive.tar>../tmp/fic3
    cat ../tmp/fic3|while read line;
    do
            if [ `echo $line|cut -c1` == "-" ]
            then
                    path=`echo $line|awk '{print $NF}'`
                    fic=`basename $path`
                    if [ `cat ../tmp/fic2` == "exploit/" ]
                    then
                            if [ -e `find ../exploit/ADMIN -name $fic` ]
                            then
                                    echo -n "Choix : "
                                    read ans
                            else
                                    cd ../exploit/ADMIN
                                    tar xf ../../PACKAGE/archive.tar
                            fi
                    else
                            echo "rep prod"
                    fi
            fi
    done
    Donc voila mon souci se situe au niveau du "echo -n "Choix : "" et de "read ans". En fait dès que mon script arrive à ce niveau là il s'arrête et le prompt apparait san que je puisse insérer quoi que ce soit (bien sûr $fic existe ce qui me permet de rentrer dans la boucle).

    Voila j'espère que c'est assez clair pour vous et que vous allez pouvoir m'aider. Merci d'avance

  2. #2
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    La cmd read lit dans son entree standard. Si tu lui passes des paramètres, ce que tu tapes au clavier sera insérée dans ton param. (c juste une petite description vite fait de read).
    Le problème est qu'il attend que tu lui passes quelque chose dans son entrée standard.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Ok donc en fait toi tu me proposes de rentrer un paramètre directement dans mon script. Or c'est pas vraiment ce que je souhaite. L'utilisateur doit rentrer une valeur quelconque lorsque "Choix :" apparait. En fait, après je souhaites mettre un case pour effectuer des actions en fonction de ce qu'à taper l'utilisateur.

    voila

  4. #4
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    En fait qd je parlais de paramètres à passer au read pas au script.
    Est ce que tu peux me passer un exemple d'exécution de ton script et me montrer où ca bloque stp?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    En fait le code de mon script est déjà ce que j'ai mis plus haut donc tu peux le reprendre.

    Ensuite admettons qu'il s'appelle script.sh, je tape ./script.sh et voila ce que cela me donne :

    Choix : bash-3.00$

    Le prompt est tout de suite remontée alors que je devrais avoir le curseur juste après "Choix : " pour écrire ce que je veux.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Quand je prends juste la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if [ -e `find ../exploit/ADMIN -name $fic` ]
                            then
                                    echo -n "Choix : "
                                    read ans
                            else
                                    cd ../exploit/ADMIN
                                    tar xf ../../PACKAGE/archive.tar
                            fi
    cela fonctionne, j'ai mon curseur comme il faut.
    Donc à mon avis, le fait que je parcours un fichier au début du script pose un problème. Je sais pas ce que tu en penses.

  7. #7
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par panach91 Voir le message
    En fait le code de mon script est déjà ce que j'ai mis plus haut donc tu peux le reprendre.

    Ensuite admettons qu'il s'appelle script.sh, je tape ./script.sh et voila ce que cela me donne :

    Choix : bash-3.00$

    Le prompt est tout de suite remontée alors que je devrais avoir le curseur juste après "Choix : " pour écrire ce que je veux.
    C'est bien ce que je pensais, c'est à a cause de l'option -n du echo. Mets un ";" apres l'instruction du echo et regarde ce que ca donne.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Non je suis désolé mais cela ne change rien. Le plus impressionnant est que j'utilise d'autres menus avec aussi un choix à renseigner par l'utilisateur, avec la même syntaxe que là et cela fonctionne très bien. J'avoue que là c'est un mystère pour moi.

  9. #9
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    A mon avis, il y'a un \n qui s'est bouffé à la fin, ce qui explique pourquoi le prompt il est remonté.
    Et si tu enlevais l'option -n, ca donne quoi comme resultat?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Si j'enlève le -n cela ne change rien de plus à partir que cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Choix :
    bash-3.00$

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Bon j'ai résolu mon problème, j'ai changé de stratégie et au lieu d'utiliser une boucle tant que, j'utilise la boucle for. Peut-être que cela n'est pas recommandé mais bon cela fonctionne. Donc je vous mets mon code pour ceux que cela intéresse.
    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
    41
    42
     
    #!/bin/bash
     
     
    main()
    {
    if [ -e `find ../$rep/ADMIN -name $fic` ]
    then
            echo "Le fichier $fic existe déjà. Voulez-vous le modifier ? [o/n]"
            echo -n "Choix : "
            read ans
     
            case "$ans" in
            o) echo "le fichier $fic a donc été modifié"
               cd ../$rep/ADMIN
               tar xf ../../PACKAGE/archive.tar;;
            n) echo "le fichier ne sera pas modifier";;
            esac
    else
            cd ../$rep/ADMIN
            tar xf ../../PACKAGE/archive.tar
    fi
    }
     
     
    ./menu.sh
    clear
    for i in `tar tvf ../PACKAGE/archive.tar|tr -s " " ":"`; do
            if [ `echo $i|cut -c1` == "-" ]
            then
                    path=`echo $i|awk -F":" '{print $NF}'`
                    fic=`basename $path`
                    if [ `cat ../tmp/fic2` == "exploit/" ]
                    then
                            rep="exploit"
                            main
                    else
                            rep="prod"
                            main
                    fi
            fi
    done
    Par contre comme une erreur ne s'en va pas sans en faire réapparaitre d'autres, mon test "if [ -e `find ../$rep/ADMIN -name $fic` ]" rentre tout le temps dans la partie "then" alors que cela ne devrait pas être le cas lorsque le fichier n'existe pas. Je ne comprends pas.

    Donc voila si vous avez des idées et merci en tout cas pour ceux qui m'aident.

  12. #12
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par panach91;3088051
    [CODE
    #!/bin/bash


    main()
    {
    if [ -e `find ../$rep/ADMIN -name $fic` ]
    then
    echo "Le fichier $fic existe déjà. Voulez-vous le modifier ? [o/n]"
    echo -n "Choix : "
    read ans

    case "$ans" in
    o) echo "le fichier $fic a donc été modifié"
    cd ../$rep/ADMIN
    tar xf ../../PACKAGE/archive.tar;;
    n) echo "le fichier ne sera pas modifier";;
    esac
    else
    cd ../$rep/ADMIN
    tar xf ../../PACKAGE/archive.tar
    fi
    }


    ./menu.sh
    clear
    for i in `tar tvf ../PACKAGE/archive.tar|tr -s " " ":"`; do
    if [ `echo $i|cut -c1` == "-" ]
    then
    path=`echo $i|awk -F":" '{print $NF}'`
    fic=`basename $path`
    if [ `cat ../tmp/fic2` == "exploit/" ]
    then
    rep="exploit"
    main
    else
    rep="prod"
    main
    fi
    fi
    done
    [/CODE]

    Par contre comme une erreur ne s'en va pas sans en faire réapparaitre d'autres, mon test "if [ -e `find ../$rep/ADMIN -name $fic` ]" rentre tout le temps dans la partie "then" alors que cela ne devrait pas être le cas lorsque le fichier n'existe pas. Je ne comprends pas.
    Comment n'ai je pas pu voir ca avant
    C normal qu'il rentre tout le temps dans le then parce que lorsque tu lances une exécution entre `` ca retourne une chaine de caractères. En plus l'option -e attend un fichier et renvoie vrai si c'est le cas.
    C koi le test que tu voulais faire ds le if?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    En fait dans le if je voulais tester si le fichier existe sous l'arborescence de $rep/ADMIN. Je pensais qu'en faisant un find soit il me trouvait le fichier, au quel cas je faisais les opérations dans le then, ou alors il ne me le trouvait pas et donc je faisais les opérations dans le else.

    voila je cherche une solution pour parer à cette erreur

    merci pour ton aide

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Bon j'ai trouvé une solution qui n'est pas forcémen la plus élégante mais elle fonctionne pour ma part.
    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
    41
    42
    43
    44
    45
    46
     
    #!/bin/bash
     
    cd ..
    export REP=`pwd`
     
    main()
    {
    clear
    find ../exploit/ADMIN -name $fic>../tmp/fic4
    if [[ `cat ../tmp/fic4` != "" ]]
    then
            echo "Le fichier $fic existe déjà. Voulez-vous le modifier ? [o/n]"
            echo -n "Choix : "
            read ans
     
            case "$ans" in
            o|O) cd ../$rep/ADMIN
                 tar xf ../../PACKAGE/archive.tar $path;;
            n|N) echo "le fichier ne sera pas modifié";;
            esac
    else
            cd ../$rep/ADMIN
            tar xf ../../PACKAGE/archive.tar $path
    fi
    cd $REP/SCRIPT
    }
     
    cd SCRIPT
    ./menu.sh
    clear
    for i in `tar tvf ../PACKAGE/archive.tar|tr -s " " ":"`; do
            if [[ `echo $i|cut -c1` = "-" ]]
            then
                    path=`echo $i|awk -F":" '{print $NF}'`
                    fic=`basename $path`
                    if [[ `cat ../tmp/fic2` = "exploit/" ]]
                    then
                            rep="exploit"
                            main
                    else
                            rep="prod"
                            main
                    fi
            fi
    done
    J'ai juste utilisé un fichier de substitution. S'il trouve ou non le fichier le fichier avec la commande find, il l'inscrirera ou non dans le fichier et donc après je peux tester et faire mes opérations par la suite.

    voila si tu peux me dire ce que t'en penses publicStaticVoidMain ca serait sympas. Merci pour tout en tout cas.

  15. #15
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par panach91 Voir le message
    En fait dans le if je voulais tester si le fichier existe sous l'arborescence de $rep/ADMIN. Je pensais qu'en faisant un find soit il me trouvait le fichier, au quel cas je faisais les opérations dans le then, ou alors il ne me le trouvait pas et donc je faisais les opérations dans le else.

    voila je cherche une solution pour parer à cette erreur

    merci pour ton aide
    Plus simple, si $fic se trouve dans $rep/ADMIN, tu peux juste tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if [ -f "$rep/ADMIN/$fic" ]; then 
       #patati 
        #patata
    fi
    Ou encore si tu veux qd meme utliser find, fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if find ../exploit/ADMIN -name $fic ; then
       #patati
       #patata
    fi
    Voilà, tiens moi au courant de ces resultats, la

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Ou encore si tu veux qd meme utliser find, fais

    Code :
    if find ../exploit/ADMIN -name $fic ; then
    #patati
    #patata
    fi
    Cette solution ne fonctionne toujours pas, il ne rentre que dans le then.

    Plus simple, si $fic se trouve dans $rep/ADMIN, tu peux juste tester :

    Code :
    if [ -f "$rep/ADMIN/$fic" ]; then
    #patati
    #patata
    fi
    Par contre, celle-ci fonctionne parfaitement avec quelques adaptations propres au script.

    Je tiens à te remercier pour toute ton aide et j'espère qu'un jour je pourrai t'aider à mon tour....

  17. #17
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par panach91 Voir le message
    Cette solution ne fonctionne toujours pas, il ne rentre que dans le then.

    et si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    find ../exploit/ADMIN -name $fic 
    if [ $? -eq 0 ] ; then
       #patati
       #patata
    fi
    En tt cas, bon courage !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/02/2013, 11h34
  2. Problème avec .Echo
    Par Julie!!! dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/06/2008, 10h43
  3. Problème avec echo
    Par laurentSc dans le forum Langage
    Réponses: 6
    Dernier message: 10/04/2008, 13h14
  4. [POO] Problème avec echo
    Par krfa1 dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2007, 13h00
  5. Problème avec la fonction read.
    Par Whaouu dans le forum Langage
    Réponses: 10
    Dernier message: 23/09/2005, 11h33

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