# 3. Funcoes & Objetos & Arrays

## Introdução

O **Bash** (Bourne Again Shell) é um interpretador de comandos usado em sistemas Unix-like, como Linux e macOS, para executar comandos, criar scripts e automatizar tarefas. Esta documentação detalha **funções**, **objetos** (que no Bash são simulados, pois não há suporte nativo) e **arrays**, explicando sua sintaxe, comportamento do computador e exemplos práticos, além de cobrir fundamentos gerais do Bash.

## Estrutura Básica de um Script Bash

Um script Bash é um arquivo de texto com comandos executáveis. A extensão `.sh` é comum, mas não obrigatória.

```bash
#!/bin/bash
# Script com função e array
frutas=("maçã" "banana")
echo "Primeira fruta: ${frutas[0]}"
```

* `#!/bin/bash`: Shebang que especifica o interpretador Bash.
* `#`: Inicia um comentário.
* `echo`: Exibe texto no terminal.

## Comandos Básicos

### Navegação e Manipulação de Arquivos

* `pwd`: Exibe o diretório atual.
* `ls`: Lista arquivos e diretórios.
* `cd <diretório>`: Navega para o diretório.
* `mkdir <nome>`: Cria um diretório.
* `rm <arquivo>`: Remove um arquivo (cuidado).
* `rm -r <diretório>`: Remove um diretório e seu conteúdo.

### Visualização e Edição

* `cat <arquivo>`: Exibe o conteúdo de um arquivo.
* `nano <arquivo>`: Edita com o editor Nano.
* `less <arquivo>`: Visualiza página por página.

### Gerenciamento de Processos

* `ps`: Lista processos em execução.
* `top`: Exibe processos em tempo real.
* `kill <PID>`: Encerra um processo pelo ID.

### Manipulação de Texto

* `grep <padrão> <arquivo>`: Busca por um padrão.
* `sed 's/<procurar>/<substituir>/g' <arquivo>`: Substitui texto.
* `awk '{print $1}' <arquivo>`: Extrai colunas de texto.

## Funções no Bash

Funções no Bash permitem agrupar comandos para reutilização, tornando scripts mais modulares e organizados.

### Sintaxe

```bash
nome_funcao() {
  # Comandos
}
```

ou

```bash
function nome_funcao {
  # Comandos
}
```

* **Definição**: Declare com `nome_funcao()` ou `function nome_funcao`.
* **Chamada**: Invoque com `nome_funcao [argumentos]`.
* **Argumentos**: Acessados via `$1`, `$2`, ..., `$@` (todos os argumentos), `$#` (número de argumentos).
* **Retorno**: Use `return` para códigos de saída (0 a 255) ou `echo` para passar valores.

Exemplo:

```bash
saudacao() {
  local nome="$1"  # Variável local
  echo "Olá, $nome!"
}
saudacao "Alice"  # Saída: Olá, Alice!
```

### Comportamento do Computador

* O Bash aloca um novo escopo para variáveis locais (com `local`) dentro da função.
* Variáveis globais são acessíveis, mas podem ser sobrescritas se não declaradas como `local`.
* O código de saída (`$?`) reflete o último comando executado na função ou o valor de `return`.
* Funções são executadas sequencialmente, e o Bash armazena a definição na memória até o fim do script ou sessão.

Exemplo com retorno:

```bash
soma() {
  local a=$1
  local b=$2
  echo $((a + b))
}
resultado=$(soma 5 3)  # Captura saída
echo "Soma: $resultado"  # Saída: Soma: 8
```

### Boas Práticas

* Use `local` para variáveis dentro de funções, evitando conflitos com o escopo global.
* Valide argumentos antes de usá-los:

```bash
funcao() {
  if [ $# -lt 1 ]; then
    echo "Erro: argumento necessário"
    return 1
  fi
  echo "Argumento: $1"
}
```

* Nomeie funções de forma descritiva, como `calcular_soma` em vez de `cs`.

## Objetos no Bash

O Bash **não suporta objetos** nativamente, como em linguagens orientadas a objetos (ex.: Python, Java). No entanto, é possível simular estruturas semelhantes a objetos usando **variáveis**, **arrays associativos** ou **funções**.

### Simulando Objetos com Arrays Associativos

Arrays associativos (introduzidos no Bash 4.0) permitem usar chaves textuais, simulando propriedades de objetos.

```bash
declare -A pessoa  # Declara array associativo
pessoa[nome]="Alice"
pessoa[idade]=25
pessoa[cidade]="São Paulo"

echo "Nome: ${pessoa[nome]}, Idade: ${pessoa[idade]}"  # Saída: Nome: Alice, Idade: 25
```

### Simulando Métodos

Use funções para simular métodos associados a um "objeto":

```bash
apresentar_pessoa() {
  local -n obj=$1  # Referência ao array associativo
  echo "Nome: ${obj[nome]}, Idade: ${obj[idade]}"
}

declare -A pessoa
pessoa[nome]="Bob"
pessoa[idade]=30
apresentar_pessoa pessoa  # Saída: Nome: Bob, Idade: 30
```

