Expansiunea parametrilor (${var:-implicit}, ${var#prefix}) în Linux / Bash

Scripting Bash POSIX (:-, :=, #, %) / Bash (/, :poz:lung)

Valori implicite, tăierea prefixelor și sufixelor, înlocuiri și subșiruri direct în Bash, fără sed sau cut.

Sintaxă comandă
${var:-implicit}  ${var:=implicit}  ${var:?mesaj}  ${var:+alt}
${var#prefix}  ${var##prefix}  ${var%sufix}  ${var%%sufix}
${var/vechi/nou}  ${#var}  ${var:poz:lung}

Ce face Expansiunea parametrilor (${var:-implicit}, ${var#prefix})

Între acolade, Bash poate transforma valoarea unei variabile în momentul în care o citește. Primul grup de forme tratează variabilele goale sau nedefinite: ${PORT:-8080} folosește 8080 fără să modifice variabila, ${PORT:=8080} o și setează, ${PORT:?mesaj} oprește scriptul cu un mesaj, iar ${DEBUG:+--verbose} dă textul alternativ doar dacă variabila are valoare.

Al doilea grup taie text după un tipar glob: # elimină cel mai scurt prefix care se potrivește, ## pe cel mai lung, % cel mai scurt sufix, %% pe cel mai lung. Astfel se obțin numele fișierului, directorul sau extensia unei căi, fără basename, dirname sau sed.

Bash mai adaugă înlocuirea ${var/vechi/nou} (prima apariție) și ${var//vechi/nou} (toate), lungimea ${#var} și subșirul ${var:poz:lung}. Fără : (de exemplu ${var-implicit}), o variabilă setată, dar goală, nu primește valoarea implicită.

Opțiuni și argumente

Opțiune / Parametru Descriere
${var:-text} text dacă variabila este goală sau nedefinită; variabila nu se schimbă.
${var:=text} Ca mai sus, dar atribuie și valoarea variabilei.
${var:?mesaj} Oprește scriptul cu mesaj dacă variabila este goală sau nedefinită.
${var:+text} text doar dacă variabila are valoare; altfel șir gol.
${var#tipar} / ${var##tipar} Elimină cel mai scurt / cel mai lung prefix potrivit.
${var%tipar} / ${var%%tipar} Elimină cel mai scurt / cel mai lung sufix potrivit.
${var/vechi/nou} Înlocuiește prima apariție; // le înlocuiește pe toate.
${#var} Lungimea valorii, în caractere.
${var:poz:lung} Subșir de lungime lung de la poziția poz (0 = primul caracter); ${var: -4} dă ultimele 4.

Exemple

Exemplul 1: Valori implicite pentru configurare

:- doar înlocuiește la citire, := salvează valoarea în variabilă.

unset PORT MEDIU
echo "Port: ${PORT:-8080}"
echo "PORT după :- este '${PORT}'"
echo "Mediu: ${MEDIU:=productie}"
echo "MEDIU după := este '$MEDIU'"
DEBUG=1
echo "Opțiuni: ${DEBUG:+--verbose}"

Rezultat

Port: 8080
PORT după :- este ''
Mediu: productie
MEDIU după := este 'productie'
Opțiuni: --verbose

Exemplul 2: Numele, directorul și extensia unei căi

Cu */ și .* ca tipare, tăierea prefixelor și sufixelor înlocuiește basename și dirname.

CALE="/home/ana/poze/iasi_2026.tar.gz"
NUME="${CALE##*/}"
echo "Nume fișier: $NUME"
echo "Director: ${CALE%/*}"
echo "Fără ultima extensie: ${NUME%.*}"
echo "Fără nicio extensie: ${NUME%%.*}"
echo "Extensie completă: ${NUME#*.}"

Rezultat

Nume fișier: iasi_2026.tar.gz
Director: /home/ana/poze
Fără ultima extensie: iasi_2026.tar
Fără nicio extensie: iasi_2026
Extensie completă: tar.gz

Exemplul 3: Înlocuiri, lungime și subșiruri

Cu un singur / se schimbă doar prima apariție. Spațiul din ${IBAN: -4} este necesar pentru poziții negative.

TEXT="Ana are mere, Ana are pere"
echo "${TEXT/Ana/Maria}"
echo "${TEXT//Ana/Maria}"
IBAN="RO49AAAA1B31007593840000"
echo "Lungime: ${#IBAN}"
echo "Țara: ${IBAN:0:2}"
echo "Ultimele 4 cifre: ${IBAN: -4}"

Rezultat

Maria are mere, Ana are pere
Maria are mere, Maria are pere
Lungime: 24
Țara: RO
Ultimele 4 cifre: 0000

Greșeli frecvente

  • ${IBAN:-4} fără spațiu nu înseamnă „ultimele 4”: este forma de valoare implicită, care întoarce tot IBAN-ul. Scrie ${IBAN: -4}.
  • Confuzia între # și %: # taie de la început (prefix), % de la sfârșit (sufix).
  • Folosirea expresiilor regulate în tipare: ${var#[0-9]+} nu este regex, ci glob; + este un caracter obișnuit.

Comenzi înrudite

  • Variabile în Bash: Declararea, atribuirea, valorile implicite și expandarea corectă a variabilelor în Bash.
  • Tablouri în Bash (indexate și asociative): Liste de valori accesate prin index (tablou[0]) și dicționare cheie-valoare cu declare -A, cu parcurgere și numărare.
  • set -euo pipefail: Face un script Bash să se oprească la prima eroare, la variabile nedefinite și la comenzi eșuate din pipeline.
  • sed: Editor de flux (stream editor) pentru transformarea, înlocuirea și filtrarea automată a textului.