- Gerar link
- X
- Outros aplicativos
- Gerar link
- X
- Outros aplicativos
Programando em Bash
Geralmente realizo tarefas rotineiras quando estou administrando um servidor linux; quase sempre eu tento elaborar um script simples e direto. Contudo, outras envolvem vários etapas, onde o resultado de uma influencia na outra.
Pensando sobre isso eu utilizei a IA como ferramenta, para elaborar um pequeno "programinha/script" para ajudar a elaborar códigos e juntar tudo no final.
O objetivo é que ele apresente as seguintes cartecristicas como:
- 100% Bash
- Modular e fácil de expandir
- Independente por blocos
- Validações robustas
- Portável entre distribuições Unix/Linux
PREPOSIÇÕES & OBJETIVOS
A seguir é apresentado de forma textual, a ídeia do programa "Encontre sua Próxima Namorada!"
Esse infame *App* tenta deduzir qual o perfil de sua futura namorada. O programa envolve 4 perguntas (que são de fato 4 blocos de código) e no fim se juntam para gerar um resposta final.
Encontre sua Próxima Namorada!
[Bloco nome de mulher]
a) Exiba:
"Diga o nome de uma mulher que você gostaria de namorar? (exemplo: Maria ou Ana Clara)."
"Digite sua resposta:
b) Requerimentos:
- A informação digitada não pode conter números ou caracteres especiais, mas pode ter espaços.
- Caso a informação seja divergente, exiba:" Informação invalida! Repita por favor..." ;
aguarde 3 segundos; limpe a tela e volte a exibir a pergunte. - Caso a informação satisfaça a condição exiba: "Informação aceita!"; fim do bloco.
- Guarde a informação na variavel nome-de-mulher;
[Bloco idade da mulher]
a) Exiba:
"Para sabermos a idade da mulher que vc deseja namorar, informe sua idade.
"Qual a sua idade? (exemplo: 27)."
"Digite sua resposta:
b) Requerimentos:
- A informação digitada só pode ter números.
- Não pode começar com o valor 0.
- Escolha um valor aleatório entre, a idade informada e -10 anos, e , a idade informada +10 anos;
- Caso o valor seja menor ou igual a 17, gere um novo valor;
- Subtraia esse valor da data atual e indetifique o ano de nascimento da mulher;
- Guarde a informação sobre a idade na variavel idade-de-mulher;
- Guarde a informação sobre o ano de nascimento na variavel ano-de-mulher;
[Bloco origem da mulher]
a) Exiba
"Qual sua comedida preferida?"
"Digite uma das escolhas?"
" 1 = Feijoada "
" 2 = Hamburgueres "
" 3 = Koshari "
" 4 = Sushi "
" 5 = Pizza "
" 6 = Churrasco "
"Digite sua resposta:
b) Requerimentos:
- A informação digitada só pode ter números de 1 a 6; qualquer outro valor ignore e repita a pergunta.
- O valor digitado deve gerar uma nova informação:
" 1 = Feijoada "= Brasileira
" 2 = Hamburgueres " = Americana
" 3 = Koshari " = Africana
" 4 = Sushi " = Asiatica
" 5 = Pizza " = Europeia
" 6 = Churrasco " = Australiana - Guarde a informação na variavel origem-de-mulher;
- Fim do bloco
[Bloco Revelação]
a) Exiba:
"Pronto pra saber sobre sua nova namorada?
- A resposta deve ser s ou n; ignore qualquer outro valor.
- Se (s) exiba:
" Parabens!"
" Sua nova namorada se chama (nome-de-mulher).
" Ela tem (idade-de-mulher) anos... e nasceu em (ano-de-mulher)."
" E ela é (origem-de-mulher)." - Agradeça e encerre a aplicação.
- Caso contrario exiba:
"Frouxo!" - Espere 3 segs. e feche a aplicação.
Agora vamos aplicar isso através do código bash.
"Codando" em Bash
O código abaixo, atende a todas as diretrizes apresentadas no tópico anterior.
Suas principais caracteristicas são:
- Ele se apresenta através de blocos independentes.
- Código limpo, facilitando o entendimento do algoritmo.
- Possibilidade de expansão e aperfeiçoamento sem impactar nos demais blocos.
Eis o código abaixo, pronto para ser copiado, colado e executado (através de um arquivo .sh)
#!/bin/bash
# INICIO DO SCRIPT ###########################################
# ------------------------------------------
# Cores ANSI
# ------------------------------------------
RED='\033[1;31m'
GREEN='\033[1;32m'
CYAN='\033[1;36m'
YELLOW='\033[1;33m'
NC='\033[0m'
# ------------------------------------------
# Separador visual
# ------------------------------------------
separador() {
echo -e "${YELLOW}----------------------${NC}"
}
# ------------------------------------------
# AJUDA
# ------------------------------------------
ajuda() {
clear
echo -e "${YELLOW}==== AJUDA DO SCRIPT ====${NC}"
echo
echo -e "${CYAN}Uso em modo não-interativo:${NC}"
echo -e "./namorada.sh \"Nome Completo\" idade comida resposta"
echo
echo -e "${CYAN}Parâmetros esperados:${NC}"
echo -e " 1) Nome da mulher: Nome completo com iniciais maiúsculas (ex: Maria Clara)"
echo -e " 2) Sua idade: Número inteiro (ex: 27)"
echo -e " 3) Comida preferida (número de 1 a 6):"
echo -e " 1 = Feijoada → Brasileira"
echo -e " 2 = Hamburgueres → Americana"
echo -e " 3 = Koshari → Africana"
echo -e " 4 = Sushi → Asiática"
echo -e " 5 = Pizza → Europeia"
echo -e " 6 = Churrasco → Australiana"
echo -e " 4) Resposta final: s (sim) ou n (não)"
echo
echo -e "${CYAN}Exemplo:${NC}"
echo -e "./namorada.sh \"Maria Clara\" 30 5 s"
echo
echo -e "${CYAN}Saída esperada (exemplo):${NC}"
echo -e "Parabéns!"
echo -e "Sua nova namorada se chama: Maria Clara"
echo -e "Ela tem 28 anos... e nasceu em 1997."
echo -e "E ela é Europeia."
echo -e "Obrigado por usar nosso programa!"
echo
exit 0
}
# ------------------------------------------
# Validações e funções automáticas
# ------------------------------------------
validar_nome() {
local nome="$1"
if [[ "$nome" =~ ^([A-Z][a-z]+)(\ [A-Z][a-z]+)*$ ]]; then
nome_de_mulher="$nome"
return 0
else
echo -e "${RED}Erro: Nome inválido passado como argumento.${NC}"
return 1
fi
}
gerar_idade_aleatoria() {
local idade="$1"
if [[ "$idade" =~ ^[1-9][0-9]*$ ]]; then
idade_min=$((idade - 10))
idade_max=$((idade + 10))
while true; do
idade_de_mulher=$((RANDOM % (idade_max - idade_min + 1) + idade_min))
if [ "$idade_de_mulher" -gt 17 ]; then
break
fi
done
ano_atual=$(date +%Y)
ano_de_mulher=$((ano_atual - idade_de_mulher))
return 0
else
echo -e "${RED}Erro: Idade inválida passada como argumento.${NC}"
return 1
fi
}
mapear_origem() {
case "$1" in
1) origem_de_mulher="Brasileira" ;;
2) origem_de_mulher="Americana" ;;
3) origem_de_mulher="Africana" ;;
4) origem_de_mulher="Asiática" ;;
5) origem_de_mulher="Europeia" ;;
6) origem_de_mulher="Australiana" ;;
*)
echo -e "${RED}Erro: Código de comida inválido.${NC}"
return 1 ;;
esac
return 0
}
mostrar_revelacao() {
case "$1" in
[sS])
separador
echo -e "${GREEN}Parabéns!${NC}"
echo -e "Sua nova namorada se chama: ${YELLOW}$nome_de_mulher${NC}"
echo -e "Ela tem ${YELLOW}$idade_de_mulher${NC} anos... e nasceu em ${YELLOW}$ano_de_mulher${NC}."
echo -e "E ela é ${YELLOW}$origem_de_mulher${NC}."
echo -e "${GREEN}Obrigado por usar nosso programa!${NC}"
;;
[nN])
echo -e "${RED}Frouxo!${NC}"
sleep 3 ;;
*)
echo -e "${RED}Erro: Resposta final inválida. Use 's' ou 'n'.${NC}"
return 1 ;;
esac
return 0
}
# ------------------------------------------
# Blocos interativos
# ------------------------------------------
obter_nome_mulher() {
while true; do
separador
echo -e "${CYAN}Diga o nome de uma mulher que você gostaria de namorar?${NC}"
echo -e "(${YELLOW}exemplo: Maria ou Ana Clara Dos Anjos${NC})"
read -erp "$(echo -e "${CYAN}Digite sua resposta: ${NC}")" nome
validar_nome "$nome" && break
echo -e "${RED}Tente novamente...${NC}"
sleep 3
clear
done
}
obter_idade_mulher() {
while true; do
separador
echo -e "${CYAN}Para sabermos a idade da mulher que você deseja namorar, informe sua idade.${NC}"
read -erp "$(echo -e "${CYAN}Qual a sua idade? (exemplo: 27): ${NC}")" idade
gerar_idade_aleatoria "$idade" && break
echo -e "${RED}Tente novamente...${NC}"
sleep 3
clear
done
}
obter_origem_mulher() {
while true; do
separador
echo -e "${CYAN}Qual sua comida preferida?${NC}"
echo -e "${YELLOW}Digite uma das escolhas:${NC}"
echo " 1 = Feijoada"
echo " 2 = Hamburgueres"
echo " 3 = Koshari"
echo " 4 = Sushi"
echo " 5 = Pizza"
echo " 6 = Churrasco"
read -erp "$(echo -e "${CYAN}Digite sua resposta: ${NC}")" opcao
mapear_origem "$opcao" && break
echo -e "${RED}Tente novamente...${NC}"
sleep 2
clear
done
}
bloco_revelacao() {
while true; do
separador
echo -e "${CYAN}Pronto pra saber sobre sua nova namorada? (s/n)${NC}"
read -erp "$(echo -e "${CYAN}Digite sua resposta: ${NC}")" resposta
mostrar_revelacao "$resposta" && break
done
}
# ------------------------------------------
# FLUXO PRINCIPAL
# ------------------------------------------
main() {
[[ "$1" == "?" ]] && ajuda
clear
if [[ $# -eq 4 ]]; then
validar_nome "$1" &&
gerar_idade_aleatoria "$2" &&
mapear_origem "$3" &&
mostrar_revelacao "$4"
else
obter_nome_mulher
clear
obter_idade_mulher
clear
obter_origem_mulher
clear
bloco_revelacao
fi
}
main "$@"
# FIM DO SCRIPT ###########################################
SOBRE O CÓDIGO
A medida que eu fui criando, a IA foi ajudando a aperfeiçoar o script.
A ponto que chegou num formato que achei muito interessante.
Ele oferece 3 modos de execução:
| Modo | Exemplo de Execução | Finalidade |
|---|---|---|
| User | ./namorada.sh |
Precisa responder as perguntas. |
| Auto | ./namorada.sh "Ana Lee" 51 6 s |
Já fornece as respostas. |
| Ajuda | ./namorada.sh ? |
Exibe um texto de ajuda de como utiliza-lo. |
Modo User (interativo)
Neste modo, o usuário "roda" o script, e o código solicita as informações :
-
Chamada
main- Verifica se o primeiro argumento é
?. Se for, chamaajuda()e encerra. - Se não houver 4 argumentos, executa os blocos interativos:
- obter_nome_mulher
- obter_idade_mulher
- obter_origem_mulher
- bloco_revelacao
- Verifica se o primeiro argumento é
-
Blocos interativos:
- obter_nome_mulher: Valida que o nome tenha apenas letras e espaços e que cada palavra comece com letra maiúscula (ex: Ana Clara).
- obter_idade_mulher: Recebe a idade do usuário, gera um valor aleatório entre idade - 10 e idade + 10, maior que 17.
- obter_origem_mulher: Exibe um menu de 6 opções de comidas. Cada número corresponde a uma origem cultural.
- bloco_revelacao: Pergunta se deseja ver o resultado. Se “s”, exibe os dados gerados. Se “n”, exibe “Frouxo!” e encerra.
Modo Auto (fornece os argumentos)
Quando o script é executado com 4 argumentos, ele pula o modo interativo e processa os valores diretamente:
main "Nome" Idade Comida Resposta
Validações:
- Nome: deve estar corretamente capitalizado (ex: “Maria Clara”).
- Idade: precisa ser número inteiro positivo.
- Comida: número de 1 a 6, mapeado para origem.
- Resposta final: deve ser “s” ou “n”.
- Se qualquer valor for inválido, o script exibe um erro específico e encerra.
Modo ajuda
Quando o usuário executa:
./namorada.sh ?
A função:
- Limpa o terminal
- Explica como usar o modo automático
- Mostra exemplos de entrada e saída esperada
Destaques Técnicos
- Portabilidade: 100% compatível com Bash padrão em sistemas Unix/Linux.
- Estilo visual: Cores ANSI e separadores para melhor leitura.
- Validações robustas: Expressões regulares para nome, idade, e escolhas.
- Expansível: Fácil de adicionar novos blocos ou tipos de entrada.
CONCLUSÃO
Esse script, por mais simples que pareça, ensina princípios fundamentais que são aplicáveis em scripts mais complexos:
- Modularização: facilita testes, manutenção e expansão.
- Validação rigorosa de entradas: evita falhas silenciosas.
- Fluxo controlado: separação clara entre lógica de interface e lógica de processamento.
- Compatibilidade: usa apenas comandos Bash portáteis, funcionais em qualquer distribuição.
Essas práticas formam a base de scripts mais robustos. Porém lembre-se sempre ao criar ou adaptar novos scripts:
- Divida por funções — cada função faz uma única coisa bem feita.
- Valide todas as entradas — nunca confie cegamente no que o usuário digita.
- Use comentários claros — facilite revisões futuras.
- Planeje o fluxo principal — é o coração do seu script.
- Sempre pense na expansão — mesmo em scripts simples.
Continue explorando, experimentando e expandindo seus conhecimentos.
Bash é só o começo. O que você constrói com ele depende da sua criatividade.
Boa sorte e sucesso em sua jornada como desenvolvedor shell!
-W.
- Gerar link
- X
- Outros aplicativos
Comentários
Postar um comentário