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

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

Re: [shell-script] Re: Dúvida com read


From: Sidney Souza
Subject: Re: [shell-script] Re: Dúvida com read
Date: Sat, 13 Sep 2014 17:36:08 -0300

Prezado Diógenes Vargas de Bittencourt,

Encontrei algumas coisas que podiam ser melhoradas no seu script e coloquei abaixo,
caso tenha alguma duvida basta perguntar.

Primeiro ajuste.

JAMAIS armazene em arquivos dados que você não irá utilizar em uma posterior execução
do seu script. Quando você armazena esses dados além de deixar o script mais lendo, pois
ficará dependente do disco nas leituras e escritas, você ainda terá problemas com permissões
de arquivos, portanto é melhor deixar o conteúdo em uma variável.

PING1=$( $PING $ENDER1 -c $QTDEMSG )
PING2=$( $PING $ENDER2 -c $QTDEMSG )

Segundo ajuste.

O comando read possui um parametro que você pode usar para imprimir uma mensagem na
tela tornando o uso do echo desnecessário. Veja abaixo.

Isso
echo "Insira o primeiro endereco para verificacao: "; read ENDER1;

Vira isso
read -p "Insira o primeiro endereco para verificacao: " ENDER1


Terceiro ajuste.

Com o uso da função Menu você estava realizando muitas chamadas recursivas e isso poderia
gerar problemas em alguma ocasião para você, sendo assim modifiquei a estrutura para utilizar
um loop infinito de forma que conseguisse obter o mesmo resultado.

Quarto ajuste.

Atente para a indentação do seu código.
Escrever um código bem indentado é tão importante quanto fazer um código funcional.


=========================== código =================================
#!/usr/bin/env bash

#variaveis (parte 1)

QTDEMSG="0"

#codigo
clear
echo ""
read -p "Insira o primeiro endereco para verificacao: " ENDER1
read -p "Insira o segundo endereco para verificacao: " ENDER2;
read -p "Quantas mensagens ICMP enviadas? " QTDEMSG;

echo 'Processando...'
PING1=$(ping $ENDER1 -c $QTDEMSG)
PING2=$(ping $ENDER2 -c $QTDEMSG)
echo 'Processamento concluído.'

#variaveis (parte 2)
PCTENV1=`echo -e "$PING1" |grep packets |awk '{print $1}'`
PCTENV2=`echo -e "$PING2" |grep packets |awk '{print $1}'`
PCTRCV1=`echo -e "$PING1" |grep received |awk '{print $4}'`
PCTRCV2=`echo -e "$PING2" |grep received |awk '{print $4}'`
PCTLOSS1=`echo -e "$PING1" |grep loss |awk '{print $6}' |awk -F'%' '{print $1}'`
PCTLOSS2=`echo -e "$PING2" |grep loss |awk '{print $6}' |awk -F'%' '{print $1}'`
RTT1=`echo -e "$PING1" |grep rtt |awk '{print $4}' |awk -F'/' '{print $1}' |awk -F'.' '{print $1}'`
RTT2=`echo -e "$PING2" |grep rtt |awk '{print $4}' |awk -F'/' '{print $1}' |awk -F'.' '{print $1}'`

while true; do

    clear
    echo ""
    echo "1 - A quantidade de pacotes enviados"
    echo "2 - A quantidade de pacotes recebidos"
    echo "3 - Menor perda percentual"
    echo "4 - Menor tempo de RTT"
    echo "5 - Sair"
    echo -e "Escolha uma das opcoes: \c"

    read OPCAO

    case $OPCAO in

        1)
            echo "====================================================="
            echo "Segue abaixo pacotes enviados: "
            echo "$ENDER1 teve $PCTENV1 pacotes enviados"
            echo "$ENDER2 teve $PCTENV2 pacotes enviados"
            echo "====================================================="
        ;;

        2)
            echo "====================================================="
            echo "Segue abaixo pacotes recebidos: "
            echo "$ENDER1 teve $PCTRCV1 pacotes recebidos"
            echo "$ENDER2 teve $PCTRCV2 pacotes recebidos"
            echo "====================================================="
        ;;

        3)
            if [ $PCTLOSS1 -le $PCTLOSS2 ]; then
                echo ""
                echo "O % de perda do $ENDER1 de $PCTLOSS1% eh menor que o do $ENDER2 que eh $PCTLOSS2%!"
                echo ""
            else
                echo ""
                echo "O % de perda do $ENDER2 de $PCTLOSS2% eh menor que o do $ENDER1 que eh $PCTLOSS1%!"
                echo ""
            fi
        ;;

        4)
            if [ $RTT1 -le $RTT2 ]; then
                echo ""
                echo "O RTT $RTT1 do $ENDER1 eh menor que o do $ENDER2 que eh $RTT2!"
                echo ""
            else
                echo ""
                echo "O RTT $RTT2 do $ENDER2 eh menor que o do $ENDER1 que eh $RTT1!"
                echo ""
            fi
        ;;

        5)
            exit 0           
            unset $ENDER1 $ENDER2 $QTDEMSG
        ;;

        *)
            echo "Opcao invalida"
            unset $ENDER1 $ENDER2 $QTDEMSG
        ;;

    esac

done

Atenciosamente:

Sidney Souza

2014-09-13 9:50 GMT-03:00 "Fábio R. Medeiros" address@hidden [shell-script] <address@hidden>:
 

Como sugestão, para o código ficar mais limpo, ao invés de variáveis, vc poderia usar funções.

E uma dica, cuidado para não usar variáveis com nome de variáveis do sistema (variáveis de ambiente) ou comandos. P.ex. vc usou PING, ok, está em maiuscula, é diferente, etc... Eu costumo usar nesses casos PATH_TO_PING, mas é apenas uma dica.

Abç,

Fábio




On 13-09-2014 09:35, address@hidden [shell-script] wrote:
 
Parte das variáveis dependem da execução do comando antes e da forma como está pega o resultado do comando anterior, então tente essa nova estrutura:

#variaveis (parte 1)

ENDER1="0"

ENDER2="0"

QTDEMSG="0"

PING="/bin/ping"

ARQEND1="saida1_tarefa6"

ARQEND2="saida2_tarefa6"


#codigo

clear

echo ""

echo -n "Insira o primeiro endereco para verificacao: "; read ENDER1;

echo -n "Insira o segundo endereco para verificacao: "; read ENDER2;

echo -n "Quantas mensagens ICMP enviadas? "; read QTDEMSG;

$PING $ENDER1 > $ARQEND1 -c $QTDEMSG

$PING $ENDER2 > $ARQEND2 -c $QTDEMSG


#variaveis (parte 2)
PCTENV1=`cat saida1_tarefa6 |grep packets |awk '{print $1}'`

PCTENV2=`cat saida2_tarefa6 |grep packets |awk '{print $1}'`

PCTRCV1=`cat saida1_tarefa6 |grep received |awk '{print $4}'`

PCTRCV2=`cat saida2_tarefa6 |grep received |awk '{print $4}'`

PCTLOSS1=`cat saida1_tarefa6 |grep loss |awk '{print $6}' |awk -F'%' '{print $1}'`

PCTLOSS2=`cat saida2_tarefa6 |grep loss |awk '{print $6}' |awk -F'%' '{print $1}'`

RTT1=`cat saida1_tarefa6 |grep rtt |awk '{print $4}' |awk -F'/' '{print $1}' |awk -F'.' '{print $1}'`

RTT2=`cat saida2_tarefa6 |grep rtt |awk '{print $4}' |awk -F'/' '{print $1}' |awk -F'.' '{print $1}'`



[]'s
Itamar



reply via email to

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