shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Problema com nome de variável


From: Julio C. Neves
Subject: Re: [shell-script] Problema com nome de variável
Date: Mon, 30 Dec 2013 17:20:38 +0000

Vc usa um par de parênteses desnecessários envolvendo o seu loop. Para o Shell, parênteses servem para criar um sub-shell (veja seu uso aqui). Qdo esse subshell morre, leva junto com ele todas as alterações feitas no ambiente.

Mais algumas observações:
Veja essa linha:
PROGRESSO=$(echo "(${CONTADOR}*100)/${LOOP}" | bc)
1 - Evite usar variáveis em letras maiúsculas. Todas as variáveis do sistema são em letras maiúsculas e pode ser que vc use uma sem se tocar e este é um erro muito chato de ser descoberto (já vi isso ocorrer diversas vezes);
2 - O uso de chaves para abraçar variáveis é desnecessário, dificulta a leitura e torna a interpretação mais lenta;
3 - Procure sempre usar o que o Bash te dá, isso otimiza e muito o seu prg. Troque o bc pela aritmética do Shell. Eu faria essa linha assim:
Progresso=$((Contador*100)/Loop))
Só para vc ter uma ideia, faça um loop 200 vezes com a sua linha e com a minha, só para medir tempo. Coie e cole esses 2 blocos e compare os tempos

time for ((Contador=1; Contador < 200; Contador++))
{
PROGRESSO=$(echo "(${CONTADOR}*100)/${LOOP}" | bc)
}

time for ((Contador=1; Contador < 200; Contador++))
{
Progresso=$((Contador*100)/Loop))
}

Tem muito mais coisa que pode ser melhorado inclusive se eu fosse vc, trocaria o zenity pelo yad e usaria a opção --multi-progress, com uma barra para progresso de cada arquivo e outra para o progresso total. A sintaxe é a mesma, mas vc pode identificar para qual barra vc está mandando os echo (de progresso e de #texto)



Abcs,
Julio
@juliobash
Facebook!? Not even if a cow coughs...
;)

Posso dar treinamento Shell em qualquer parte do país.
Me mande um e-mail para saber detalhes ou
echo 618921594007727281449002107776021103258914797578P | dc



Em 30 de dezembro de 2013 16:35, eduardo_a_s_amaral <address@hidden> escreveu:
 

Olá Pessoal!
Como vão?

Estou tendo um problema um tanto quanto esquisito num trecho do meu script.
Não sei porque não consigo pegar o valor de uma variável.
Vou tentar decrever oque este trecho faz:
A ideia aqui é enviar uma sequencia de imagens via SCP, vou enviar uma a uma e informar o progresso através o zenity. Entretanto, quero verificar se houve algum erro e, dependendo disso, parar a operação, informando a mensagem correspondente.
Segue o trecho de código:

#Variável RETORNO_SCP utilizada para verificar se houve erros durante a transferência via SCP
RETORNO_SCP=0

# Variável LOOP, verifica a quantidade de arquivos que serão enviados e é usada no LOOP
LOOP=$(ls -ltr ${DIR}/arquivos/*.png 2> /dev/null | wc -l )

if [ ${LOOP} -gt 0 ]
then
(
for CONTADOR in $( seq 0 ${LOOP})
do
PROGRESSO=$(echo "(${CONTADOR}*100)/${LOOP}" | bc)
echo "# Enviando ${CAMADA_LOOP}.\n${CONTADOR} de ${LOOP}, ${PROGRESSO}% concluído."
sleep 0.1
scp -P${PORTA_SSH} ${DIR}/arquivos/*.png ${USER}@${IP_CLIENTE}:${DIR}/arquivos/ &> /dev/null
#Esta é a variável (RETORNO_SCP) que vai verificar se houve algum erro durante o envio. Aqui eu consigo manuseá-la sem nenhum problema
RETORNO_SCP=$(expr ${RETORNO_SCP} + $?)
#Aqui funciona!!
if [ ${RETORNO_SCP} -eq 5 ]
then
zenity --error --title="Lintv3D - ${CLIENTE}" --text="Erro ao enviar ${CAMADA_LOOP}"
break;
fi

done) | zenity --progress --auto-close --auto-kill --percentage=0 --width=230 --height=100 --title="Lintv3D - ${CLIENTE}"


#Verifica se o usuário escolheu a opção Fechar/Cancelar. A variável $RETORNO, guarda o código de saída do último processo e a passa para uma função que exibe uma mensagem correspondente. Oque quero é verificar se houve algum erro e alterar o valor desta variável, deixando igual à $RETORNO_SCP, mas o problema é que a variável $RETORNO_SCP não tem valor nenhum aqui, mesmo que o valor tenha sido configurado no laço mais acima.
RETORNO=$?
#Aqui a variável $RETORNO_SCP não tem mais o valor com o qual foi configurada na laço for anterior
case ${RETORNO_SCP} in
5)
RETORNO=1
esac
Verif_Status ${RETORNO}

else
(zenity --error \
--window-icon="error" \
--title="${CLIENTE}" \
--text="\"${PRODUTO}\" não encontrado.")
return 1;
fi

Basicamente é isto, deu pra entender a ideia ou compliquei muito?

Desde já, obrigado pela atenção!



reply via email to

[Prev in Thread] Current Thread [Next in Thread]