Guia Completo de Sintaxes Especiais, Variáveis e Expansões do Bash

Visão geral

Este artigo apresenta todas as sintaxes especiais, variáveis internas, regras de expansão e estruturas de controle usadas no shell Bash, de forma sistemática e prática.


Convenções de variáveis

Valores dinâmicos ou dependentes de ambiente são representados como <<variável>>.
Os exemplos a seguir demonstram a aplicação em diferentes contextos.

Variável Exemplo Descrição
<<var>> name, path, user Nome genérico de variável
<<default>> guest, 8080 Valor padrão ou alternativo
<<pattern>> *.txt, */ Padrão de nome de arquivo ou string
<<offset>> 0, 3 Posição inicial da substring (base 0)
<<length>> 4, 10 Comprimento da substring
<<prefix>> ENV_, HOST Prefixo de variável
<<index>> 0, 1, 2 Índice ou chave de array
<<file>> /tmp/test.txt Caminho de arquivo

Etapa 1: Metacaracteres

Símbolo Significado Exemplo
* Corresponde a qualquer sequência ls *.txt
? Corresponde a um caractere ls ?.sh
[a-z] Faixa de caracteres ls [A-Z]*
{a,b} Expansão de lista mv {foo,bar}
{1..3} Sequência numérica touch file{1..3}.txt
$ Expansão de variável echo $HOME
! (negação) Operador lógico de negação [[ ! -f test.txt ]]
! (histórico) Reexecução de comando anterior !10
~ Diretório home cd ~
; Comandos encadeados pwd; ls
&& Executa se sucesso make && echo OK
` `
& Execução em background sleep 5 &
` ` Encadeamento (pipe)
> Redireciona saída echo hi > out.txt
>> Acrescenta saída echo hi >> out.txt
< Redireciona entrada wc -l < file.txt
() Subshell (cd /tmp; ls)
{} Mesmo shell { echo A; echo B; }
\ Escape echo \$HOME
' ' Sem expansão echo '$USER'
" " Com expansão echo "$USER"

Etapa 2: Variáveis Especiais

Variável Conteúdo Exemplo
$0 Nome do script echo $0
$1〜$9 Argumentos echo $1
$@ Todos os argumentos for a in "$@"; do echo $a; done
$# Número de argumentos echo $#
$? Código de saída anterior ls /nope; echo $?
$$ PID atual echo $$
$! PID do último job BG sleep 10 & echo $!
$- Opções do shell echo $-
$_ Último argumento echo $_
$PPID PID pai echo $PPID
$RANDOM Aleatório (0–32767) echo $RANDOM
$SECONDS Segundos desde início echo $SECONDS
$FUNCNAME Nome da função f(){ echo $FUNCNAME; }; f
$PIPESTATUS[@] Códigos de saída do pipe `ls

Etapa 3: Expansão de Variáveis

Sintaxe Descrição Exemplo
${<<var>>} Expansão name=user; echo ${name}
${<<var>>:-<<default>>} Usa valor padrão se indefinido echo ${user:-guest}
${<<var>>:=<<default>>} Atribui se indefinido echo ${port:=8080}
${<<var>>:+alt} Usa alternativo se definido x=1; echo ${x:+OK}
${<<var>>:?msg} Erro se indefinido echo ${config:?config missing}
${#<<var>>} Comprimento da string echo ${#name}
${<<var>>%<<pattern>>} Remove sufixo curto path=/a/b/c; echo ${path%/*}
${<<var>>%%<<pattern>>} Remove sufixo longo echo ${path%%/*}
${<<var>>#<<pattern>>} Remove prefixo curto echo ${path#*/}
${<<var>>##<<pattern>>} Remove prefixo longo echo ${path##*/}
${<<var>>/<<pattern>>/<<repl>>} Substitui primeira ocorrência echo ${msg/foo/bar}
${<<var>>//<<pattern>>/<<repl>>} Substitui todas echo ${msg// /_}
${<<var>>:<<offset>>} Substring s=abcdef; echo ${s:2}
${<<var>>:<<offset>>:<<length>>} Substring parcial echo ${s:1:3}
${!<<prefix>>*} Lista por prefixo HOST1=x; HOST2=y; echo ${!HOST*}
${!<<var>>} Referência indireta ref=NAME; NAME=user; echo ${!ref}
${<<var>>,} / ${<<var>>^^} Case alternância n=abc; echo ${n^^}
${<<var>>@Q} Aspas seguras x='abc'; echo ${x@Q}

Etapa 4: Arrays e Associativos

arr=(a b c)
echo ${arr[<<index>>]}
echo ${#arr[@]}
for i in "${arr[@]}"; do echo $i; done

declare -A map
map[<<index>>]=100
map[name]=user
echo ${map[<<index>>]}
echo ${!map[@]}

Etapa 5: Expansões Aritméticas

x=5; y=3
echo $((x + y))
((x *= 2))
echo $x

Etapa 6: Condições e Comparações

if [ "$USER" = "root" ]; then echo root; fi
if [ "$x" -lt 10 ]; then echo pequeno; fi
if [ -f /etc/passwd ]; then echo existe; fi
s="hello123"
[[ $s =~ [0-9]+ ]] && echo contém número

Etapa 7: Subshells e Substituição de Comando

echo "Hoje: $(date +%Y-%m-%d)"
(cd /tmp; ls)

Etapa 8: Redirecionamentos e Descritores

echo "Hello" > <<file>>
echo "Append" >> <<file>>
wc -l < <<file>>
ls /nope 2> err.log
echo "OK" >&2
exec 3> custom.log
echo "via fd3" >&3
exec 3>&-

Conceito: File Descriptor (FD)

FD Nome Função Exemplo
0 stdin Entrada padrão < file.txt
1 stdout Saída padrão echo test > out.txt
2 stderr Erros ls /nope 2> err.log
3+ Custom Definido pelo usuário exec 3> log.txt

Exemplo prático:

exec 3> process.log
echo "Início" >&3
exec 3>&-

Etapa 9: Traps e Controle de Erros

set -e
set -u
set -x
set -o pipefail
trap 'echo Encerrado' EXIT
trap 'echo Erro' ERR

Etapa 10: Controle de Jobs

sleep 10 &
jobs
fg %1
bg %1
disown %1
kill %1

%1 e Identificadores

sleep 60 &
jobs
# [1]+ Running sleep 60 &
fg %1
Símbolo Significado
%1 Job número 1
%+ Job atual
%- Job anterior

Etapa 11: Comandos Especiais

:
true
false
source ~/.bashrc
eval "echo executado"
{ echo A; echo B; }

Conclusão

Este guia abrangeu todas as sintaxes especiais, variáveis e expansões do Bash.
Compreender esses mecanismos permite desenvolver scripts robustos, reutilizáveis e seguros, otimizando a automação no Linux.