Loop utilizando while de perguntas e respostas [RESOLVIDO]

1. Loop utilizando while de perguntas e respostas [RESOLVIDO]

Helder Pereira de Assunção Júnior
Helder_Jr

(usa Ubuntu)

Enviado em 05/10/2022 - 22:18h

Salve galera.

Estou precisando fazer um script onde eu pego informações de um arquivo, utilizo essa variavel em uma pergunta e a resposta eu envio para um outro arquivo, segue abaixo o código:


while read LINHA
do
echo "Qual a matrícula do colaborador $LINHA?"
read matricula

echo "$LINHA | $matricula" >> /home/root/matricula_colab.txt

done < /home/root/colab.txt


A saída que eu preciso é (a primeira coluna é a LINHA, a segunda matricula):
Andre | 0551
Bruno | 0552
Carlos | 0553

Porém estou obtendo a seguinte saída:

Andre | Bruno
Carlos |

Não posso ter 2 read em um único while?

Agradeço o apoio desde já.


  


2. Re: Loop utilizando while de perguntas e respostas [RESOLVIDO]

Carlos APC
Carlos_Cunha

(usa Linux Mint)

Enviado em 06/10/2022 - 12:27h

Mas aonde vc esta informando o valor da variavel $matricula ?
Pois aquele "read matricula" ao meu ver não esta fazendo nada....


#-------------------------------------------------------------------------------------#
"Falar é fácil, me mostre o código." - Linus Torvalds
#-------------------------------------------------------------------------------------#



3. Re: Loop utilizando while de perguntas e respostas

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 06/10/2022 - 15:32h

Helder_Jr escreveu:

Salve galera.

Estou precisando fazer um script onde eu pego informações de um arquivo, utilizo essa variavel em uma pergunta e a resposta eu envio para um outro arquivo, segue abaixo o código:


while read LINHA
do
echo "Qual a matrícula do colaborador $LINHA?"
read matricula

echo "$LINHA | $matricula" >> /home/root/matricula_colab.txt

done < /home/root/colab.txt


A saída que eu preciso é (a primeira coluna é a LINHA, a segunda matricula):
Andre | 0551
Bruno | 0552
Carlos | 0553

Porém estou obtendo a seguinte saída:

Andre | Bruno
Carlos |

Não posso ter 2 read em um único while?
Agradeço o apoio desde já.

Boa tarde Helder,
Usando o "descritor de arquivos", da certo.
cat nomes.txt
Nome_01
Nome_02
Nome_03
Nome_04
Nome_05
Nome_06
----------------------------------------------------------------------------------------------------------------
exec 3< nomes.txt; #Faz a leitura do arquivo e coloca no descritor 3
while read -u3 line;do #Faz a leitura da linha
read -p "Mat do $line: " mat;
echo "${line}|$mat";
done;
exec 3<&- #Fecha o descritor de arquivos


É isso...


______________________________________________________________________
Importante:
Se te ajudei, retribua.
Após marcar o tópico como RESOLVIDO, é só escolher a MELHOR RESPOSTA
.[/b]
______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



