Variáveis e entrada do usuário

ShellBeginner
Pratique Agora

Introdução

Imagine que você tem um robô garçom. Um robô estático só consegue dizer "Olá, senhor" para todas as pessoas. Um robô dinâmico pode perguntar seu nome e dizer "Olá, Sarah" ou "Olá, Mike".

No laboratório anterior, seu script sempre fazia exatamente a mesma coisa. Neste laboratório, você vai torná-lo dinâmico, permitindo que os dados venham de fora do próprio script.

Essa é uma grande mudança na programação. Quando um script consegue aceitar uma entrada, ele deixa de ser uma demonstração fixa e passa a ser uma ferramenta reutilizável.

Você aprenderá duas maneiras de interagir com seu script:

  1. Perguntar e ouvir: o script pausa e faz uma pergunta para você usando read.
  2. Passar informações: você fornece uma informação ao script no momento em que o inicia usando argumentos.

Ao final deste laboratório, seu código será capaz de cumprimentar qualquer pessoa que você quiser, e não apenas "World".

Usar read para receber entrada interativa

Nosso primeiro método é a abordagem "conversacional". Vamos fazer o script exibir uma pergunta e depois esperar por uma resposta.

Usaremos o comando read. Pense em read como um comando que diz: "Pare tudo, aguce os ouvidos e espere o usuário digitar alguma coisa."

Este é seu primeiro exemplo de um script recebendo dados enquanto já está em execução. Em shell scripting, uma variável é um local nomeado usado para armazenar dados temporariamente, como um nome de usuário, um nome de arquivo ou um número. As variáveis tornam os scripts reutilizáveis, pois o script pode trabalhar com entradas que mudam em vez de usar texto fixo no código.

Primeiro, verifique se você está no diretório de trabalho do projeto:

cd ~/project

Crie um novo arquivo chamado hello.sh usando o nano:

nano hello.sh

Digite o código a seguir. Observação: definimos uma "caixa" (variável) chamada name para armazenar a resposta do usuário.

#!/bin/bash

echo "What is your name?"
read name
echo "Hello, $name!"

Vamos analisar o código:

  • echo "...": o script fala com você.
  • read name: o script escuta. Tudo o que você digitar será colocado dentro da caixa name.
  • $name: o script abre a caixa. O símbolo $ é a chave que permite acessar a variável e ver o que há dentro dela.

Observe a diferença entre name e $name. name é o nome da variável quando você a cria ou preenche. $name significa "substitua isto pelo valor armazenado dentro da variável". Essa substituição é chamada de expansão e é um dos comportamentos mais importantes do shell.

Salve seu trabalho (Ctrl+O, Enter) e saia (Ctrl+X).

Executar o script interativo

Antes de conversar com nosso script, precisamos autorizá-lo a ser executado. Lembra da "chave" do laboratório anterior?

Conceda permissão de execução:

chmod +x hello.sh

Agora, vamos conversar. Execute o script:

./hello.sh

O script perguntará "What is your name?" e depois pausará. Ele estará esperando por você. O cursor pode ficar piscando.

Digite seu nome, por exemplo, Alice, e pressione Enter.

What is your name?
Alice
Hello, Alice!

Isso é chamado de entrada interativa. É ótimo para ferramentas usadas por pessoas, mas ruim para automação. Imagine tentar executar este script automaticamente às 3 da manhã. Ele ficaria preso esperando uma resposta que nunca chegaria!

Essa diferença é importante em operações reais. Scripts interativos são convenientes quando há uma pessoa presente, mas tarefas agendadas, pipelines de CI e scripts de inicialização normalmente precisam de entradas não interativas para poderem ser executados sem supervisão.

Usar argumentos para receber entrada não interativa

Para tornar nosso script adequado à automação, precisamos fornecer os dados antes que ele comece a ser executado, para que ele nunca precise pausar. Fazemos isso usando argumentos.

Pense nos argumentos como uma "abertura para correspondência" em uma porta. Você coloca a mensagem ali ao passar pela porta.

No Bash, essas aberturas têm nomes numerados:

  • $1 é a primeira palavra digitada depois do nome do script.
  • $2 é a segunda palavra, e assim por diante.

Esses valores numerados são chamados de parâmetros posicionais. O shell os cria automaticamente quando o script é iniciado. Você não define $1 por conta própria; o Bash preenche esse valor com base na linha de comando que iniciou o script.

Vamos atualizar hello.sh para procurar a informação na primeira abertura, $1, em vez de fazer uma pergunta.

Abra o arquivo:

nano hello.sh

Altere o código para que fique assim:

#!/bin/bash

name=$1
echo "Hello, $name!"

Aqui, name=$1 pega o que encontrar na abertura $1 e coloca esse valor na caixa name. Não há pausas nem perguntas.

Salve o arquivo e saia do editor.

Executar o script com argumentos

Agora você executará o script de outra maneira. Basta "jogar" o nome para o script no momento em que você o inicia.

Execute este comando:

./hello.sh LabEx

Aqui, LabEx é o argumento. O script o obtém como $1 e exibe imediatamente:

Hello, LabEx!

Experimente com outro nome:

./hello.sh World

O script funciona instantaneamente. Sem pausas.

O problema da abertura vazia

O que acontece se você não fornecer um argumento?

./hello.sh

Você verá:

Hello, !

A abertura $1 estava vazia, então a caixa name também ficou vazia. Nos próximos laboratórios, você aprenderá a detectar essa situação e exibir uma mensagem de erro, mas, por enquanto, você criou com sucesso um script enxuto e pronto para automação!

A diferença entre entrada interativa e argumentos de linha de comando é fundamental. read faz uma pergunta durante a execução, enquanto $1 está disponível desde o início. Muitas ferramentas Unix são projetadas com base em argumentos porque eles são mais fáceis de automatizar, documentar, repetir e combinar com outros comandos.

Resumo

Parabéns! Você aprendeu a arte de ouvir.

Neste laboratório, você explorou:

  1. Modo interativo: usar read para conversar com o usuário, o que é adequado para pessoas.
  2. Modo de argumentos: usar $1 para aceitar dados no momento da inicialização, o que é adequado para robôs e automação.

Você também aprendeu que variáveis, como $name, são apenas caixas identificadas nas quais os scripts armazenam informações. Esse conceito é a base de toda a programação!