Shell Scripting – Comando read: Interagindo com os usuários – Ler dados do teclado e de arquivos – 26
Ler dados com o comando read em Shell Scripting
O comando read é utilizado em Shell Scripting para ler dados de entrada fornecidos pelo usuário. Ele permite capturar valores digitados no terminal e armazená-los em variáveis, tornando os scripts mais dinâmicos e interativos. O read é especialmente útil em scripts que precisam solicitar informações ao usuário e processar essas respostas.
Sintaxe do comando read
A sintaxe básica do read é a seguinte:
read [opções] nome_da_variavel
Onde nome_da_variavel é a variável que armazenará o valor digitado pelo usuário. Vejamos alguns exemplos de como usar esse comando em scripts.
Exemplos básicos de uso do read
1. Ler uma entrada simples
Esse exemplo captura um valor digitado pelo usuário e o armazena em uma variável chamada nome.
#!/bin/bash echo "Digite seu nome:" read nome echo "Olá, $nome!"
Ao executar o script, o usuário verá o prompt para digitar seu nome. O valor será armazenado na variável nome e exibido com a saudação “Olá, <nome>!”.
2. Ler múltiplas variáveis em uma única linha
O comando read pode capturar várias variáveis de uma só vez:
#!/bin/bash echo "Digite seu primeiro nome e seu sobrenome:" read nome sobrenome echo "Olá, $nome $sobrenome!"
Se o usuário digitar “Isaac Newton”, a variável nome armazenará “Isaac” e sobrenome armazenará “Newton”. Agora, o que acontece se o nome digitado for “Sir Isaac Newton”?
Neste caso, temos três palavras, e duas variáveis para armazená-las. O que cada variável irá receber?
O comportamento do read aqui será o seguinte: a variável $nome recebe a primeira palavra, “Sir”. A segunda (e última variável), $sobrenome, recebe o restante do texto digitado após a primeira entrada – ou seja, “Isaac Newton”.
Isso ocorre porque o comando read atribui as palavras da entrada às variáveis na ordem em que são listadas, considerando os espaços em branco como separadores de palavras.
Porém, se a entrada tiver mais palavras do que variáveis especificadas, a última variável definida recebe todas as palavras restantes, incluindo espaços.
Opções úteis do comando read
O read oferece algumas opções que tornam o uso mais flexível:
- -p: Exibe uma mensagem de prompt diretamente na linha do read.
- -s: Oculta a entrada, útil para digitar senhas.
- -t: Define um tempo limite para a entrada.
- -n: Limita o número de caracteres que o usuário pode digitar.
- -a: Armazena a entrada como uma matriz (array).
Vejamos alguns exemplos do comando read com essas opções.
Exemplos de uso com opções
Exemplo 1: Usar -p para exibir uma mensagem de prompt
A opção -p exibe uma mensagem diretamente no comando read, tornando o script mais limpo. Além disso, mantém o prompt de entrada na mesma linha da mensagem.
#!/bin/bash read -p "Digite sua idade: " idade echo "Sua idade é $idade anos."
Exemplo 2: Usar a opção -s para ocultar a entrada (como uma senha)
A opção -s é ideal para ocultar a entrada do usuário, comum em solicitações de senha.
#!/bin/bash read -sp "Digite sua senha: " senha echo -e "\nSenha armazenada com segurança." echo "A senha digitada foi $senha."
Exemplo 3: Usar -t para definir um tempo limite
Com a opção -t, podemos definir um tempo limite para a entrada. Neste exemplo, se o usuário não digitar nada em 5 segundos, o comando read continua sem armazenar um valor.
#!/bin/bash read -t 5 -p "Digite seu nome (você tem 5 segundos): " nome if [ -z "$nome" ]; then echo "Tempo esgotado!" else echo "Olá, $nome!" fi
A opção -z dentro do condicional é usada para verificar se a variável $nome está vazia. Se estiver vazia (string com comprimento igual a zero), é retornado o valor true (verdadeiro); caso contrário, é retornado o valor false (falso).
Exemplo 4: Usar -n para limitar o número de caracteres
A opção -n permite limitar o número de caracteres. No exemplo abaixo, o usuário só pode digitar um caractere.
#!/bin/bash read -n 1 -p "Deseja continuar? (s/n): " resposta if [ "$resposta" = "s" ]; then echo -e "\nVamos prosseguir." else echo -e "\n Até mais!." fi
Exemplo 5: Usar -a para armazenar uma entrada em um array
Com a opção -a, o comando read armazena as palavras digitadas em um array, onde cada palavra ocupa uma posição.
No exemplo a seguir, entre com os nomes de três animais e após digitá-los, pressione enter.
#!/bin/bash echo "Digite os nomes de três animais e pressione enter:" read -a animais echo "Animais escohidos: ${animais[0]}, ${animais[1]} e ${animais[2]}"
Ler palavras compostas ou frases com espaços
Se quisermos garantir que o read trate toda a linha como um único valor, podemos ajustar o valor da variável Internal Field Separator (IFS). Desta maneira o read captura tudo como uma única string, ignorando a separação das palavras por espaços.
Vejamos um exemplo.
#!/bin/bash echo "Digite uma frase e pressione enter:" IFS= read -r frase echo "Frase digitada: $frase"
Aqui, o IFS= desativa a separação de palavras pelo espaço, e o -r impede que o read interprete \ como caractere especial.
O Internal Field Separator (IFS) é uma variável especial no Bash que define os delimitadores para a separação de palavras.
Por padrão, o IFS inclui espaço, tabulação e nova linha, o que significa que o Bash usa qualquer um desses caracteres como delimitador para dividir uma entrada em várias partes.
Ao alterar o valor do IFS, podemos controlar como o Bash interpreta e divide as entradas.
Trabalhar com variáveis de ambiente e read
O comando read também pode ser usado para capturar valores e armazená-los em variáveis de ambiente, o que é útil para definir variáveis temporárias no início de um script. Vejamos um exemplo:
#!/bin/bash read -p "Digite o caminho do subdiretório em HOME: " subdiretorio diretorio="$HOME/$subdiretorio" if [ -d "diretorio" ]; then echo "O diretório diretorio existe." else echo "O diretório diretorio não existe." fi
Nesse exemplo, o script usa a variável subdiretorio como entrada para verificar a existência de um diretório dentro da pasta /HOME, acessada a partir da variável de ambiente $HOME, emitindo uma mensagem de acordo no terminal.
Em vez de solicitar um caminho completo, o script solicita apenas o nome do subdiretório dentro do diretório pessoal ($HOME).
O valor completo do caminho é construído concatenando $HOME com o nome do subdiretório fornecido pelo usuário.
Na sequência, temos alguns exercícios para você praticar mais o emprego do comando read em scripts do shell Bash. A resolução está na sequência.
Exercícios com comando read
- Crie um script que peça um número ao usuário, calcule e exiba o dobro desse número.
- Peça para que o usuário digite uma senha e a oculte com -s. Em seguida, exiba uma mensagem confirmando que a senha foi armazenada.
- Crie um script que solicite uma resposta do usuário (“sim” ou “não”) com um tempo limite de 3 segundos. Se o tempo esgotar, exiba “Tempo esgotado”.
- Crie um menu simples onde o usuário pode escolher uma opção (1, 2 ou 3). Use o comando read com -n 1 para capturar a entrada e exiba uma mensagem dependendo da escolha.
Resolução dos exercícios
Exercício 1
#!/bin/bash read -p "Digite um número: " numero dobro=$((numero * 2)) echo "O dobro de $numero é $dobro."
Exercício 2
#!/bin/bash read -sp "Digite sua senha: " senha echo -e "\nSenha armazenada com segurança."
Exercício 3
#!/bin/bash read -t 3 -p "Você deseja continuar? (sim/não): " resposta if [ -z "$resposta" ]; then echo "Tempo esgotado." else echo "Você respondeu: $resposta" fi
Exercício 4
#!/bin/bash echo "Escolha uma opção:" echo "1) Iniciar" echo "2) Configurações" echo "3) Sair" read -n 1 -p "Digite sua escolha: " opcao echo -e "\n" case $opcao in 1) echo "Iniciar aplicação..." ;; 2) echo "Abrir configurações..." ;; 3) echo "Sair..." ;; *) echo "Opção inválida." ;; esac
Conclusão
O comando read é uma ferramenta muito importante em Shell Scripting, pois permite que scripts interajam com os usuários de maneira dinâmica.
Com o uso das opções adequadas, é possível controlar a entrada de dados, definir limites e até mesmo capturar senhas de forma segura.
As aulas são ótimas e o prof. Fábio é muito bom !!!
Obrigado Paulo!
Olá Fábio dos Reis. Gostaria de parabenizá-lo por total clareza em suas aulas. Se possível, tire uma dúvida desse iniciante em shell script. Porque nas aulas anteriores o comando echo foi precedido do uso de aspas duplas e nessa aula 26 não foi utilizado. Ele é opcional? Em quais casos seria obrigatório?