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

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

Re: Configurando o ESC


From: xiss_break
Subject: Re: Configurando o ESC
Date: Tue, 15 May 2007 14:12:06 -0000
User-agent: eGroups-EW/0.82

Olá pessoal, 

Ainda não tive como fazer os testes devido problemas que estou tendo
aqui na empresa, mas logo que conseguir estarei postando o codigo
completo pra criticas e susgestões. Agradeço a todos, ao professor
Julio. Alias.. Se eu não estivesse na Bahia (sou baiano mas ate o
correio aqui é bem estilo local) o seu otimo livro ja estaria aqui e
com certeza algumas das duvidas que tenho, não existiriam. 

Abraço a todos e logo estarei de volta com o script.

--- Em address@hidden, "Julio C. Neves"
<julio.neves@...> escreveu
>
> 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 <xiss_break@...> 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]