Expansao de Parametros do bash — Entendendo ${var:-x} e Sintaxes Relacionadas
O Que e Expansao de Parametros?
A expansao de parametros do bash (${var}) vai muito alem da simples substituicao de variaveis. Voce pode definir valores padrao, extrair substrings, remover prefixos e sufixos por padrao, realizar substituicoes e alterar maiusculas/minusculas — tudo sem iniciar processos externos como sed ou awk.
Guia de Referencia Completo
| Sintaxe | Comportamento |
|---|---|
${var} |
Expande variavel (chaves evitam ambiguidade) |
${var:-val} |
Retorna val se nao definida ou vazia (sem atribuicao) |
${var:=val} |
Atribui e retorna val se nao definida ou vazia |
${var:+val} |
Retorna val se definida e nao vazia |
${var:?msg} |
Imprime msg no stderr e sai se nao definida ou vazia |
${#var} |
Comprimento do valor da variavel |
${var:N} |
Substring do offset N ate o final |
${var:N:L} |
Substring do offset N com comprimento L |
${var#pat} |
Remove menor prefixo correspondente a pat |
${var##pat} |
Remove maior prefixo correspondente a pat |
${var%pat} |
Remove menor sufixo correspondente a pat |
${var%%pat} |
Remove maior sufixo correspondente a pat |
${var/pat/rep} |
Substitui primeira correspondencia de pat por rep |
${var//pat/rep} |
Substitui todas as correspondencias de pat por rep |
${var/#pat/rep} |
Substitui pat apenas se ancorado no inicio |
${var/%pat/rep} |
Substitui pat apenas se ancorado no final |
${var^} |
Primeira letra maiuscula (Bash 4+) |
${var^^} |
Todas maiusculas (Bash 4+) |
${var,} |
Primeira letra minuscula (Bash 4+) |
${var,,} |
Todas minusculas (Bash 4+) |
Padroes de Valor Padrao (:- / := / :+ / :?)
Estes quatro operadores lidam de forma limpa com o problema "e se a variavel nao estiver definida?".
${var:-val} — Retorna val se nao definida ou vazia
O operador mais comum. Retorna val quando var nao esta definida ou esta vazia. Nao modifica var.
name=${1:-"world"}
echo "Hello, ${name}!"
# Sem argumento → Hello, world!
# Argumento "Alice" → Hello, Alice!LOG_DIR=${LOG_DIR:-/var/log/myapp}
echo "Logging to: ${LOG_DIR}"${var:=val} — Atribui val se nao definida ou vazia
Como :-, mas tambem atribui val a var. A variavel mantem o valor para uso subsequente.
: ${TMPDIR:=/tmp}
echo "${TMPDIR}" # /tmp (se nao estava definida):= nao funciona com parametros posicionais ($1, $2, etc.). Use :- para esses.
${var:+val} — Retorna val se definida e nao vazia
O inverso de :-. Retorna val somente quando var esta definida e nao vazia.
VERBOSE=1
msg="Done${VERBOSE:+ (verbose mode)}"
echo "$msg" # Done (verbose mode)
unset VERBOSE
msg="Done${VERBOSE:+ (verbose mode)}"
echo "$msg" # Done${var:?msg} — Sai com erro se nao definida ou vazia
Impoe variaveis obrigatorias. Imprime msg no stderr e sai com status 1.
#!/bin/bash
set -e
DB_HOST=${DB_HOST:?"DB_HOST is not set"}Combine com set -u para a disciplina mais rigorosa de variaveis; :? adiciona uma mensagem personalizada que set -u sozinho nao pode fornecer.
Comprimento de String e Extracao de Substring
${#var} — Comprimento da String
str="Hello, World"
echo ${#str} # 12${var:N:L} — Substring
Extrai L caracteres comecando no offset N. Omita L para ir ate o final.
date_str="2026-06-02"
echo ${date_str:0:4} # 2026 (ano)
echo ${date_str:5:2} # 06 (mes)
echo ${date_str:8} # 02 (dia)Para offsets negativos (contar do final), escreva ${var: -2} com um espaco, ou ${var:(-2)}. Sem o espaco, ${var:-2} e o operador de "valor padrao", nao um offset negativo.
str="Hello"
echo ${str: -3} # llo (ultimos 3 caracteres)Remocao de Padrao (# / ## / % / %%)
Ideal para remover componentes de caminho e extensoes de arquivo sem chamar basename ou dirname.
Remover prefixo (# / ##)
${var#pat}— remove o menor prefixo correspondente a pat${var##pat}— remove o maior prefixo correspondente a pat
path="/home/user/docs/report.txt"
echo ${path#*/} # home/user/docs/report.txt (remove / inicial)
echo ${path##*/} # report.txt (remove tudo ate a ultima /)Alternativa portavel ao basename:
file="/home/user/docs/report.tar.gz"
echo ${file##*/} # report.tar.gzRemover sufixo (% / %%)
${var%pat}— remove o menor sufixo correspondente a pat${var%%pat}— remove o maior sufixo correspondente a pat
file="report.tar.gz"
echo ${file%.*} # report.tar (remove ultima extensao)
echo ${file%%.*} # report (remove todas as extensoes)Alternativa portavel ao dirname:
path="/home/user/docs/report.txt"
echo ${path%/*} # /home/user/docsPadroes suportam globs. ${var#*_} remove ate e incluindo o primeiro _; ${var##*_} remove ate e incluindo o ultimo _.
Substituicao de Padrao (/ / //)
${var/pat/rep} — Substituir primeira correspondencia
msg="foo bar foo"
echo ${msg/foo/baz} # baz bar foo${var//pat/rep} — Substituir todas as correspondencias
msg="foo bar foo"
echo ${msg//foo/baz} # baz bar bazSubstituicao ancorada
str="foo-bar-foo"
echo ${str/#foo/baz} # baz-bar-foo (apenas no inicio)
echo ${str/%foo/baz} # foo-bar-baz (apenas no final)Padroes sao padroes glob, nao expressoes regulares. Para correspondencia com regex, use [[ $str =~ pattern ]].
Conversao de Maiusculas/Minusculas (Bash 4+)
Estes operadores requerem Bash 4.0 ou posterior. macOS vem com Bash 3.x por padrao; use brew install bash ou zsh para acessar esses recursos.
| Sintaxe | Comportamento | Exemplo |
|---|---|---|
${var^} |
Primeira letra maiuscula | hello --> Hello |
${var^^} |
Todas maiusculas | hello --> HELLO |
${var,} |
Primeira letra minuscula | HELLO --> hELLO |
${var,,} |
Todas minusculas | HELLO --> hello |
name="alice"
echo ${name^} # Alice
echo ${name^^} # ALICEReceitas Praticas
Obter e trocar extensao de arquivo
file="image.png"
ext=${file##*.} # png
base=${file%.*} # image
new="${base}.webp" # image.webpValores padrao de argumentos de script
#!/bin/bash
ENV=${1:-production}
PORT=${2:-8080}
echo "Starting: env=${ENV} port=${PORT}"Impor variaveis de ambiente obrigatorias
#!/bin/bash
: ${API_KEY:?"API_KEY is not set. Run: export API_KEY=..."}
: ${DB_URL:?"DB_URL is not set"}Extrair dominio de uma URL
url="https://example.com/path/to/page"
no_proto=${url#*://} # example.com/path/to/page
domain=${no_proto%%/*} # example.comNormalizar nivel de log para minusculas
level="WARNING"
echo ${level,,} # warningNome de arquivo seguro (substituir espacos por underscores)
filename="my report 2026.txt"
safe=${filename// /_} # my_report_2026.txt