### Comportamento do Computador

* Arrays associativos são armazenados como tabelas de hash na memória.
* O Bash acessa chaves como strings, permitindo flexibilidade, mas sem tipagem ou validação de estrutura.
* Funções que simulam métodos não mantêm estado, a menos que usem variáveis globais ou passem o "objeto" como argumento.

### Limitações

* Não há herança, encapsulamento ou polimorfismo nativos.
* Arrays associativos requerem Bash 4.0 ou superior.
* Erros de sintaxe ou chaves indefinidas podem causar falhas silenciosas, então valide entradas:

```bash
if [ -z "${pessoa[nome]}" ]; then
  echo "Nome não definido"
fi
```

## Arrays no Bash

Arrays no Bash são listas unidimensionais que armazenam múltiplos valores, indexados por números (arrays regulares) ou strings (arrays associativos).

### Arrays Regulares

```bash
frutas=("maçã" "banana" "laranja")
echo ${frutas[0]}  # Saída: maçã
echo ${frutas[@]}  # Saída: maçã banana laranja
echo ${#frutas[@]} # Saída: 3 (tamanho)
```

* **Declaração**: `array=(valor1 valor2 valor3)`.
* **Acesso**: `${array[índice]}` para um elemento, `${array[@]}` para todos.
* **Índices**: Começam em 0.
* **Modificação**: `frutas[1]="uva"` substitui "banana" por "uva".

### Arrays Associativos

```bash
declare -A cores
cores[maçã]="vermelho"
cores[banana]="amarelo"
echo ${cores[maçã]}  # Saída: vermelho
```

* **Declaração**: `declare -A nome`.
* **Chaves**: Strings arbitrárias.
* **Acesso**: `${array[chave]}`.

### Comportamento do Computador

* Arrays regulares são armazenados como listas ordenadas na memória, com índices numéricos.
* Arrays associativos usam tabelas de hash, permitindo acesso rápido por chave.
* O Bash trata elementos como strings, mas converte para números em contextos aritméticos:

```bash
numeros=(1 2 3)
soma=$((numeros[0] + numeros[1]))  # Saída: 3
```

### Iterando em Arrays

```bash
for fruta in "${frutas[@]}"; do
  echo "Fruta: $fruta"
done
```

Ou com índices:

```bash
for i in "${!frutas[@]}"; do
  echo "Índice $i: ${frutas[i]}"
done
```

### Boas Práticas

* Use aspas em `${array[@]}` para evitar problemas com espaços: `"${frutas[@]}"`.
* Verifique o tamanho antes de acessar: `if [ ${#array[@]} -gt 0 ]; then`.
* Para arrays associativos, valide chaves: `if [ -n "${cores[banana]}" ]; then`.

## Integração de Funções, Objetos e Arrays

Exemplo combinando os três conceitos:

```bash
#!/bin/bash
declare -A usuario
usuario[nome]="Alice"
usuario[idade]=25

adicionar_hobby() {
  local -n obj=$1  # Referência ao array associativo
  local hobby=$2
  obj[hobbies]+="$hobby "  # Concatena hobbies
}

exibir_usuario() {
  local -n obj=$1
  echo "Nome: ${obj[nome]}, Idade: ${obj[idade]}, Hobbies: ${obj[hobbies]}"
}

adicionar_hobby usuario "leitura"
adicionar_hobby usuario "corrida"
exibir_usuario usuario  # Saída: Nome: Alice, Idade: 25, Hobbies: leitura corrida 
```

* **Função**: `adicionar_hobby` e `exibir_usuario` manipulam o "objeto".
* **Objeto**: `usuario` é um array associativo simulando um objeto.
* **Array**: O campo `hobbies` armazena múltiplos valores como uma string.

## Permissões e Execução

* Tornar executável: `chmod +x script.sh`.
* Executar: `./script.sh`.

## Redirecionamento e Pipelines

Funções e arrays podem ser usados com redirecionamentos:

```bash
salvar_dados() {
  local -n obj=$1
  echo "Nome: ${obj[nome]}" > dados.txt
}
salvar_dados usuario
```

## Boas Práticas Gerais

* Use `local` em funções para evitar conflitos de escopo.
* Valide entradas de funções e arrays.
* Comente o código para explicar lógica complexa.
* Teste scripts em ambientes seguros.
* Evite comandos destrutivos sem validação.

## Recursos Adicionais

* Manual: `man bash`.
* Ajuda: `<comando> --help`.
* Comunidades: Stack Overflow, fóruns Linux.

Essa documentação detalha funções, a simulação de objetos e o uso de arrays no Bash, explicando como o computador processa cada elemento. Para aprofundar, experimente scripts complexos ou consulte a documentação oficial.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/conceitos/programacao-e-linguagens/bash-ou-shell/3.-funcoes-and-objetos-and-arrays.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
