Script interativo; Avisar dentro de um loop

1

Como faço para solicitar ao usuário uma entrada de um script de shell (ksh) dentro de um loop no qual um arquivo é lido?

O script lê em um arquivo. Em cada passagem de loop, o usuário será perguntado se deseja cancelar ou não? A função funciona bem fora do loop. Dentro do loop, a variável é preenchida com a linha do arquivo. O script não para a interação.

Alguma idéia?

O 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
######################################################

O arquivo de entrada em.txt:

Koeln
Aachen
Muenchen
Hamburg
Berlin

A saída:

# /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
    
por Chris 22.12.2014 / 13:51

1 resposta

-1

O comando read da função está usando o mesmo stdin que o read do loop while. Use um descritor de arquivo diferente. Além disso, a função pode ser mais simples:

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
    
por 22.12.2014 / 17:47