Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Artigo

Explorando a entrada de dados com READ em Bash Shell
Linux user
rai3mb
11/10/2011
Mostro algumas opções úteis no comando read que podem ajudar na hora de escrever certas funcionalidades nos scripts em Bash Shell, algumas me ajudaram recentemente.
Por: Raimundo Alves Portela | Blog: http://portela.tendalinux.com
[ Hits: 3528 ]
Conceito: 10.0   4 voto(s)4 voto(s)4 voto(s)4 voto(s)4 voto(s) + quero dar nota ao artigo

Usando as opções do read

Recentemente precisei manipular um pouco a entrada de dados em Bash Shell, obtendo o que o usuário digitar no console e fazendo alguns tratamentos. Em minhas pesquisas vi que o comando read tem várias opções que ajudam nessa tarefa.

Estou há uns meses aprendendo aos poucos sobre shell e ainda não tinha visto muito material usando essas opções do read, talvez por não haver a necessidade, ou porque para aprender mais sobre ele não basta "man read", e sim consultar diretamente o manual do bash quem tem mais de 3 mil linhas.

Então resolvi escrever esse material para ajudar a mostrar como estender o read.

O uso padrão, quem escreve scripts em shell já conhece:

read VARIAVEL

Que segue uma sintaxe comum a outras linguagens (por exemplo a Pascal).

Então vamos ver algumas opções que estendem os poderes do read.

I/O (imprimindo e lendo valores) ao mesmo tempo

read -p 'TEXTO' VARIAVEL

A opção -p originalmente mostra uma mensagem na saída de erro padrão, se você não estiver redirecionando essa saída para o vácuo (/dev/null) ou para nenhum outro lugar, será apresentada na tela do console normalmente.

Exemplo:

#!/bin/bash read -p "Digite seu email : " EMAIL echo "$EMAIL" | egrep -q '\w+@\w+\.\w+' # validando [ "$?" -eq 0 ] && echo 'email aceito!' || echo -e '\033[31;1memail inválido\033[m'

Obs.: Não há quebra de linha após o uso do read -p.

Lendo diretamente para um array

read -a ARRAY

Os valores digitados, separados pelo caractere padrão espaço (definido em IFS), são atribuídos ao array informado, nesse caso ARRAY.

Exemplo:

#!/bin/bash IFS=';' # alterando o separador padrão read -a FRUTAS -p "Digite as frutas que você gosta (separadas por ';' ponto e virgula) : " # verificando se algum favor foi fornecido [ ! "${FRUTAS[0]}" ] && echo -e '\033[31;1mNenhum valor fornecido\033[m' && exit echo "Primeira fruta informada: ${FRUTAS[0]}" # mostrando o primeiro item do array echo "Quantidade de frutas informadas ${#FRUTAS[@]}" # mostrando a quantidade de valores do array echo "Todas as frutas informadas: ${FRUTAS[@]}" # mostrando todos os elementos do array

Obs.: Se quisermos alterar o separador padrão basta modificar o conteúdo de IFS.

Encerrando a leitura ao digitar determinado caractere

read -d CHAR

Você pode usar a opção -d para informar um delimitador (terminador) para o read, sendo que ele será encerrado quando esse caractere for digitado, encerrando a leitura até o caractere anteriormente informado.

Exemplo:

#!/bin/bash # A entrada de dados é encerrada ao digitar a interrogação '?' read -p "Digite sua pergunta? : " -d'?' PERGUNTA echo echo "$PERGUNTA"

Você pode inclusive digitar ENTER e mesmo assim o read não será encerrado (CTRL+C é covardia, ele faz parte do bash e vai encerrar).

Próxima página >>




Páginas do artigo
   1. Usando as opções do read
   2. Mais opções e conclusão

Outros artigos deste autor

Leitura recomendada

Comentários
[1] Comentário enviado por ask4n em 11/10/2011 - 15:10h:

Muito bom!
Vai me ajudar bastante nos meus estudos!
Valeu!

[2] Comentário enviado por ember em 12/10/2011 - 20:18h:

haha legal cara, isso pode ser usado em C neh?
so mto novo em linux e em programacao, mas minha esperanca era usar isso read -d'w' com um timeout, tem como?
essa leitura pode ser colhida numa variavel em um prog c? dae nao precisa usar a getch do ncurses ne? ncurses nao ta funfando...
EDIT: agora q vi a parte 2 foi mal... mas como implemento em c? da?

[3] Comentário enviado por rai3mb em 13/10/2011 - 01:58h:

Ola @ember
... mas minha esperanca era usar isso read -d'w' com um timeout, tem como?
Tem você pode juntar os diversos parâmetros para alcançar seu objetivo, veja:

read -p 'Digite algo em 5 segundos : (w - para sair)' -t 5 -d'w'

...essa leitura pode ser colhida numa variavel em um prog c?

Acho que não, não conheço muito ainda de C, mas fiz um teste com a função system e não deu certo:

#include <stdio.h>
#include <strings.h>
#include <stdlib.h>

int main(int argc, char **argv) {
system("read -t 5'");
}

Usando o parâmetro da erro:

read: 1: Illegal option -t







Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.