Ingressando Servidores Ubuntu em um Active Directory

Programando em Bash

Miniatura para postagem Programando em Bash

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 :

  1. Chamada main

    • Verifica se o primeiro argumento é ?. Se for, chama ajuda() e encerra.
    • Se não houver 4 argumentos, executa os blocos interativos:
      • obter_nome_mulher
      • obter_idade_mulher
      • obter_origem_mulher
      • bloco_revelacao
  2. 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:

  1. Divida por funções — cada função faz uma única coisa bem feita.
  2. Valide todas as entradas — nunca confie cegamente no que o usuário digita.
  3. Use comentários claros — facilite revisões futuras.
  4. Planeje o fluxo principal — é o coração do seu script.
  5. 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.

Comentários