Script de shell de loop se o arquivo de entrada tiver mais entradas

1

Eu tenho um script de shell e forneci respostas para o script através do arquivo answers.txt.

echo -n "Enter your name: "; read name
echo -n "Enter your number: "; read number
echo "Your name is $name and your number is $number"

arquivo answers.txt

Buvanesh
12345

Eu corro este script usando script.sh < answers.txt

O arquivo de resposta é dinâmico, o usuário pode adicionar mais nomes e números no arquivo de resposta.

por exemplo,

Buvanesh
12345
Kanna
45678

Nesse caso, se eu executar o script, serão necessárias apenas as duas primeiras entradas. Eu quero levar o shell script todas as entradas e dar saída de acordo. Eu acho que tenho que implementar um loop, mas não sei exatamente como para este caso. Alguém pode me ajudar com isso?

    
por Buvanesh Kumar 05.06.2017 / 15:06

3 respostas

1
while IFS= read -r name && IFS= read -r number; do
   #IFS= read -r number || break
   printf 'Your name is %s and your number is %d\n' "$name" "$number"
done < answers.txt

Seus processos de pensamento estavam no caminho certo, precisamos trazer um loop , o while loop cuja condição é read de comandos unidos por um AND.

    
por 05.06.2017 / 15:27
0

O comando read falhará quando não houver mais entrada, então você pode usá-lo como condição de loop:

#!/bin/sh
echo -n "Enter your name: "
while read name
do
  echo -n "Enter your number: "
  read number
  echo "Your name is $name and your number is $number"
done
    
por 05.06.2017 / 15:13
0

Sr. A resposta de Schaller é boa. A desvantagem de redirecionar a entrada de um arquivo é que sua entrada manual agora também está sujeita ao loop, de modo que os usuários precisarão saber para pressionar enter (não fornecer um valor) para finalizar o loop. Você pode usar sua lógica atual para execuções manuais e fazer algo como abaixo quando houver um arquivo de entrada ($ 1) fornecido ao script (não redirecionado).

Se você tiver certeza de que o formato do arquivo será sempre "nome \ nnúmero \ n", poderá fazer isso:

cntr=0
cat $1 | while read line
do
    if [ $cntr -eq 0 ]
    then
      name=$line
      cntr=1
    elif [ $cntr -eq 1 ]
      number=$line
      echo "Your name is $name and your number is $number"
      cntr=0
    fi
done

Isso deve imprimir sua declaração até que todas as combinações de nome / número tenham sido lidas.

    
por 05.06.2017 / 15:16