Expansao de Parametros do bash — Entendendo ${var:-x} e Sintaxes Relacionadas

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

Remover 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/docs

Padroes 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 baz

Substituicao 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^^}   # ALICE

Receitas Praticas

Obter e trocar extensao de arquivo

file="image.png"
ext=${file##*.}        # png
base=${file%.*}        # image
new="${base}.webp"     # image.webp

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

Normalizar nivel de log para minusculas

level="WARNING"
echo ${level,,}   # warning

Nome de arquivo seguro (substituir espacos por underscores)

filename="my report 2026.txt"
safe=${filename// /_}   # my_report_2026.txt

Proximas Leituras