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 [email protected], "Julio C. Neves" <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> escreveu: > > > > --- Em [email protected]<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 > > [email protected] <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 > > > > [email protected] <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] >
