[Ubuntu-PT 8482] Re: Duvida bash: array
Paulo J. S. Pinhal
paulojspinhal gmail.com
Sexta-Feira, 4 de Fevereiro de 2011 - 21:19:33 UTC
Em 04-02-2011 20:58, Jose Celestino escreveu:
> 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
>>>>
>>>
>>
Eu já corrigi o problema, muito obrigado pela ajuda.
ah! E achei preferível estudar mais aprofundadamente bash do que andar a
fazer as coisas sem ter as noções básicas da linguagem.
mais uma vez, muito agradecido pela disponibilidade.
um abraço
Mais informações acerca da lista ubuntu-pt