SHELL: read

Résolu/Fermé
tlep Messages postés 596 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 - 10 oct. 2007 à 12:03
 Utilisateur anonyme - 23 févr. 2014 à 16:49
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 ? :-((

3 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 oct. 2007 à 13:08
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
tlep Messages postés 596 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 118
10 oct. 2007 à 14:09
J'y avais bien pensé mais j'imaginais que ce comportement était explicable;

merci ;
0
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
Utilisateur anonyme
23 févr. 2014 à 16:49
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