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

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

Re: [shell-script] Re: Configurando o ESC


From: Julio C. Neves
Subject: Re: [shell-script] Re: Configurando o ESC
Date: Tue, 15 May 2007 10:41:18 -0300

Cara o problema eu já havia dito. Para encerrar uma leitura vc precisa de um
<ENTER>, um <ESC> não é o suficiente. Por isso, tive de fazer uma falsa
leitura de somente um caractere para ver se era um <ESC>, não sendo, eu
leria o resto do IP para outra variável e concatenaria as duas.

O problema é que se o operador errar o primeiro algarismo do endereço IP,
não podrá corrigir pois a sua leitura já terminou. Para fazer isso direito
(e eu já fiz isso uma vez mas não sei por onde anda) seria necessário vc
fazer um loop de leitura onde vc identificasse cada tecla. Algo mais ou
menos assim (sem teste):

fim=
IP=
tput sc
while read -sn1 n
do
    case $(cat -vet <<< $n) in
        [0-9.]$) echo -n $n
                 IP=$P$n     ;;
            ^[$) fim=1
                 break       ;;
              $) break       ;;
            ^H$) IP=${IP%?}
                 tput rc
                 echo -n $IP ;;
              *) continue    ;;
    esac
done

O código é mais ou menos esse. Considerei válidos somente números e ponto,
<ESC>, <ENTER> e <backspace>. Para considerar outras teclas (como as setas
p. ex.) o grau de dificuldade aumenta exponencialmente.

Obs: 1 - tput sc salva a posição do cursor e tput rc restaura-a (não deixe
de ver
http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo007#O_comando_tput
)
     2 - A linha IP=${IP%?}, mata o caractere mais à direita de $IP (não
deixe de ver
http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo009#Expans%E3o_de_par%E2metros
)
     3 - Setei a variável $fim para saber fora do loop se a saída foi por um
<ESC>
     4 - Para entender o cat -vet veja Um dica do pinguim colocada em
http://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarPapo005#Primeira_sintaxe_do_comando_for
     5 - Veja os detalhes de here strings (<<<) em
https://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarBirinaite#Here_Strings(lá
tb tem um exemplo com cat -vet

Abraços,
Julio
:wq



