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ável

Exemplo:

#!/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"
done

Outro uso comum é ler um arquivo linha por linha:

#!/bin/bash
while read linha; do
    echo "Linha: $linha"
done < arquivo.txt

O 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"
done

Nesse 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 -t para evitar que o script fique esperando indefinidamente.
  • Ao ler senhas, use -s e lembre-se de limpar a variável após o uso (ex.: unset senha).
  • Em loops, evite usar cat para ler arquivos; prefira redirecionamento direto.

Referências

Exercícios

  1. 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!"
  2. 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"
  3. 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."
    fi
  4. Escreva 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.txt

  5. Crie 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