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.