Lendo entrada do usuário
Nesta aula, você aprenderá a ler entrada do usuário em scripts Bash usando o comando read, incluindo o uso de prompts com -p, captura de múltiplas variáveis e leitura em loop. Tudo com exemplos práticos para automatizar interações.
Interagir com o usuário é uma habilidade essencial para criar scripts Bash dinâmicos e úteis. O comando read permite capturar dados fornecidos pelo usuário via teclado, armazenando-os em variáveis para uso posterior no script. Nesta aula, exploraremos desde o uso básico até técnicas avançadas, como prompts personalizados, múltiplas variáveis e loops de leitura, com exemplos práticos para consolidar o aprendizado.
Dominar a leitura de entrada é fundamental para automatizar tarefas que exigem decisões baseadas em informações fornecidas pelo usuário, como nomes de arquivos, opções de configuração ou respostas a perguntas. Vamos começar!
read
O comando read é a ferramenta padrão para ler uma linha da entrada padrão (geralmente o teclado) e atribuí-la a uma ou mais variáveis. Sua sintaxe básica é:
read [opções] variável1 [variável2 ...]Se nenhuma variável for especificada, a entrada é armazenada na variável padrão REPLY. O comando lê até encontrar uma nova linha (Enter) ou até que o número de campos seja suficiente para preencher as variáveis, dividindo a linha em palavras usando o separador interno de campo (IFS).
Exemplo simples:
#!/bin/bash
echo "Digite seu nome:"
read nome
echo "Olá, $nome!"Neste script, o usuário vê a mensagem "Digite seu nome:", digita algo e pressiona Enter. O valor digitado é armazenado na variável nome e depois exibido.
Prompt (-p)
A opção -p permite exibir um prompt personalizado antes da leitura, eliminando a necessidade de um echo separado. A sintaxe é:
read -p "Mensagem" variávelExemplo:
#!/bin/bash
read -p "Digite sua idade: " idade
echo "Você tem $idade anos."Note o espaço após o prompt para separar visualmente a entrada. O prompt é exibido no terminal e o cursor aguarda a digitação.
Outras opções úteis incluem -s (silencioso, para senhas), -t (timeout em segundos) e -n (número de caracteres a ler). Exemplo com senha:
read -s -p "Senha: " senha
echo
echo "Senha cadastrada."O echo vazio após read -s é necessário para pular uma linha, já que o prompt não inclui quebra de linha automaticamente.
Múltiplas variáveis
O comando read pode atribuir palavras da entrada a múltiplas variáveis. Se a linha contiver mais palavras que variáveis, o restante é atribuído à última variável. Se houver menos palavras, as variáveis restantes ficam vazias.
Exemplo:
#!/bin/bash
read -p "Digite nome, idade e cidade: " nome idade cidade
echo "Nome: $nome"
echo "Idade: $idade"
echo "Cidade: $cidade"Se o usuário digitar "João 30 São Paulo", as variáveis serão preenchidas corretamente. Se digitar apenas "João", idade e cidade ficarão vazias.
Para capturar uma linha inteira em uma única variável (incluindo espaços), use a variável REPLY ou uma única variável. Exemplo:
read -p "Digite uma frase: " frase
echo "Frase: $frase"Isso funciona porque a linha inteira é atribuída a frase, já que há apenas uma variável.
read em loop
Combinar read com loops é uma técnica poderosa para processar múltiplas entradas ou ler arquivos linha por linha. O loop while é o mais comum.
Exemplo: ler entradas até que o usuário digite "sair":
#!/bin/bash
while true; do
read -p "Digite algo ('sair' para encerrar): " entrada
if [[ "$entrada" == "sair" ]]; then
echo "Encerrando..."
break
fi
echo "Você digitou: $entrada"
doneOutro uso comum é ler um arquivo linha por linha:
#!/bin/bash
while read linha; do
echo "Linha: $linha"
done < arquivo.txtO redirecionamento < arquivo.txt fornece o conteúdo do arquivo como entrada para o loop. É importante usar while read em vez de for para preservar espaços e caracteres especiais.
Para processar saída de comandos, use pipe ou substituição de processo:
ls -1 | while read arquivo; do
echo "Arquivo: $arquivo"
doneNesse caso, cada linha da saída de ls -1 é lida e processada.
Boas práticas
- Sempre use aspas duplas ao expandir variáveis lidas para evitar problemas com espaços e caracteres especiais.
- Defina um timeout com
-tpara evitar que o script fique esperando indefinidamente. - Ao ler senhas, use
-se lembre-se de limpar a variável após o uso (ex.:unset senha). - Em loops, evite usar
catpara ler arquivos; prefira redirecionamento direto.
Referências
- Documentação oficial Bash: read
- Bash Beginners Guide: read
- Bash FAQ: How to read a file line by line?
- Shell Scripting Tutorial: read
- Stack Overflow: Looping through file content in Bash
Exercícios
Escreva um script que pergunta o nome do usuário e imprime uma saudação personalizada. Use
read -p.✓ Resposta:#!/bin/bash read -p "Digite seu nome: " nome echo "Olá, $nome!"Crie um script que leia três números (em uma única linha) e calcule a soma. Use múltiplas variáveis.
✓ Resposta:#!/bin/bash read -p "Digite três números separados por espaço: " a b c soma=$((a + b + c)) echo "Soma: $soma"Faça um script que leia uma senha (modo silencioso) e a confirme. Se as senhas coincidirem, exiba "Senha confirmada".
✓ Resposta:#!/bin/bash read -s -p "Digite a senha: " senha1 echo read -s -p "Confirme a senha: " senha2 echo if [[ "$senha1" == "$senha2" ]]; then echo "Senha confirmada." else echo "Senhas não coincidem." fiEscreva um script que leia um arquivo linha por linha e exiba o número de cada linha e seu conteúdo. Use
while read.✓ Resposta:#!/bin/bash contador=1 while read linha; do echo "Linha $contador: $linha" ((contador++)) done < "$1"Uso:
./script arquivo.txtCrie um loop que pergunta ao usuário se deseja continuar (s/n) e repete até que a resposta seja 'n' ou 'N'.
✓ Resposta:#!/bin/bash while true; do read -p "Deseja continuar? (s/n): " resposta case "$resposta" in [nN]) echo "Encerrando..."; break ;; [sS]) echo "Continuando..." ;; *) echo "Resposta inválida. Digite s ou n." ;; esac done