[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