[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] logica
From: |
opa |
Subject: |
Re: [shell-script] logica |
Date: |
Wed, 02 Jun 2004 11:08:49 -0300 hrN |
Acredito que o problema do Eric está resolvido faz tempo, mas achei
interessante compartilhar isto.
O Felipe me lembrou que o comportamento, às vezes inesperado, do
echo quando o parâmetro não recebe aspas ou apóstrofos, pode aqui
ser aplicado.
echo $(</tmp/valores)|tr ' ' +|bc
echo $(($(echo $(</tmp/valores)|tr ' ' +)))
Nas duas linhas acima o póprio echo converte os "\n" em " ", eliminando os " "
duplicados e aquele ao final da linha, dispensando o zero complementear.
Inclusive experimentei, não sabia, o tr pode fazer substituições e limitar a um
o número de bytes adjacentes idênticos, simultaneamente. Ou seja, meu
comentário anterior, com um "tr -s" adicional, esqueçam, o tr pode fazer tudo
numa única chamada:
$ echo "1 2 3 4 "|tr " " +
1+2+++++3++4+
$ echo "1 2 3 4 "|tr -s " " +
1+2+3+4+
Até me empolguei e dei uma espiada no man, por alto. Acho que numa única
chamada pode fazer muito mais coisas.
E mais, notei que o tratamento matemático do shell tolera "+" sem operando,
ou seja não é preciso tirar as sequências ++++. :)
Infelizmente isso não se verifica ao final. :(
$ echo $((2++++++++2))
4
$ echo $((2++++++++2+))
bash: 2++++++++2+: syntax error: operand expected (error token is "+")
Mas como isto é shell, outro shell pode ter comportamento distinto.
Quanto já aprendi com esta simples questão colocada. :)
Viva o maravilhoso mundo "u"!
------------------------------------------------------------------
>From: Felipe Kellermann <address@hidden>
>Date: Tue, 1 Jun 2004 19:19:24 -0300 (BRT)
>
>Em zsh, para um arquivo (linhas em branco de propósito):
>
>% < val
>1
>2
>
>3
>
>
>4
>%
>
>
>Tu pode substituir, por exemplo:
>
>% echo ${(j:+:)$(<val)}
>1+2+3+4
>%
>
>
>Depois é só `(e)valuate' esse resultado, que poderia ser uma substituição
>direta nessa expressão
>
>--
>Felipe Kellermann