shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Re: Script para Pegar nomes num arquiv o TXT e format


From: Julio C. Neves
Subject: Re: [shell-script] Re: Script para Pegar nomes num arquiv o TXT e formatar a saída usando FOR
Date: Wed, 5 Sep 2018 11:43:51 -0300

Fala Bruno,
como eu que dei a solução que vc perguntou, tb darei a explicação resumida.

O X da questão não é o while... O while aqui, diferentemente de todas as linguagens que conheço (e não são poucas), não faz um loop "enquanto uma condição for verdadeira", mas sim "enquanto uma isntrução for bem sucedida" e a instrução nesse caso é o read, que sempre será bem sucedido, exceto qdo ler o EOF.

O read aceita a leitura de diversos campos para diversas variáveis, deste que estes campos tenham entre si um caracteres definido na variável $IFS (Inter Field Separator).

Já que eu falei no IFS, deixa eu pegar uma carona e mostrar um belo macete. Suponha que você tenha uma variável chamada Frutas que tem o seguinte conteúdo:

$ echo $Frutas
Pera^Uva^Maçã

Para separar rapidamente os campos sem o uso do cut ou de qualquer outro artifício, basta fazer:

$ IFS=^
$ set $Frutas
$ echo $1
Pera
$ echo $2
Uva
$ echo $3
Maçã

Como pudemos ver, quando se usa o set $Frutas, os parâmetros posicionais recebem os campos da variável Frutas, separados pelo IFS, assumindo cada um o seu lugar correspondente à sua colocação na variável.

Ou ainda:

$ set $(echo 10.11.12.13 | tr . ' ')
$ echo $2^$4
11^13

Outro macete irritantemente legal e simples, porém usando o comando read que veremos no capítulo seguinte.

Primeiro caso, com separador de campos que esteja no IFS:

$ read CoisaLinda1 CoisaLinda2 CoisaLinda3 <<< "Marina Neves Biasoli"
$ echo $CoisaLinda1
Marina
$ echo $CoisaLinda2
Neves
$ echo $CoisaLinda3
Biasoli

Segundo caso, com separador de campos que não esteja no IFS:

$ IFS=+ read saudades1 saudades2 saudades3 <<< Hedy+Coutinho+Neves
$ echo $saudades1
Hedy
$ echo $saudades2
Coutinho
$ echo $saudades3
Neves

Usando desta forma, o IFS passou a ser o sinal de mais (+) somente para a execução do read, voltando imediatamente ao conteúdo anterior.

O IFS tem por default  <ESPAÇO>, <TAB>  e  <ENTER> , como o os nomes que vc queria ler estavam separados por  <ESPAÇO>, então tudo resolvido.

PS: um boa parte desta resposta foi copiada da apostila do curso de Shell (via EAD), cujas inscrições estão abertas (somente por mais 8 dias) e o pessoal da lista tem 20% de desconto. Se alguém quiser mais detalhes, me mande um e-mail em privado. O curso tem 5 aulas para tirar dúvidas (ao vivo pela internet) e e-mail, Whats App e/ou Telegram para dúvidas urgentes.

Abraços,
Julio

» Não tem tempo para fazer um curso presencial?
» Na sua cidade não tem nenhum bom curso de Linux?
» Conheça nosso portal educacional e estude conosco: 
»  Treinamento presencial (em 4 sábados) no RJ e BSB 
    em http://bit.ly/cursoshelljulioneves                   



Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.



Em qua, 5 de set de 2018 às 10:28, address@hidden [shell-script] <address@hidden> escreveu:
 

Pessoal, estou muito grato pela ajuda de todos, estou cada vez melhorando no shell e tudo graças a ajuda de vocês.


Mas se me permitem uma ultima dúvida, poderiam me explicar como dunciona esse while (while read Nome1 Resto).

O que eu entendi é que ele vai ler Nome1 e Resto, do arquivo pessoas.txt, mas como ele sabe quem é Nome1 e quem é o Resto, pergunto pois se eu quisese colocar um telefone, como ele saberia quem é telefone?

Desde já muito obrigado pela ajuda.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]