Em 14/05/07, xiss_break <address@hidden> escreveu:
>
>   --- Em address@hidden<shell-script%40yahoogrupos.com.br>,
> "Julio C. Neves"
> <julio.neves@...> escreveu
>
> >
> > Cara,
> > isso que vc está fazendo não é uma boa em shell. O ideal seria vc
> ter um:
> >
> > read -sn1 -p "Tecle algo para prosseguir ou <ESC> para sair: "
> > if [ "^[$" == "$(cat -vet <<< $REPLY)" ]
> > then
> > Avisar
> > fi
> > read -p "Informe IP: " IP
> > case ...
> >
> > Para dar uma marretada e aproveitar o que vc fez (desaconselhável),
> faça:
> >
> > echo -n "Informe o IP do cliente: "
> > read -sn1 -p "Informe o IP do cliente: " IP
> > if [ "^[$" == "$(cat -vet <<< $IP)" ]
> > then
> > Avisar
> > fi
> > echo -n $IP
> > read RestoIP
> > IP=$IP$RestoIP
> > case ...
> >
> > O problema desta forma é que se o cara digitar o 1o. algarismo
> errado, ele
> > não poderá consertá-lo.
> >
> > Abraços,
> > Julio
> > :wq
> >
> >
> > Em 14/05/07, xiss_break <xiss_break@...> escreveu:
> > >
> > > --- Em
> address@hidden <shell-script%40yahoogrupos.com.br>
> <shell-script%40yahoogrupos.com.br>,
> > > "Flavio Junior" <billpp@>
> > > escreveu
> > > >
> > > > Veja bem, VAR foi o nome que EU usei pra variavel, não
> obrigatoriamente.
> > > > No seu caso a variavel é "ip"
> > > >
> > > > Vou tentar adaptar seu script aqui no corpo do e-mail:
> > > >
> > > > echo -n "Informe o IP do cliente: "
> > > > read -n1 -s IP
> > > > if [ "^[$" == "$(cat -vet <<< $IP)" ]
> > > > then
> > > > Avisar
> > > > fi
> > > > case $IP in
> > > > [a-z] | [A-Z] ) echo "Formato ip Invalido!"; sleep 1; DelAviso
> > > > ;;
> > > >
> > > > [0-9]*\.[0-9]*\.[0-9]*\.[0-9][0-9][0-9] )
> > > > x=1
> > > > while [ "$x" -le 4 ];
> > > > do
> > > > Q1=`echo "${IP}" | cut -f"${x}" -d.`;
> > > > if [ "$Q1" -gt 255 ];
> > > > then
> > > > echo "O valor $Q1 não é válido!";
> > > > sleep 1
> > > > DelAviso
> > > > fi;
> > > > x=$((x+1));
> > > > done;
> > > > ;;
> > > >
> > > > * ) echo "Formato ip invalido!"; sleep 1; DelAviso
> > > > esac
> > > >
> > > > ARQ=/usr/local/squid/etc/aviso.txt
> > > > if [ ! -f "$ARQ" ]
> > > > then
> > > > touch /usr/local/squid/etc/aviso.txt
> > > > else
> > > > if [ ! -w "$ARQ" ]
> > > > then
> > > > echo "Arquivo sem Permissão para gravar!"
> > > > else
> > > > sed -e '$a\' -e "${IP}" "${ARQ}" > /tmp/arq
> > > > mv /tmp/arq "${ARQ}"
> > > > fi
> > > > sleep 1
> > > > Avisar
> > > > fi
> > > > }
> > > >
> > > > Testa ai..
> > > >
> > > > Flavio do Carmo Junior
> > > >
> > > > On 5/14/07, xiss_break <xiss_break@> wrote:
> > > > >
> > > > > --- Em
> > > address@hidden 
> > > <shell-script%40yahoogrupos.com.br><shell-script%40yahoogrupos.
> com.br>
> > > <shell-script%40yahoogrupos.com.br>,
> > > > > "Flavio Junior" <billpp@>
> > > > > escreveu
> > > > > >
> > > > > > A dica não é minha, a algum tempo atras alguem respondeu
> essa mesma
> > > > > duvida
> > > > > > aqui na lista
> > > > > >
> > > > > > a ideia é a seguinte:
> > > > > > -bash-3.1$ read -n1 -s VAR
> > > > > > <ESC>
> > > > > > -bash-3.1$ if [ "^[$" == "$(cat -vet <<< $VAR)" ]; then echo
> APERTOU
> > > > > ESC;
> > > > > > else echo BALH BALH BLAH; fi
> > > > > > APERTOU ESC
> > > > > > -bash-3.1$
> > > > > >
> > > > > > Pra ficar mais claro, quando voce atribui o valor de <ESC>
> (apertar
> > > > > a tecla
> > > > > > ESC) a uma variavel, o caracter q ela pega é ^[$, com o cat -vet
> > > a gente
> > > > > > consegue ver isso e comparar com o literal ^[$ q escrevemos, se
> > > > > forem iguais
> > > > > > então ele apertou esc.
> > > > > >
> > > > > > Agora pro teu problema é só fazer um entra lido sai lido que
> > > resolve.
> > > > > >
> > > > > > Sorte,
> > > > > >
> > > > > >
> > > > > > Flavio do Carmo Junior
> > > > > >
> > > > > >
> > > > > > On 5/14/07, xiss_break <xiss_break@> wrote:
> > > > > > >
> > > > > > > Olá pessoal,
> > > > > > >
> > > > > > > Estou tentando fazer um programa em shell, sendo este o meu
> > > primeiro
> > > > > > > programa. Esta funcionando de forma perfeita, mas algumas
> > > > > > > funcionalidades estão me tirando do serio, a principal
> delas é a
> > > > > seguinte:
> > > > > > >
> > > > > > > Tem uma tela que o usuario tem de informar um numero de
> > > codigo, mas
> > > > > > > gostaria que quando o usuario em uma possivel desistência,
> pudesse
> > > > > > > usar o ESC para retornar a tela anterior.
> > > > > > >
> > > > > > > Isso é possivel?
> > > > > > >
> > > > > > > Grato a todos!
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > > [As partes desta mensagem que não continham texto foram
> removidas]
> > > > > >
> > > > >
> > > > > Olá Flavio..
> > > > >
> > > > > Agradeço imensamente sua resposta.
> > > > > Coloquei de um geito muito tosco no script apenas para testar se
> > > > > funcionava de fato. Mas agora não estou conseguindo inserir este
> > > > > controle no contexto do script ja existente. Veja abaixo o que
> tenho.
> > > > >
> > > > > echo -n "Informe o IP do cliente: "
> > > > > read -n1 -s VAR ip
> > > > > if [ "^[$" == "$(cat -vet <<< $VAR)" ]
> > > > > then
> > > > > Avisar
> > > > > fi
> > > > > case $ip in
> > > > > [a-z] | [A-Z] ) echo "Formato ip Invalido!"; sleep 1; DelAviso
> > > > > ;;
> > > > >
> > > > > [0-9]*\.[0-9]*\.[0-9]*\.[0-9][0-9][0-9] )
> > > > > x=1
> > > > > while [ "$x" -le 4 ];
> > > > > do
> > > > > Q1=`echo "${ip}" | cut -f"${x}" -d.`;
> > > > > if [ "$Q1" -gt 255 ];
> > > > > then
> > > > > echo "O valor $Q1 não é válido!";
> > > > > sleep 1
> > > > > DelAviso
> > > > > fi;
> > > > > x=$((x+1));
> > > > > done;
> > > > > ;;
> > > > >
> > > > > * ) echo "Formato ip invalido!"; sleep 1; DelAviso
> > > > > esac
> > > > >
> > > > > ARQ=/usr/local/squid/etc/aviso.txt
> > > > > if [ ! -f "$ARQ" ]
> > > > > then
> > > > > touch /usr/local/squid/etc/aviso.txt
> > > > > else
> > > > > if [ ! -w "$ARQ" ]
> > > > > then
> > > > > echo "Arquivo sem Permissão para gravar!"
> > > > > else
> > > > > sed -e '$a\' -e "${ip}" "${ARQ}" > /tmp/arq
> > > > > mv /tmp/arq "${ARQ}"
> > > > > fi
> > > > > sleep 1
> > > > > Avisar
> > > > > fi
> > > > > }
> > > > >
> > > > > Veja que inserir sua sugestao na interacao do read, mas assim
> ele fica
> > > > > com alguns bugs...preciso encontrar um geito de inseri-lo nessa
> > > > > intreção com o restante do script.
> > > > >
> > > > > Agradeço a todos que ajudarem.
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > >
> > > Olá Flavio.
> > >
> > > Tentei usar conforme sua modificação, funciona, mas tem um problema
> > > quando eu acesso a primeira vez esse menu o ESC funciona, mas apos
> > > fazer o primeiro cadastro de ip ele não funciona mais...quando clico
> > > no ESC ele escreve ^[ no prompt.
> > >
> > > Acho que tenho de fazer mais modificaçoes no script, mas não estou
> > > encontrando o ponto de partida.
> > >
> > > Abraços
> > >
> > >
> > >
> >
> >
> >
> > --
> > Abraços,
> > Julio
> > http://www.julioneves.com - Um livro sobre Bash completo e on-line
> > :wq
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> Olá Julio,
>
> Vou fazer uns testes com base no que voce demonstrou pra ver ate onde
> consigo melhorar. Mas se nao for incomodo voce poderia me esclarecer
> onde esta o pecado em fazer dessa forma?
>
> Se conseguir finalizar esse primeiro passo, pretendo partir para algo
> maior e não seria boa coisa levar essa pratica ruim.
>
> Abraços...
>
>  
>



-- 
Abraços,
Julio
http://www.julioneves.com - Um livro sobre Bash completo e on-line
:wq


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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