De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Julio Cezar Neves
Data de Publicação: 05 de setembro de 2018
Um lembrete, as inscrições para o curso Programação Shell Linux já estão abertas. Aproveite esta última oportunidade para estudar ainda em 2018 com o Prof. Julio Neves.
O Shell possui uma variável que é muito útil, que é o separador de campos e
chama-se $IFS
, cujo valor padrão é <ESPAÇO>
, <TAB>
e <ENTER>
,
ou seja o Shell sempre usa esses valores como os separadores entre os campos,
mas essa variável pode ser alterada de forma a te ajudar na elaboração
de scripts.
Este comando lê campos separados pelo conteúdo de $IFS. Veja isso:
$ read Nome Sobrenome <<< "Eva Dias" $ echo $Nome:::$Sobrenome Eva:::Dias $ read Nome Sobrenome <<< "Sara Dores da Costa" $ echo $Nome:::$Sobrenome Sara:::Dores da Costa
Ou seja, a variável $Nome
recebeu o primeiro pedaço e $Sobrenome
recebeu o resto. Então vamos gerar (passo a passo para ficar fácil de
entender) um arquivo que tenha cada todas as letras do alfabeto e que cada
uma de suas linhas tenha 5 letras:
$ echo {A..Z} A B C D E F G H I J K L M N O P Q R S T U V W X Y Z $ echo {A..Z} | xargs -n5 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z $ echo {A..Z} | xargs -n5 > letras
Note que o comando xargs
sempre tentará trabalhar com o maior número de
parâmetros possíveis, mas sua opção -n 5
limita-o a 5 palavras de cada vez.
E agora vamos ler esse arquivo e listá-lo, separando cada letra por um hífen
(-
):
$ while read L1 L2 L3 L4 L5 # Leio 5 campos de cada vez
> do
> echo $L1-$L2-$L3-$L4-$L5
> done < letras
A-B-C-D-E
F-G-H-I-J
K-L-M-N-O
P-Q-R-S-T
U-V-W-X-Y
Z----
Como você viu, o script funcionou. Vamos agora mudar a entrada, separando
as letras por dois pontos (:
):
$ sed -i 's/ /:/g' letras $ cat letras A:B:C:D:E F:G:H:I:J K:L:M:N:O P:Q:R:S:T U:V:W:X:Y Z $ while IFS=: read L1 L2 L3 L4 L5 > do > echo $L1-$L2-$L3-$L4-$L5 > done < letras A-B-C-D-E F-G-H-I-J K-L-M-N-O P-Q-R-S-T U-V-W-X-Y Z----
A única coisa necessária a fazer tocar, antes da leitura, o valor de $IFS
para dois pontos (:
). É muito importante que se diga, que feito desta forma,
o valos de $IFS
permanecerá imutável para o resto do script, e valerá dois
pontos somente durante a execução deste read
.
Isso acontece com outras variáveis do sistema associadas a comandos.
Suponha que você precisa saber quem está "logado" há mais de um dia. Para
tal você deve excluir (com grep -v
) todos as saídas do comando who
que tenham a data de hoje. O meu problema é que a minha data esta sendo
gerada em inglês e o meu who
em pt_BR.
$ date
Mon Sep 3 15:21:28 -03 2018
Para conseguir isso basta alterar a variável $LANG
somente durante a
execução do comando date
. Veja:
$ LANG=pt_BR.UTF-8 date
Seg Set 3 15:30:08 -03 2018
Desta forma, a linguagem (indicada pela variável $LANG
) foi alterada somente
para a execução do comando date
.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários