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:
- Perguntar e ouvir: o script pausa e faz uma pergunta para você usando
read. - 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 caixaname.$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:
- Modo interativo: usar
readpara conversar com o usuário, o que é adequado para pessoas. - Modo de argumentos: usar
$1para 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!



