[Ubuntu-PT 8477] Re: Duvida bash: array

Paulo J. S. Pinhal paulojspinhal gmail.com
Segunda-Feira, 31 de Janeiro de 2011 - 23:46:34 UTC


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 ú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
>>
>
>




Mais informações acerca da lista ubuntu-pt