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
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.