[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