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

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

Re: [shell-script] Re: Ler linha com espaços no início


From: Julio C. Neves
Subject: Re: [shell-script] Re: Ler linha com espaços no início
Date: Tue, 13 Nov 2012 16:19:50 -0200

Fala Elder,
isso que vc falou eu sei e está no meu livro, o problema são os brancos no
início. Eles não podiam ser ignorados... Se o IFS for diferente, os cpos
vazios não são ignorados. Veja:

$ read a b <<< '1 2'
$ echo $a
1
$ echo $b
2
$ IFS=: read a b <<< '1:2'
$ echo $a
1
$ echo $b
2

Até aqui tudo bem, mas agora vou tirar o 1, mas deixando o IFS (branco ou :)

$ read a b <<< ' 2'
$ echo $a
2
$ echo $b

Nesta última, $a deveria ser vazia e $b deveria ser 2. Vou repetir, porém
usando : como IFS.

$ IFS=: read a b <<< ':2'
$ echo $a

$ echo $b
2
Agora funcionou como deveria: $a vazia e $b = 2


Mas veja:
$ echo "$IFS" | hexdump
0000000 0920 0a0a
Onde:
09 - <TAB>
20 - Espaço (32 em decimal)
0a - <ENTER> (10 em decimal)

Isso significa que o IFS padrão é espaço, <TAB> e <ENTER>. Vamos então
testar com <TAB> como separador:
$ read a b <<< '    2'
$ echo $a
2
$ echo $b

$
Ou seja, a mesma zebra do espaço em branco. Testei com <ENTER> só por
desencargo de consciência, pois já sabia que a zebra seria a mesma:
$ read a b <<< $(echo -e '1\n2')
$ echo $a
1
$ echo $b
2
$ read a b <<< $(echo -e '\n2')
$ echo $a
2
$ echo $b

$


Abcs,
Julio

*
*



Em 13 de novembro de 2012 13:08, Elder Marco <address@hidden>escreveu:

> **
>
>
> 2012/11/12 Julio C. Neves <address@hidden>:
> > Eu tinha tanta certeza do que falava, que nem testei. Qdo vi o site que
> > postaram aqui na lista e que falava sobre o read, fiz uma massa de
> testes e
> > vi que realmente ele capa os espaços iniciais e finais (isso é bug!). Já
> > fiz uma anotação para colocar na próxima impressão do meu livro.
> >
>
> Júlio,
>
> Aparentemente os desenvolvedores do bash estão cientes disso. Lendo
> com mais atenção
> a ajuda do comando read, notei que este comando não lê exatamente uma
> linha --- como eu
> esperava ---, mas sim as palavras nesta, atribuindo as variáveis
> correspondentes.
> Para saber onde começa e onde acaba uma palavra, os comando read considera
> como
> delimitadores aquilo que está presente na variável IFS. Veja:
>
> Read a line from the standard input and split it into fields.
>
> Reads a single line from the standard input, or from file descriptor FD
> if the -u option is supplied. The line is split into fields as with word
> splitting, and the first word is assigned to the first NAME, the second
> word to the second NAME, and so on, with any leftover words assigned to
> the last NAME. Only the characters found in $IFS are recognized as word
> delimiters.
>
> Dessa maneira, se o comportamento padrão do comando read fosse
> alterado, ele poderia
> gerar resultados inesperados. Talvez fosse uma boa ideia -- eu acho --
> existir algum builtin
> que lesse a linha por completo, sem remover nenhum caractere dela. Ou
> ainda, existir
> alguma opção para este comando que mudasse esse comportamento. Mas mesmo
> não existindo, setar o IFS como sendo '' já resolve o problema.
>
> --
> Elder Marco
>
> GNU/Linux User: #471180
>
> "Contra o positivismo, que pára perante os fenômenos e diz: 'Há apenas
> fatos', eu digo: 'Ao contrário, fatos é o que não há; há apenas
> interpretações'. "(Nietzsche)
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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