[Ubuntu-PT 8481] Re: Duvida bash: array
Jose Celestino
japc co.sapo.pt
Sexta-Feira, 4 de Fevereiro de 2011 - 20:58:50 UTC
On Seg, 2011-01-31 at 23:46 +0000, Paulo J. S. Pinhal wrote:
> Muito boa noite.
> Antes de mais gostaria de lhe agradecer pela sua pronta ajuda.
> Analisei a página que me recomendou, mas mesmo assim não consegui
> resolver o problema como pretendia: "exportar; variáveis.
A solucao esta' la': "Use ProcessSubstitution (BASH only)".
ou seja, o script abaixo fica qualquer coisa como
#!/bin/bash
#
tficheiro="*.avi" #tipo de ficheiro seleccionado
n=0 #incremento
ti=0 #tamanho individual dos ficheiros
tt=0 #tamanho total dos ficheiros
while read linha; do
nome_ficheiro[$n]=$linha
ti=$(stat -c%s "$linha")
tamanho_ficheiro[$n]=$ti
tt=$(($tt+$ti))
((n++))
done < <(ls $tficheiro)
for i in $(seq 0 $[n-1]) ; do
echo "Tamanho de "${nome_ficheiro[$i]}" é "${tamanho_ficheiro[$i]}
done
> A única forma que vislumbrei para solucionar o problema foi escrever os
> nomes dos ficheiros lidos num ficheiro e lê-lo posteriormente (ainda
> estou muito cru nestas artes), tal como apresento abaixo:
>
> #!/bin/bash
>
> tficheiro="*.flv"; #tipo de ficheiro seleccionado
> faux="file.tmp"; #ficheiro auxiliar, escrita dos nomes dos
> ficheiros
> nome_ficheiro[0]=""; #matriz com os nomes dos ficheiros;
> elemento 0: n.º files no directório
> tamanho_ficheiro[0]=0; #matriz com os tamanhos dos ficheiros;
> elemento 0: espaço total ocupado (bytes)
>
> cria_ficheiro_auxiliar(){
> [ -e $faux ] && rm $faux;
> } #cria_ficheiro_aux()
>
>
> le_nome_ficheiros() {
> cria_ficheiro_auxiliar;
> ls $tficheiro | #lê o nome de todos os avi e guarda-os
> em $faux
> while read; do
> echo $REPLY >> $faux;
> done
> }
>
> preenche_matrizes(){
> local n=0; #incremento
> local ti=0; #tamanho individual dos ficheiros
> local tt=0; #tamanho total dos ficheiros
> while read linha; do
> n=$((n+1));
> nome_ficheiro[$n]=$linha;
> ti=$(stat -c%s "$linha");
> tamanho_ficheiro[$n]=$ti;
> tt=$(($tt+$ti));
> done < file.tmp;
> nome_ficheiro[0]=$n; #n.º files no directório
> tamanho_ficheiro[0]=$tt; #espaço total ocupado (bytes)
> rm $faux
> }
>
> apresenta_resultados(){
> for i in $(seq 1 ${nome_ficheiro[0]})
> do
> echo -n "Tamanho de "
> echo -n ${nome_ficheiro[$i]}
> echo -n " é "
> echo ${tamanho_ficheiro[$i]}
> done
> echo
> echo "Total de bytes: "${tamanho_ficheiro[0]}
> }
>
> clear;
> le_nome_ficheiros;
> preenche_matrizes;
> apresenta_resultados;
>
> Mais uma vez, muito obrigado.
> Um abraço.
>
> Em 29-01-2011 09:45, Luiz Gustavo Agostinho escreveu:
> > Seu código esta correto, o que acontece é que é criado um Sub-shell.
> >
> > Tipo uma função com variáveis locais ( Em C por exemplo)
> >
> > Dê uma olhada neste link: http://mywiki.wooledge.org/BashFAQ/024
> >
> > <http://mywiki.wooledge.org/BashFAQ/024>Abraço
> >
> > Em 28 de janeiro de 2011 23:21, Paulo J. S. Pinhal
> > <paulojspinhal gmail.com>escreveu:
> >
> >> construi uma pequena rotina, para inserir nome de ficheiros (neste caso
> >> avi) num array, conforme código abaixo:
> >>
> >> n=0 #valores iniciais
> >> array[1]=10 #apenas para conferir que são alteradas
> >> array[2]=20 #ciclo while done
> >> array[3]=30
> >>
> >> ls *.avi |
> >> while read; do
> >> n=$((n+1));
> >> array[$n]=$REPLY
> >> echo $n" / "${array[n]}
> >> done
> >>
> >> echo $n
> >> for i in $(seq 1 3) #existem apenas 3 files
> >> do
> >> echo -n "array[$i] = "; echo ${array[$i]}
> >> done
> >>
> >> acontecem situações que não entendo: não consigo ter acesso (fora do ciclo
> >> while..end) às variáveis "n" e array[n]. o que acontece é que após aquele
> >> ciclo as variáveis indicadas retomam os valores iniciais.
> >>
> >> como posso ter acesso aos valores atribuidos dentro do ciclo while..done?
> >> os meus conhecimentos de bash são muito limitados. alguém me pode ajudar?
> >>
> >> desde já os meus agradecimentos.
> >>
> >> --
> >> ubuntu-pt mailing list
> >> ubuntu-pt lists.ubuntu.com
> >> https://lists.ubuntu.com/mailman/listinfo/ubuntu-pt
> >>
> >
> >
>
>
--
Jose Celestino | http://japc.uncovering.org/files/japc-pgpkey.asc
----------------------------------------------------------------
"Assumption is the Mother of Screw-Up" -- Mr. John Elwood Hale
Mais informações acerca da lista ubuntu-pt