Intervention user dans une boucle while

Résolu
LoossSS Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
LoossSS Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

j'ai un projet et je bloque sur un point : je voudrais faire intervenir l'utilisateur dans le genre :

echo "Que voulez-vous faire?"
read reponse

et ensuite utiliser la réponse pour la suite de mon script.

Le problème c'est que je voudrais le faire à l'intérieur d'une boucle while et j'ai l'impression que ce n'est pas possible...

Voici un résumé du script pour bien comprendre :

cat journal | while read ligne
do
if [ $ligne != cequejeveux ]
then echo "Que voulez-vous faire?"
read reponse
# Ensuite j'utilise la réponse de l'utilisateur
fi
done

Si quelqu'un peut m'aider....

Merci d'avance ;-)
Configuration: Windows Vista
Firefox 2.0.0.14

7 réponses

  1. bob
     
    j'ai pas compris grand chose a ton truc mais je te donne un exemple de ce que moi je fait :

    while true
    do

    echo "Veuillez faire votre choix :"
    echo "apppuyer 1 pour eteindre"
    echo "2 pour stop ce machin"
    read choix
    case $choix in

    1) shutdown -h now ;;
    2) break ;;
    esac
    done
    0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    while read ligne
    do
    if [ $ligne != cequejeveux ]
    then echo "Que voulez-vous faire?"
    echo "1 - ceci..."
    echo "2 - cela..."
    read reponse
    case "$reponse" in
    1)     cmd...
           ;;
    2)     cmd...
           ;;
    *)     echo "Mauvaise réponse"
           exit
           ;;
    esac
    fi
    done < journal
    Pas testé, mais c'est en gros ce que je ferai...
    0
  3. LoossSS Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci pour vos réponses :

    donc, j'ai testé le case : ça ne marche pas!!!

    En fait, j'ai toujours le même problème qu'avant,
    il m'écrit bien les choix possibles mais il n'attend pas ma réponse, il passe à la suite....
    Voila mon vrai script si ça peut vous aider à mieux comprendre :

    # Le but de ce script est de comparer les dates de deux fichiers par rapport au journal et de copier le plus récent sur l'autre...

    comparedate $date2 $date_journal2 # Fonction comparedate déjà définit et qui marche très bien
    if [ $? -eq 1 ] # comparedate ressort 1 si le fichier à la même date que le journal, 2 si la date est plus récente
    then
    cp --preserve=mode $chemin1 $chemin2
    echo "Le fichier $chemin2 a été remplacé par $chemin1"
    else
    echo "Les fichiers $chemin1 et $chemin2 ont des dates différentes du journal"
    echo "Lequel souhaitez-vous conserver?"
    echo "Tapez : 1 pour $chemin1 2 pour $chemin2"
    read reponse
    case "$reponse" in
    1) cp --preserve=mode $chemin1 $chemin2
    echo "Le fichier $chemin2 a été remplacé par $chemin1 ;;
    2) cp --preserve=mode $chemin2 $chemin1
    echo "Le fichier $chemin1 a été remplacé par $chemin2 ;;
    esac
    fi

    Bon courage...
    0
    1. bob
       
      teste d'abord avec un truc simple comme le mien, ensuite ajoute tes trucs par la suite ;)

      comme ça tu vois ou sa bloque
      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Oups j'avais complètement oublié que 2 instructions "read" dans la même boucle (while) merdoient quelque peu ;-((
    De plus je ne me rappelle plus s'il y a une façon de contourner la chose ou pas ;-\

    Quoi qu'il en soit, il suffit de remplacer la boucle "while" par une boucle "for" en modifiant la valeur de la variable "$IFS" en entrée :
    jp@ubuntu:~/trash $ cat fich
    AA
    BB
    CA
    DD
    EA
    
    jp@ubuntu:~/trash $ cat foo.sh
    
    #! /bin/bash
    
    IFS=$'\n'
    for line in $(cat fich)
    do
    grep "A" <<<${line}
    if [ "$?" -eq 0 ]
    then echo "${line}"
    else
    echo "La ligne ne contient pas de A..."
    echo "Voulez-vous afficher la ligne (O/N) ?"
    read choix
    case "${choix}" in
    O|o)    echo "${line}"
            ;;
    N|n)    echo "xxx"
            ;;
    *)      echo Erreur
            ;;
    esac
    fi
    done
    
    jp@ubuntu:~/trash $ ./foo.sh
    AA
    AA
    La ligne ne contient pas de A...
    Voulez-vous afficher la ligne (O/N) ?
    O
    BB
    CA
    CA
    La ligne ne contient pas de A...
    Voulez-vous afficher la ligne (O/N) ?
    n
    xxx
    EA
    EA
    jp@ubuntu:~/trash $
    ;-))
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Oups -(((

      Pour éviter l'echo du "grep", modifier la ligne en :
      grep "A" <<<${line} >/dev/null
      ;-))
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. LoossSS Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
     
    Avec un peu de recul, je récapitule la situation parce que le problème n'est pas résolu !! (et en plus mon problème a évolué...)

    J'ai un fichier avec des données.

    Je souhaite faire intervenir l'utiliateur sur chaque ligne de ce fichier.

    J'ai deux choix :

    ==> boucle while : le fichier est pris ligne par ligne MAIS l'utilisateur ne peux pas intervenir ....

    ==> boucle for : l'utilisateur peut intervenir MAIS le fichier est pris mot par mot et non pas ligne par ligne ....

    Y a-t-il un moyen de concilier les deux ??? C'est à dire le fichier est pris ligne par ligne et l'utilisateur peut intervenir !!

    MERCI !!!!!
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Je te l'ai expliqué dans mon post avec l'exemple de la boucle "for" :
      Quoi qu'il en soit, il suffit de remplacer la boucle "while" par une boucle "for" en modifiant la valeur de la variable "$IFS" en entrée !!!

      Donc ajuste la valeur de la variable $IFS en début de script comme dans mon exemple et ça devrait rouler...
      [test]$ cat fich
      AA il fait beau
      BB il pleut
      CA il neige
      DD ça souffle
      EA c'est bientôt l'été
      
      [test]$ cat foo.sh
      #! /bin/bash
      
      IFS=$'\n'
      for line in $(cat fich)
      do
      grep "A" <<<${line} >/dev/null
      if [ "$?" -eq 0 ]
      then echo "${line}"
      else
      echo "La ligne ne contient pas de A..."
      echo "Voulez-vous afficher la ligne (O/N) ?"
      read choix
      case "${choix}" in
      O|o)    echo "${line}"
              ;;
      N|n)    echo "xxx"
              ;;
      *)      echo Erreur
              ;;
      esac
      fi
      done
      
      [test]$ ./foo.sh
      AA il fait beau
      La ligne ne contient pas de A...
      Voulez-vous afficher la ligne (O/N) ?
      o
      BB il pleut
      CA il neige
      La ligne ne contient pas de A...
      Voulez-vous afficher la ligne (O/N) ?
      N
      xxx
      EA c'est bientôt l'été
      [test]$ 
      ;-))
      0
  7. LoossSS Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
     
    Je suis d'accord. ça marche !!

    Mais si je modifie la variable IFS au début, dans ce cas, ça pose des problèmes avec mes variables d'entrée (ou alors c'est moi qui m'y prend mal... ???)

    En tout cas, merci pour ta patience........... ;-)
    0
  8. LoossSS Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci !!!

    Je suis un boulet !! lol ;-)

    Tout marche très bien avec ta méthode.....
    0