variável não retorna valor [RESOLVIDO]

1. variável não retorna valor [RESOLVIDO]

Diego José Schulz
schulzdiegoj

(usa Ubuntu)

Enviado em 28/08/2010 - 18:00h

estou com um problema de principiante e não sei o que fazer.
tenho um laço WHILE em um script e dentro deste laço declaro uma variável contador que é incrementada.
depois do fim do laço eu preciso imprimir a variável contador para saber quantas vezes o laço se repetiu. porém quando faço echo "$contador" a variável está vazia.
Já verifiquei que antes do comando DONE (fim do laó WHILE) se eu imprimo a variável ela tem valor.



  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/08/2010 - 22:38h

Wendel, o problema não é onde está sendo declarado a variável e sim o jeito que ele fez esse laço de repetição, olha:

##O jeito que o Diego está fazendo o laço:

#!/bin/sh
var=5
ls -l /etc | while read result
do
var=$((var+1))
done
echo $var

nesse meio que está sendo feito, não importa quantas repetições são feitas, pois ao sair do laço a variavel volta com o seu valor original (antes de modificar dentro do laço)

usando esse tipo de laço de repetição por exemplo:

#!/bin/sh
var=5
for i in /etc/*
do
var=$((var+1))
done
echo $var

você ver que a variavel sai do laço com o resultado obtido dentro do laço.

3. Re: variável não retorna valor [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/08/2010 - 18:27h

seria melhor você mostrar o script para podemos ver aonde está o problema.


4. Re: variável não retorna valor [RESOLVIDO]

Diego José Schulz
schulzdiegoj

(usa Ubuntu)

Enviado em 28/08/2010 - 19:21h

#!/bin/sh

#Imprime mensagem incial;
echo "\n######################################################################"
echo "Listagem de arquivos \> que 4000 bytes no diretório /etc\n"

#Imprime cabeçalho da lista que será gerada;
printf "%-30s%6s%1s%-8s%-8s%10s\n" "Nome" " Tamanho" " " "Dono" "Grupo" "Data"
printf "%-30s%6s%1s%-8s%-8s%10s\n" "------------------------------" " ------" " " " --------" "----------" "----------"

totalarqmaior=0
totalarqmenor=0
# Inicia Laço de Repetição listando através do comando [ls -l], o conteúdo do diretório /etc realizando um laço de repetição linha a linha gravando resultado na Variavel "resultLS";
ls -l /etc | while read resultLS
do

#Coleta valores listados e armazena nas variáveis definidas abaixo:
nome=$(echo $resultLS |cut -d" " -f8)
tamanho=$(echo $resultLS |cut -d" " -f5)
dono=$(echo $resultLS |cut -d" " -f3)
grupo=$(echo $resultLS |cut -d" " -f4)
data=$(echo $resultLS |cut -d" " -f6)

#if [$tamanho is null]; then - entender como verifica se a variavel esta vazia
if [ $tamanho -gt 4000 ]; then
printf "%-30s%6s%1s%-8s%-8s%10s\n" $nome $tamanho " " $dono $grupo $data
totalarqmaior=$((totalarqmaior+1))
else
totalarqmenor=$((totalarqmenor+1))
fi
done
#Imprime na tela mensagem com o número de arquivos listados:
echo "Total de Arquivos > 4000 bytes que foram listados: $totalarqmaior"

#Imprime na tela mensagem com o número de arquivos menores que 4000 que não foram listados:
echo "Total de Arquivos <= 4000 bytes que não foram listados: $totalarqmenor"
echo "######################################################################\n"
#Fim do laço de repetição


5. Re: variável não retorna valor [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/08/2010 - 19:31h

não tentei o script, mas muitas veses o problema com variaveis pode se resolver com aspas " "

tenta assim

=====================================

#!/bin/sh

#Imprime mensagem incial;
echo "\n######################################################################"
echo "Listagem de arquivos \> que 4000 bytes no diretório /etc\n"

#Imprime cabeçalho da lista que será gerada;
printf "%-30s%6s%1s%-8s%-8s%10s\n" "Nome" " Tamanho" " " "Dono" "Grupo" "Data"
printf "%-30s%6s%1s%-8s%-8s%10s\n" "------------------------------" " ------" " " " --------" "----------" "----------"

totalarqmaior=0
totalarqmenor=0
# Inicia Laço de Repetição listando através do comando [ls -l], o conteúdo do diretório /etc realizando um laço de repetição linha a linha gravando resultado na Variavel "resultLS";
ls -l /etc | while read resultLS
do

#Coleta valores listados e armazena nas variáveis definidas abaixo:
nome="$(echo $resultLS |cut -d" " -f8)"
tamanho="$(echo $resultLS |cut -d" " -f5)"
dono="$(echo $resultLS |cut -d" " -f3)"
grupo="$(echo $resultLS |cut -d" " -f4)"
data="$(echo $resultLS |cut -d" " -f6)"

#if [ $tamanho is null ]; then - entender como verifica se a variavel esta vazia
if [ "$tamanho" -gt 4000 ]; then
printf "%-30s%6s%1s%-8s%-8s%10s\n" "$nome" "$tamanho" " " "$dono" "$grupo" "$data"
totalarqmaior="$((totalarqmaior+1))"
else
totalarqmenor="$((totalarqmenor+1))"
fi
done
#Imprime na tela mensagem com o número de arquivos listados:
echo "Total de Arquivos > 4000 bytes que foram listados: $totalarqmaior"

#Imprime na tela mensagem com o número de arquivos menores que 4000 que não foram listados:
echo "Total de Arquivos <= 4000 bytes que não foram listados: $totalarqmenor"
echo "######################################################################\n"
#Fim do laço de repetição

===========================================


6. Re: variável não retorna valor [RESOLVIDO]

Diego José Schulz
schulzdiegoj

(usa Ubuntu)

Enviado em 28/08/2010 - 20:03h

mesmo problema. criei um outro script com um WHILE também e verifiquei o valor da variável interna não é acessível fora do laço. o que será que pode ser?


7. Re: variável não retorna valor [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/08/2010 - 21:39h

o problema está nesse meio de laço de repetição que você está usando:

ls -l /etc | while read resultLS

tudo que é armazenado em qualquer variavel dentro nesse laço, é perdido ao terminar o laço.


8. Re: variável não retorna valor [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/08/2010 - 22:07h

Como o amigo acima disse, se declarar a variável no laço ao fim do mesmo essa variável é extinta, e portanto tudo o que ela está armazenando. Declare a variável antes do loop.


9. Re: variável não retorna valor [RESOLVIDO]

Diego José Schulz
schulzdiegoj

(usa Ubuntu)

Enviado em 29/08/2010 - 23:40h

Perfeito Cesar.funcionou legal agora. Pelo que eu entendi e nunca tinah visto isso antes em nenhum manual, o WHILE tem esta caracteristica de zerar as variaveis usadas fora do laco. Ja o FOR nao.
falow. resolvido o problema.


10. Re: variável não retorna valor [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 30/08/2010 - 00:07h

Diego, se você conseguiu resolver, ótimo. Só pra corrigir uma coisa que você disse:

"...o WHILE tem esta caracteristica de zerar as variaveis usadas fora do laço. Já o FOR nao."

Como eu tinha dito antes, o problema na variável não era do WHILE, e sim o jeito que você usava ele após do pipeline "|". Um exemplo bem simples pra ver como funciona ok.

#!/bin/bash
x=5
while [ $x -ne 10 ]
do
x=$[x+1]
done
echo $x



11. SOLUÇÃO

Perfil removido
removido

(usa Nenhuma)

Enviado em 30/08/2010 - 14:54h

#!/bin/sh

#Imprime mensagem incial;
echo "\n######################################################################"
echo "Listagem de arquivos \> que 4000 bytes no diretório /etc\n"

#Imprime cabeçalho da lista que será gerada;
printf "%-30s%6s%1s%-8s%-8s%10s\n" "Nome" " Tamanho" " " "Dono" "Grupo" "Data"
printf "%-30s%6s%1s%-8s%-8s%10s\n" "------------------------------" " ------" " " " --------" "----------" "----------"

totalarqmaior=0
totalarqmenor=0
# Inicia Laço de Repetição listando através do comando [ls -l], o conteúdo do diretório /etc realizando um laço de repetição linha a linha gravando resultado na Variavel "resultLS";
ls -l /etc > .LS
while read resultLS
do

#Coleta valores listados e armazena nas variáveis definidas abaixo:
nome=$(echo $resultLS |cut -d" " -f8)
tamanho=$(echo $resultLS |cut -d" " -f5)
dono=$(echo $resultLS |cut -d" " -f3)
grupo=$(echo $resultLS |cut -d" " -f4)
data=$(echo $resultLS |cut -d" " -f6)

#if [$tamanho is null]; then - entender como verifica se a variavel esta vazia
if [ $tamanho -gt 4000 ]; then
printf "%-30s%6s%1s%-8s%-8s%10s\n" $nome $tamanho " " $dono $grupo $data
totalarqmaior=$((totalarqmaior+1))
else
totalarqmenor=$((totalarqmenor+1))
fi
done < .LS
rm .LS
#Imprime na tela mensagem com o número de arquivos listados:
echo "Total de Arquivos > 4000 bytes que foram listados: $totalarqmaior"

#Imprime na tela mensagem com o número de arquivos menores que 4000 que não foram listados:
echo "Total de Arquivos <= 4000 bytes que não foram listados: $totalarqmenor"
echo "######################################################################\n"
#Fim do laço de repetição


12. Re: variável não retorna valor [RESOLVIDO]

Benedito Ramos
diramos

(usa Debian)

Enviado em 17/06/2013 - 19:48h


Cezar.
Valeu muito pela sua explicação sobre em que lugar declarar a variável contadora.
Eu penava há dias com esse problema.
Valeu!

Diramos

$ x=5
while [ $x -ne 10 ]
do
x=$[x+1]
done
$ echo $x
10






01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts