# 1. Variaveis

## 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 no terminal. Esta documentação cobre os fundamentos do Bash, com ênfase especial em **variáveis** e **tipagem**, detalhando seu uso, características e boas práticas.

## Estrutura Básica de um Script Bash

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

```bash
#!/bin/bash
# Comentário: Script Bash com exemplo de variável

nome="Mundo"
echo "Olá, $nome!"
```

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

## Comandos Básicos

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

* `pwd`: Mostra o diretório atual.
* `ls`: Lista arquivos e diretórios.
* `cd <diretório>`: Navega para o diretório especificado.
* `mkdir <nome>`: Cria um diretório.
* `rm <arquivo>`: Remove um arquivo (use com 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 um arquivo no editor Nano.
* `less <arquivo>`: Visualiza um arquivo 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 seu ID.

### Manipulação de Texto

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

## Variáveis no Bash

### Definição e Atribuição

Variáveis no Bash são usadas para armazenar dados, como strings, números ou resultados de comandos. Elas não requerem declaração prévia de tipo, pois o Bash é **dinamicamente tipado** (ou, mais precisamente, **não tipado**, já que trata tudo como strings por padrão).

```bash
nome="Alice"
idade=25
```

* **Atribuição**: Use `nome=valor` (sem espaços ao redor do `=`).
* **Acesso**: Use `$nome` ou `${nome}` para referenciar o valor.
* **Exemplo**:

  ```bash
  mensagem="Bem-vindo, $nome!"
  echo $mensagem  # Saída: Bem-vindo, Alice!
  ```

### Tipagem no Bash

O Bash não possui tipagem estrita, ou seja, todas as variáveis são tratadas como **strings** por padrão, mesmo que contenham números. Isso significa que o Bash não diferencia entre tipos de dados (inteiros, strings, flutuantes, etc.) durante a atribuição ou manipulação.

* **Números**:

  ```bash
  idade=25
  echo $idade  # Saída: 25 (tratado como string)
  ```

  Embora `$idade` contenha "25", o Bash não a considera um número até que seja usada em um contexto aritmético (veja abaixo).
* **Aritmética**:

  Para realizar cálculos, use o operador `$(())` ou o comando `let`. O Bash converte strings numéricas para números nesse contexto:

  ```bash
  idade=25
  nova_idade=$((idade + 5))
  echo $nova_idade  # Saída: 30
  ```

  Se a variável não contiver um número válido, o Bash retorna um erro ou trata como 0:

  ```bash
  texto="abc"
  echo $((texto + 1))  # Erro ou resultado inesperado (0)
  ```
* **Tipagem Dinâmica**:

  Uma variável pode mudar de "tipo" (ou melhor, de conteúdo interpretado) a qualquer momento:

  ```bash
  var="10"         # String
  var=$((var + 5)) # Agora tratada como número, var=15
  var="texto"      # Volta a ser string
  ```

### Escopo de Variáveis

* **Locais**: Variáveis definidas em um script ou função são locais por padrão, a menos que exportadas.

  ```bash
  function exemplo {
    local var_local="Estou na função"
    echo $var_local
  }
  exemplo
  echo $var_local  # Saída: (vazio, pois var_local não existe fora da função)
  ```
* **Globais**: Variáveis definidas fora de funções ou sem `local` são globais no script.
* **Exportadas**: Variáveis podem ser exportadas para subprocessos com `export`:

  ```bash
  export VAR="Disponível em subprocessos"
  bash -c 'echo $VAR'  # Saída: Disponível em subprocessos
  ```

### Variáveis Especiais

O Bash possui variáveis embutidas com significados específicos:

* `$?`: Código de saída do último comando (0 = sucesso, !=0 = erro).
* `$0`: Nome do script em execução.
* `$1`, `$2`, ...: Argumentos passados para o script.
* `$#`: Número de argumentos passados.
* `$@`: Lista de todos os argumentos.
* `$$`: PID do processo atual.

Exemplo:

```bash
#!/bin/bash
echo "Nome do script: $0"
echo "Primeiro argumento: $1"
echo "Total de argumentos: $#"
```

### Arrays

O Bash suporta arrays (vetores) unidimensionais:

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

* Atribuição: `array=(valor1 valor2 valor3)`.
* Índices: Começam em 0.
* Todos os elementos: `${array[@]}`.
* Tamanho: `${#array[@]}`.

### Boas Práticas com Variáveis

* **Use aspas**: Proteja variáveis com aspas para evitar erros com valores vazios ou espaços:

  ```bash
  nome="Alice Smith"
  echo "$nome"  # Correto
  echo $nome    # Pode causar erros com espaços
  ```
* **Nomes claros**: Use nomes descritivos, como `caminho_arquivo` em vez de `x`.
* **Evite conflitos**: Não sobrescreva variáveis especiais ou comandos (ex.: `PATH`).
* **Validação**: Verifique se variáveis estão definidas:

  ```bash
  if [ -z "$var" ]; then
    echo "Variável não definida"
  fi
  ```

## Estruturas de Controle com Variáveis

### Condicional

Variáveis são frequentemente usadas em condições:

```bash
idade=20
if [ "$idade" -ge 18 ]; then
  echo "Maior de idade"
else
  echo "Menor de idade"
fi
```

* Operadores comuns: `-eq` (igual), `-ne` (diferente), `-gt` (maior), `-lt` (menor), `-z` (vazio).

### Laço com Variáveis

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

## Permissões e Execução

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

## Redirecionamento e Pipelines com Variáveis

Variáveis podem ser usadas para dinamizar redirecionamentos:

```bash
arquivo="saida.txt"
echo "Resultado" > "$arquivo"
ls | grep ".txt" >> "$arquivo"
```

## Boas Práticas Gerais

* Comente o código para explicar variáveis e lógica.
* Teste scripts em ambientes seguros.
* Evite comandos destrutivos sem confirmação.
* Use `local` em funções para evitar conflitos de escopo.

## Recursos Adicionais

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

Essa documentação oferece uma visão detalhada sobre variáveis e a ausência de tipagem estrita no Bash, além de cobrir os fundamentos do shell. Para mais detalhes, explore a documentação oficial ou experimente com scripts práticos.


---

# 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/1.-variaveis.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.
