Erro num shellscript [RESOLVIDO]

13. Re: Erro num shellscript [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 10/06/2008 - 06:07h

Bem grj_rj, precisava ver com mais cuidado o que realmente ocorre e onde ocorre, tente analisar usando o debug do bash, ou seja, coloque logo no início do seu script o comando 'set -xv'.

Abaixo está exatamente onde dá o erro, e o que o set -xv mostra; mas vale a pena uma análise mais detalhada, vou ver se consigo ver isso ainda hoje, embora não possa dar certeza.

+ sleep 1
+ '[' 08 = 09 ']'
+ (( i++ ))
nn.sh: line 5: ((: 08: value too great for base (error token is "08")


  


14. Re: Erro num shellscript [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 10/06/2008 - 08:22h

Bem, enquanto matava aula na faculdade testei o que acontecia, e aparentemente descobri.

Quando fazemos echo $((08+1)) ele dá o erro:

usuarios@dell:~$ echo $((08+1))
bash: 08: value too great for base (error token is "08")

Porém se fazemos:

usuarios@dell:~$ VAR=07
usuarios@dell:~$ echo $VAR
07
usuarios@dell:~$ echo $((VAR++))
7
usuarios@dell:~$ echo $((VAR++))
usuarios@dell:~$ echo $VAR
8

O bash elimina o 0 e não dá o erro, acho que agora ficou mais claro.


15. Vlw, povo!

Gilson Júnio Pacheco Silva
GilsonDeElt

(usa Nenhuma)

Enviado em 10/06/2008 - 12:26h

O problema do script extrator já foi resolvido, mas essa discussão tá sendo muito boa, e útil para os 'scripteiros de plantão' ^^

'Xô vê se entendi:se uso 'i', 'j', ou qualquer outra dessas letras em minúsculo, eu tô usando varáveis internas do Bash, e só uso variáveis externas quando crio uma palavra, como 'VAR' ou 'caminho'??

e vlw pela explicação, grj_rj
já achei até uma aplicação pra ela, no meu próximo renomeador de arquivos em lote


16. Re: Erro num shellscript [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 10/06/2008 - 18:41h

GilsonElt me sinto satisfeito em ter ajudado

thuck vê se é isso:

Quando utilizo 0 antes do número o bash entende que o valor é octa-decimal, até ai, tinha entendido.

Porém a conclusão que cheguei é que o bash não faz cálculo em octa, ele transforma o valor para decima (ou binário), calcula em decimal (ou binário) e apresenta o valor em decimal.

Por isso que 07++ não dava 010 como esperava e sim 8. Então 08++ dá erro não ao incrementar, mas sim antes, ao converter o valor de octa para decimal.

Pois:
~$ echo $((08+1))
-bash: 08: value too great for base (error token is "08")

~$ echo $((07+1))
8

~$ echo $((017+011))
24

já que
~$ echo $((017))
15

~$ echo $((011))
9

Estava me confundindo pelo fato de estar acostumado com operação de um determinado tipo, ou base retornar um valor do mesmo tipo, ou base usado no cálculo.


17. Re: Erro num shellscript [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 10/06/2008 - 22:00h

Sim, o bash converte para inteiro, e isso deixa as coisas meio confusas...

Outro coisa que vale resaltar é que o bash também faz isso para hexa:

thuck@thuck:~$ echo $((0x1+1))
2
thuck@thuck:~$ echo $((0xf+1))
16



18. Re: Erro num shellscript [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 11/06/2008 - 11:01h

Só uma curiosidade,

falamos em octa, decimal e hexa. Há como manipular binário ?

011 --> octa
11 --> decimal
0x11 --> hexa
?11 --> binário


19. Up!

Gilson Júnio Pacheco Silva
GilsonDeElt

(usa Nenhuma)

Enviado em 11/06/2008 - 13:37h

Faço minha a dúvida do grj_rj:
dá pra manipular binário no bash

pq lá no cefet, a gente manipula binários em assembly, mas usando números decimais e potências de 2.
Ex.: se quero testar o bit 0 (menos significativo) da porta 1 do MSP, uso:
BIT.B #1, P1IN (supondo porta 1 como entrada)
se quero testar o bit 1, uso:
BIT.B #2, P1IN
se quero o terceiro bit (bit 2), uso:
BIT.B #4, P1IN
e se quiser acessar todos 3 juntos, uso:
BIT.B #7, P1IN
(lembre-se que 4+2+1 = 7)

usar "jogo da velha" no bash não funcionou:
root@darkstar:~# echo $((#1))
-bash: #1: syntax error: operand expected (error token is "#1")

e outra curiosidade:
não é obrigatório usar dois parêntesis.
Assim como na matemática a ordem é "parênteses", "colchetes" e "chaves",
e na minha calculadora científica uso parênteses por não ter colchetes, podemos usar simplesmente colchetes.

root@darkstar:~# echo $((0xAB))
171

root@darkstar:~# echo $[0xAB]
171

poupa certo tempo ao digitar, pelo menos =D


mas com chaves não funcionou:

root@darkstar:~# echo ${0xAB}
-bash: ${0xAB}: bad substitution



20. Achei!

Gilson Júnio Pacheco Silva
GilsonDeElt

(usa Nenhuma)

Enviado em 11/06/2008 - 14:09h

Resolvi fuçar na net, e achei um link muito bom, que é esse:
http://www.linuxfocus.org/Portugues/September2001/article216.shtml

Mas ele não fala se é possível representar em binário.

Mas este, aqui do VOL mesmo, fala que sim (testado e aprovado =D):
http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=6035&pagina=2

Se o link quebrar, procure no VOL por "Recursos avançados do bash que você não aprende na escola".

Legal! Agora posso ser um eletrônico mais feliz ainda no bash, brincando com binário =D


21. Corrigindo...

Gilson Júnio Pacheco Silva
GilsonDeElt

(usa Nenhuma)

Enviado em 11/06/2008 - 14:13h

não é sempre que se pode substituir ((qualquer-coisa)) por [qualquer-coisa], mas nos exemplos citados funciona.

Alguém se candidata a explicar?


22. Re: Erro num shellscript [RESOLVIDO]

dead cow
deadcow

(usa Arch Linux)

Enviado em 08/02/2009 - 19:56h

e porque nao usar o seq?

[deadcow@mosdef ~]$ seq -w 10
01
02
03
04
05
06
07
08
09
10
[deadcow@mosdef ~]$



23. Re: Erro num shellscript [RESOLVIDO]

Papainoel
Papainoel2005

(usa Outra)

Enviado em 31/10/2011 - 16:17h

thuck escreveu:

Bem, enquanto matava aula na faculdade testei o que acontecia, e aparentemente descobri.

Quando fazemos echo $((08+1)) ele dá o erro:

usuarios@dell:~$ echo $((08+1))
bash: 08: value too great for base (error token is "08")

Porém se fazemos:

usuarios@dell:~$ VAR=07
usuarios@dell:~$ echo $VAR
07
usuarios@dell:~$ echo $((VAR++))
7
usuarios@dell:~$ echo $((VAR++))
usuarios@dell:~$ echo $VAR
8

O bash elimina o 0 e não dá o erro, acho que agora ficou mais claro.

__________________________________________________________________

Uma boa solução é fazer a variável passar pelo bc para garantir que ele seja interpretado como decimal.
ex:

usuarios@dell:~$ export b=`echo 08` # supondo que b=08 ou outro algarismo precedido de zero...

usuarios@dell:~$ export b=`echo $b | bc` # transformamos b em decimal
usuarios@dell:~$ echo $b # mostramos b (em decimal)
usuarios@dell:~$ ((b=b+1))
usuarios@dell:~$ echo $b # mostramos b (em decimal) + 1
8
9









01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts