Erro num shellscript [RESOLVIDO]

1. Erro num shellscript [RESOLVIDO]

Gilson Júnio Pacheco Silva
GilsonDeElt

(usa Nenhuma)

Enviado em 03/06/2008 - 14:41h

Boa tarde a todos.

Meu colega me mandou por e-mail as apostilas de sistemas microprocessados que o professor nos passou, e ele mandou as apostilas por capítulo, totalizando 15 pacotes .rar.

Abri o Konqueror, selecionei os 15, cliquei com o botão direito, e selecionei extrair aqui.
O Konqueror abriu um monte de janelinhas do extrator do do Ark, com aquela barra de progresso, mas no fim só extraiu dois pacotes.

Eu poderia extrair os pacotes um a um, mas resolvi fazer um script para resolver isso.

Feito o script, ele começa bem seu funcionamento, mas ao chegar ao 8º arquivo, dá o seguinte erro:

./all-extractor: line 18: ((: 08: value too great for base (error token is "08")

Eu não sei como resolver este problema, aí vim cá pedir ajuda.
Desde já agradeço a ajuda!

Ah!, e aqui está o código-fonte do script:

#!/bin/bash
#
# Extrator de arquivos em lote
# Baseado no meu renomeador de arquivos em lote (change-name), que é
# baseado num dos "scripts de teste" copiados de um
# artigo do VOL enquanto estou aprendendo ShellScript
#
# Gilson Júnio <gilsondeelt@oi.com.br>
# 03-06-2008, às 13:59
#
# ChangeLog:
# 03-06-2008 - Editado o meu script "change-name" para criar este
# - "Lançada" a versão 0.1 deste script, com o nome de 'all-extract'
# - Adicionado o 'clear' inicial e a mensagem "Extração completa!"
# - Corrigido o erro de não considerar os números iniciados com zero, como "01"

clear
for((i=01; i <= 15; i++));
do
if [ $i -ge 10 ]; then # Este 'if' é para diferenciar os números de
i=$i # 01 a 09 dos de 10 em diante...
else
i=0$i # Esta linha transforma os números de 1 a 9 em
# 01 a 09, para extrair os arquivos corretamente
fi
echo "Extraindo arquivo Capítulo$i.rar" # Mensagem de arquivo sendo extraído
echo ""
unrar x Capítulo$i.rar # este comando extrai o arquivo, criando uma pasta
# com o nome do mesmo
sleep 1 # Espera um segundo

if [ $i = 09 ]; then # Este 'if olha se o valor de 'i' é 09
i=9 # Se sim, torna i=9, para não atrapalhar o
fi # restante do script
done
echo "Extração completa!" # Fim de jogo!



  


2. Recolocando o fonte...

Gilson Júnio Pacheco Silva
GilsonDeElt

(usa Nenhuma)

Enviado em 03/06/2008 - 14:47h

O que colei acima ficou embolado...
Aí coloquei de novo aqui embaixo...

#!/bin/bash
clear
for((i=01; i <= 15; i++));
do
if [ $i -ge 10 ]; then
i=$i
else
i=0$i
fi
echo "Extraindo arquivo Capítulo$i.rar"
echo ""
unrar x Capítulo$i.rar
sleep 1

if [ $i = 09 ]; then
i=9
fi
done
echo "Extração completa!"
# Fim de jogo!




3. Re: Erro num shellscript [RESOLVIDO]

Lame Duck
lame_duck_hat

(usa Outra)

Enviado em 04/06/2008 - 16:55h

O erro está na linha
"i=0$i"
O ideal é não chamar a própria variável no problema.
Eu faria o mesmo script tomando outro caminho, tornando-o bem menor.


#!/bin/bash
#
# Extrator de arquivos em lote
# Baseado no meu renomeador de arquivos em lote (change-name), que é
# baseado num dos "scripts de teste" copiados de um
# artigo do VOL enquanto estou aprendendo ShellScript
#
# Gilson Júnio <gilsondeelt@oi.com.br>
# 03-06-2008, às 13:59
#
# ChangeLog:
# 03-06-2008 - Editado o meu script "change-name" para criar este
# - "Lançada" a versão 0.1 deste script, com o nome de 'all-extract'
# - Adicionado o 'clear' inicial e a mensagem "Extração completa!"
# - Corrigido o erro de não considerar os números iniciados com zero, como "01"

clear
for((i=1; i<= 15; i++));
do


if [ $i -lt 10 ];
then # Se $i for menor que 10 adiciona 0 na frente do número
x="0$i"
else
x=$i
fi


echo "Extraindo arquivo Capítulo$x.rar" # Mensagem de arquivo sendo extraído
echo ""
unrar x Capítulo$x.rar # este comando extrai o arquivo, criando uma pasta com o nome do mesmo
sleep 1 # Espera um segundo

done

echo "Extração completa!" # Fim de jogo!


4. Re: Erro num shellscript [RESOLVIDO]

William Chitto
pintofree

(usa Debian)

Enviado em 04/06/2008 - 17:14h

Muito boa sua iniciativa de sempre tentar resolver as coisas via script, mesmo qnd poderia ser feito na mão. Isso é otimo para praticar e aprender.


5. Re: Erro num shellscript [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 04/06/2008 - 18:12h

Cara o problema é que você esta transformando o i em uma string.

Faz da forma que o lame_duck_hat postou que está correta. Vai funcionar. E mesmo que você não estivesse transformando o i em string. O lame_duck_hat também está correto em dizer que não se deve mexer no contador dentro de um for. Não que seja proibido, mas não se deve fazer isso a não ser que seja muito necessário. Se for para alterar o valor do contador use um while e não for.

De qualque forma, eu faria assim.

#!/bin/bash
clear
for file in `ls *.rar`
do
echo "Extraindo arquivo $file"
unrar x $file
sleep 1
done
echo "Extração completa!"



6. Re: Erro num shellscript [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 04/06/2008 - 19:00h

Bem, como ninguém falou acho bom comentar, o erro:

./all-extractor: line 18: ((: 08: value too great for base (error token is "08")

Ocorre porque quando o shell 'vê' um zero na frente de um número ele pensa que o valor é um octal, sendo assim ele fala que o valor é maior do que a base ou seja 00 à 07.




7. Re: Erro num shellscript [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 05/06/2008 - 10:56h

thuck, saquei o erro, mas não entendi então pq no teste que fiz,

#!/bin/bash
clear
for((i=01; i <= 15; i++));
do
if [ $i -ge 10 ]; then
i=$i
else
i=0$i
fi
echo "Extraindo arquivo Capílo$i.rar"
echo ""
sleep 1

if [ $i = 09 ]; then
i=9
fi
done
echo "Extraç completa!"
# Fim de jogo!

, a saída foi essa.

Extraindo arquivo Capílo01.rar

Extraindo arquivo Capílo02.rar

Extraindo arquivo Capílo03.rar

Extraindo arquivo Capílo04.rar

Extraindo arquivo Capílo05.rar

Extraindo arquivo Capílo06.rar

Extraindo arquivo Capílo07.rar

Extraindo arquivo Capílo08.rar

./ee: line 3: ((: 08: value too great for base (error token is "08")
Extraç completa!

Se ele pensa que i é um octa, quando i = 07 ao incrementar não deveria voltar i=10 e não i = 8 ?

Ou ao se incrementar um octa ele transforma em decimal ?


8. 2¹² = 4 096

Gilson Júnio Pacheco Silva
GilsonDeElt

(usa Nenhuma)

Enviado em 05/06/2008 - 13:05h

Antes de tudo, valeu a todos pela atenção!

lame_duck, o "i=0$i" é para mudar o valor da variável, e realmente não parece ser o ideal, mas funcionou inicialmente...
e como você falou da variável, pensei um pouco e solucionei o problema com uma segunda variável...

grj_rj, nã entendi muito bem a sintaxe de "for file in `ls *.rar`", mas é para ler o resultado do comando?
e realmente essa forma que você usou é mais "compacta" que a minha... ;-)

tem mesmo o lance da base octal, mas não entendi muito bem o pq do erro, mas solucionei o problema com o script assim:


#!/bin/bash
# [...]
# Comentários
# [...]

clear
for((i=01; i <= 15; i++));
do
if [ $i -ge 10 ];then
i=$i
else
j=$i
i=0$i
fi
echo "Extraindo arquivo Capítulo$i.rar"
echo ""
unrar x Capítulo$i.rar
sleep 1
if [ $i -le 09 ]; then
i=$j
fi
done
echo "Extração completa!"



9. Re: Erro num shellscript [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 05/06/2008 - 14:41h

Bem...

O problema do octal com shell é bem conhecido; um exemplo simples é:

thuck@thuck:~$ echo $((10 < 012))
0
thuck@thuck:~$ echo $((10 == 012))
1

Viu... sempre que o shell precisa fazer alguma coisa com o número, e o zero estiver na frente 'pam' octal.



10. Re: Erro num shellscript [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 05/06/2008 - 14:53h

Bem grj_rj; vc não deve confundir interpretar com incrementar, o shell incrementa o número normalmente.

thuck@thuck:/etc/rc0.d$ for((i=01; i <= 15; i++))
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Quando vc declarou i=01, o shell ignora o 0 na frente, mas neste caso, porque é uma expressão interna do bash:

thuck@thuck:/etc/rc0.d$ VAR=01
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
1
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
2
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
3
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
4
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
5
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
6
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
7
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
8
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
9
thuck@thuck:/etc/rc0.d$ echo $((VAR++))
10

Eu sei, é meio confuso hehehe Mas normal; só vc se acostumar.


11. Re: Erro num shellscript [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 10/06/2008 - 01:30h

GilsonElt o "for file in `ls *.rar`" faz o seguinte:

`ls *.rar` executa o ls *.rar. Isso dará um vetor com todos os arquivos .rar existente, então o "for file in" percorre o vetor até não ter mais nenhum valor e a cada laço coloca na variável file o valor da posição atual do vetor.



12. Re: Erro num shellscript [RESOLVIDO]

Geraldo José Ferreira Chagas Júnior
gjr_rj

(usa Debian)

Enviado em 10/06/2008 - 01:31h

thuck até entendi o que você disse, porém o erro está acusando na linha 3, justamente na linha onde o i é incrementado.



  
01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts