# 2. Estruturas condicionais

## Introdução

O **Bash** (Bourne Again Shell) é um interpretador de comandos utilizado em sistemas Unix-like, como Linux e macOS, para executar comandos, criar scripts e automatizar tarefas. Esta documentação detalha as **estruturas condicionais** no Bash, explicando profundamente 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
# Comentário: Script com condicional
idade=20
if [ "$idade" -ge 18 ]; then
  echo "Maior de idade"
fi
```

* `#!/bin/bash`: Shebang que indica 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.

## Estruturas Condicionais no Bash

As estruturas condicionais permitem que o Bash execute comandos com base em condições específicas. Elas são implementadas principalmente com `if`, `elif`, `else` e o comando `test` (ou sua notação `[ ]`). O computador avalia a condição, determina se é verdadeira (código de saída 0) ou falsa (código de saída diferente de 0) e executa o bloco correspondente.

### Sintaxe Básica do `if`

```bash
if [ condição ]; then
  # Comandos se a condição for verdadeira
else
  # Comandos se a condição for falsa
fi
```

* `[ condição ]`: Usa o comando `test` para avaliar a condição. Espaços dentro de `[` e `]` são obrigatórios.
* `then`: Inicia o bloco de comandos para condição verdadeira.
* `fi`: Encerra a estrutura condicional.

### Comportamento do Computador

O Bash avalia a condição dentro de `[ ]` executando o comando `test`, que retorna um **código de saída**:

* **0**: Condição verdadeira, executa o bloco `then`.
* **Não 0**: Condição falsa, executa o bloco `else` (se presente) ou pula o bloco.

Exemplo:

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

* O computador verifica se `$idade` (20) é maior ou igual a 18 usando `-ge`.
* Como `20 >= 18` é verdadeiro, o `test` retorna 0, e o Bash executa `echo "Maior de idade"`.

### Operadores de Comparação

#### Para Números

* `-eq`: Igual (equal).
* `-ne`: Diferente (not equal).
* `-gt`: Maior que (greater than).
* `-ge`: Maior ou igual (greater or equal).
* `-lt`: Menor que (less than).
* `-le`: Menor ou igual (less or equal).

Exemplo:

```bash
numero=10
if [ "$numero" -eq 10 ]; then
  echo "Número é 10"
fi
```

#### Para Strings

* `=`: Igual.
* `!=`: Diferente.
* `-z`: String vazia.
* `-n`: String não vazia.

Exemplo:

```bash
nome="Alice"
if [ "$nome" = "Alice" ]; then
  echo "Nome é Alice"
fi
if [ -z "$nome" ]; then
  echo "Nome está vazio"
else
  echo "Nome não está vazio"
fi
```

#### Para Arquivos

* `-e <arquivo>`: Verifica se o arquivo existe.
* `-f <arquivo>`: Verifica se é um arquivo regular.
* `-d <diretório>`: Verifica se é um diretório.
* `-r <arquivo>`: Verifica se é legível.
* `-w <arquivo>`: Verifica se é gravável.
* `-x <arquivo>`: Verifica se é executável.

Exemplo:

```bash
arquivo="teste.txt"
if [ -f "$arquivo" ]; then
  echo "Arquivo existe"
else
  echo "Arquivo não existe"
fi
```

### Condições Compostas

Use operadores lógicos para combinar condições:

* `&&`: E lógico (AND).
* `||`: Ou lógico (OR).
* `!`: Negação.

Exemplo:

```bash
idade=25
nome="Alice"
if [ "$idade" -ge 18 ] && [ "$nome" = "Alice" ]; then
  echo "Adulto chamado Alice"
fi
```

* O computador avalia `[ "$idade" -ge 18 ]` (retorna 0) e `[ "$nome" = "Alice" ]` (retorna 0). Como ambos são verdadeiros, executa o bloco `then`.

### Estrutura `elif`

Permite testar múltiplas condições:

```bash
nota=85
if [ "$nota" -ge 90 ]; then
  echo "A"
elif [ "$nota" -ge 80 ]; then
  echo "B"
elif [ "$nota" -ge 70 ]; then
  echo "C"
else
  echo "D"
fi
```

* O computador avalia cada condição sequencialmente até encontrar uma verdadeira ou chegar ao `else`.
* Para `nota=85`, a condição `$nota -ge 80` é verdadeira, então exibe "B" e pula o restante.

### Estrutura `case`

Alternativa ao `if` para comparar uma variável contra vários valores:

```bash
fruta="maçã"
case "$fruta" in
  "maçã") echo "É uma maçã";;
  "banana") echo "É uma banana";;
  *) echo "Fruta desconhecida";;
esac
```

* O computador compara `$fruta` com cada padrão até encontrar uma correspondência ou usar o padrão padrão (`*`).
* Para `fruta="maçã"`, exibe "É uma maçã".

### Comportamento em Erros

Se uma condição for mal formada (ex.: variável indefinida sem aspas), o Bash pode gerar erros ou comportamento inesperado:

```bash
if [ $var -eq 10 ]; then  # Erro se var não está definida
  echo "Igual a 10"
fi
```

* Solução: Sempre use aspas em variáveis:

```bash
if [ "$var" -eq 10 ]; then
  echo "Igual a 10"
fi
```

### Testes Avançados

* **Expressões aritméticas**: Use `(())` para avaliações numéricas sem `[ ]`:

  ```bash
  idade=20
  if (( idade >= 18 )); then
    echo "Maior de idade"
  fi
  ```

  * O computador avalia a expressão diretamente, tratando variáveis como números.
* **Parâmetros opcionais**: Use valores padrão para variáveis indefinidas:

  ```bash
  : ${var:="padrão"}  # Define var como "padrão" se não definida
  echo "$var"
  ```

### Boas Práticas com Condicionais

* **Use aspas em variáveis**: Evita erros com variáveis vazias ou com espaços.
* **Espaços em `[ ]`**: `[ "$var" = "valor" ]` requer espaços antes e depois.
* **Valide entradas**: Antes de usar variáveis, verifique se estão definidas com `-z` ou `-n`.
* **Use `elif` para eficiência**: Evita múltiplos `if` aninhados.
* **Teste condições**: Use `echo` ou `set -x` para depurar condicionais.

## Variáveis e Tipagem (Resumo)

O Bash trata todas as variáveis como **strings** por padrão, sem tipagem estrita. Em contextos aritméticos (`$(())`), strings numéricas são convertidas em números. Para condicionais, use operadores apropriados (`-eq` para números, `=` para strings).

Exemplo:

```bash
numero="10"
if [ "$numero" -eq 10 ]; then  # Tratado como número
  echo "Número é 10"
fi
if [ "$numero" = "10" ]; then  # Tratado como string
  echo "String é 10"
fi
```

## Permissões e Execução

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

## Redirecionamento e Pipelines

Condicionais podem ser usadas com redirecionamentos:

```bash
arquivo="saida.txt"
if [ ! -f "$arquivo" ]; then
  echo "Arquivo criado" > "$arquivo"
fi
```

## Boas Práticas Gerais

* Comente condicionais para clareza.
* Teste scripts em ambientes seguros.
* Evite comandos destrutivos sem validação.
* Use `set -e` para interromper o script em erros.

## Recursos Adicionais

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

Essa documentação detalha as estruturas condicionais do Bash, explicando como o computador processa cada condição e fornecendo exemplos práticos. 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/2.-estruturas-condicionais.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.