4. Re: Loop utilizando while de perguntas e respostas [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/10/2022 - 03:54h

Carlos_Cunha escreveu:

Mas aonde vc esta informando o valor da variavel $matricula ?
Pois aquele "read matricula" ao meu ver não esta fazendo nada....


Está fazendo, sim. O problema é que ao fazer aquele “while read LINHA; do … done < arquivo” todo o laço de repetição tem suas entradas redirecionadas a partir do arquivo, não apenas o comando read que controla se haverá mais repetições.

A solução canônica para esses casos é aquela dada pelo msoliver, acima: abrir o arquivo antes do laço de repetição começar num descritor separado da entrada padrão, e fazer as leituras que precisam vir do arquivo a partir desse descritor separado para ele alocado, lembrando de fechar o arquivo, liberando o descritor, ao final do laço de repetição.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


5. Re: Loop utilizando while de perguntas e respostas

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/10/2022 - 04:29h

Uma ressalva sobre a resposta do nosso colega msoliver, acima: ela supõe que o script será executado com o Bash, e por isso usa as opções -u e -p do comando interno read da forma que usa.

Sendo esse o caso, eu acho bom explicitar que a solução apresentada é específica para o Bash, e lembrar que, ao contrário de distribuições baseadas em Red Hat (RHEL, CentOS, Fedora etc.), nas quais sh é sinônimo de bash, em várias outras distribuições ou versões de Unix o sh é sinônimo de ash (alguns BSDs), dash (Debian, Ubuntu e similares), ksh (versão de 1988), ksh93, pdksh ou mesmo outras opções.

Fora o fato de haver diferentes defaults para /bin/sh em diferentes sistemas e distribuições, o próprio script pode, por diferentes razões, explicitamente preferir usar outro shell. Por exemplo, se alguém quiser fazer contas com números em ponto flutuante, provavelmente vai usar o ksh93 (pois nem mesmo Bash, com todo o seu tamanho, tem aritmética de ponto flutuante embutida), ou num sistema com muita restrição de memória pode-se querer usar ash ou dash, que têm menos de um décimo do tamanho do Bash.


Ciente disso, eis algumas das diferenças que podem se manifestar nesse caso específico:

    • no ash e dash, o comando read não possui a opção -u, de modo que a leitura na linha de controle do while provavelmente teria de ter a forma “read LINHA <&3” (que é menos eficiente, por sinal, mas é o único meio de fazer nesses shells);

    • no ksh, ksh93 e pdksh, a opção -p existe mas tem um sentido completamente diferente e não recebe argumento, servindo para redirecionar a leitura a partir de um co-processo que tenha sido anteriormente iniciado, de modo que seria necessário primeiro exibir o prompt que informa o nome do aluno cuja matrícula deve ser digitada por meio de um comando echo (ou print, já que é um ksh), e depois fazer a leitura num comando read.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


6. Re: Loop utilizando while de perguntas e respostas [RESOLVIDO]

Helder Pereira de Assunção Júnior
Helder_Jr

(usa Ubuntu)

Enviado em 16/10/2022 - 00:08h

Boa noite pessoal,

Consegui resolver o problema alterando o comando para fazer o laço, ao invés de utilizar o "While" passei a utilizar o "for" e está funcionando da forma como preciso, segue abaixo o código:


for LINHA in $(cat /home/root/colab.txt)
do
echo "Qual a matrícula do colaborador $LINHA"
read matricula
echo "$LINHA|$matricula" >> /home/root/matricula_colab.txt
done


Agradeço a todos que apoiaram na solução do problema!!


7. Re: Loop utilizando while de perguntas e respostas [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/10/2022 - 23:42h


Helder_Jr escreveu:

Boa noite pessoal,

Consegui resolver o problema alterando o comando para fazer o laço, ao invés de utilizar o "While" passei a utilizar o "for" e está funcionando da forma como preciso, segue abaixo o código:

for LINHA in $(cat /home/root/colab.txt)
do
echo "Qual a matrícula do colaborador $LINHA"
read matricula
echo "$LINHA|$matricula" >> /home/root/matricula_colab.txt
done


Agradeço a todos que apoiaram na solução do problema!!


Note que essa solução tem dois problemas:

    1. Vai quebrar se houver um espaço numa linha do arquivo colab.txt (por exemplo, se o nome constar como “Helder Jr.”, em vez de “Helder_Jr”, o comando for vai entender que “Helder” e “Jr.” são duas entradas distintas.

    2. Ela faz com que o arquivo seja todo lido para a memória, antes de tratar suas linhas. Essa abordagem é muito conveniente para conjuntos de dados pequenos, mas pode ser um problema grave com arquivos maiores e em situações em que você não dispõe de muita memória.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts