1 votes

Interactive script ; Invitation à l'intérieur d'une boucle

Comment demander à un utilisateur une entrée à partir d'un Shell Shell (ksh) à l'intérieur d'une boucle dans laquelle un fichier est lu ?

Le script lit un fichier. A chaque passage de la boucle, on demande à l'utilisateur s'il veut annuler ou non ? La fonction fonctionne bien en dehors de la boucle. A l'intérieur de la boucle, la variable est remplie avec la ligne du fichier. Le script ne s'arrête pas pour une interaction.

Des idées ?

Le script :

######################################################
func_yesno(){
echo "cancel y/n?"
read answer
echo Your answer: $answer
case $answer in
  y*|Y*) exit 0 ;;
  n*|N*) echo ok ;;
  *) echo wrong! ;;
esac
}

func_yesno

while read line
do
        echo line: $line
        func_yesno
done < /tmp/in.txt

func_yesno
######################################################

Le fichier d'entrée en .txt :

Koeln
Aachen
Muenchen
Hamburg
Berlin

Le résultat :

# /tmp/a.sh
cancel y/n?
n
Your answer: n
ok
line: Koeln
cancel y/n?
Your answer: Aachen
wrong!
line: Muenchen
cancel y/n?
Your answer: Hamburg
wrong!
line: Berlin
cancel y/n?
Your answer:
wrong!
cancel y/n?
n
Your answer: n
ok

-1voto

Abbas Points 3737

La fonction read utilise le même stdin que celui de la boucle while. read . Utilisez un descripteur de fichier différent. De plus, la fonction peut être plus simple :

func_yesno() {
    typeset answer PS3="Cancel (y/n)?"
    select answer in Yes No; do
        case $answer in
            Yes) exit 0 ;;
            No) echo "ok"; break ;;
        esac
    done
}

while read -u3 line; do 
    echo "line: $line"
    func_yesno
done 3< unique.txt

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X