SHELL: read

Résolu
tlep Messages postés 597 Statut Membre -  
 Utilisateur anonyme -
Bonjour,

j'ai un souci avec 2 read en boucle dans un shell :

#!/bin/bash
L=1
while read ligne;do
while true;do
clear
echo "Supprimer \"$ligne\" ?"
reponse=""
read reponse
if [ "$reponse" = "o" ];then
sed -i $L'd' $1
break
elif [ "$reponse" != "" ];then
L=$(($L+1))
break
fi
done
done < mon_fichier

Je veux afficher chaque ligne pour en demander la suppression.
Bizarrement, la variable "$reponse" prend la valeur de "$ligne".

Très étrange non ? :-((
Configuration: Windows XP
Firefox 2.0.0.7

3 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    C'est le double "read" qui met la pagaille je pense (enfin j'en suis même sûr, mais je sais pas pourquoi :-\ ).

    Donc au lieu de passer par une boucle "while", essaie plutôt avec une boucle "for" en modifiant la variable "$IFS", du style :
    L=1
    IFS=$'\n'
    for ligne in $(cat $1)
    do
    echo "Affichage ligne $L ?"
    read -e reponse
    if [ "$reponse" = "o" ]
    then
    echo $ligne
    fi
    L=$(expr $L + 1)
    done
    ;-))
    1
  2. tlep Messages postés 597 Statut Membre 118
     
    J'y avais bien pensé mais j'imaginais que ce comportement était explicable;

    merci ;
    0
  3. ato
     
    if [ "'read -e'" = "Bonjour" ]
    then
        echo oui
    fi
    

    warning : simple-quotes are back-quotes

    is like :

    read line;
    if [ "$line" = "Bonjour" ]
    then
        echo oui
    fi
    
    -1
    1. Utilisateur anonyme
       
      as-tu testé cette proposition afin de la valider ? (si je pouvais moinsser davantage ...)

      pour répondre à la question initiale, avec 7 ans de retard :
      while read -r line <&3
      do
      echo "afficher la ligne ? \"oui\" ou \"non\""
      read reponse
      test "$reponse" = "oui" && echo "$line"
      done 3<monFichier
      le contenu du fichier est redirigé vers un descripteur de fichier supplémentaire, ainsi le
      stdin
      de la boucle
      while
      demeure libre pour d'autres
      read
      .
      0