Ce face Tablouri în Bash (indexate și asociative)
Un tablou indexat păstrează mai multe valori într-o singură variabilă: orase=("Iași" "Cluj-Napoca"). Indexul pornește de la 0, ${orase[@]} înseamnă toate elementele, ${#orase[@]} numărul lor, iar orase+=("Brașov") adaugă la final.
Tablourile asociative (dicționare) folosesc chei text în loc de numere și trebuie declarate cu declare -A. Există din Bash 4.0; pe macOS, Bash-ul livrat implicit este 3.2 și nu le acceptă. Ordinea cheilor la parcurgere nu este garantată: sortează rezultatul dacă ordinea contează.
Scrie întotdeauna "${tablou[@]}" între ghilimele: fiecare element rămâne un singur cuvânt, chiar dacă conține spații.
Opțiuni și argumente
| Opțiune / Parametru | Descriere |
|---|---|
${t[i]} |
Elementul de la indexul (sau cheia) i. |
"${t[@]}" |
Toate elementele, fiecare ca argument separat. |
${#t[@]} |
Numărul de elemente. |
${!t[@]} |
Lista indexurilor (sau a cheilor, la tablourile asociative). |
t+=(x y) |
Adaugă elemente la final. |
${t[@]:start:n} |
Feliere: n elemente începând cu poziția start. |
unset 't[i]' |
Șterge un element; indexurile celorlalte nu se renumerotează. |
declare -A t |
Declară un tablou asociativ (Bash 4.0+). |
Exemple
Exemplul 1: Un tablou indexat de orașe
Adăugăm un element, citim primul și ultimul element și parcurgem lista.
orase=("Iași" "Cluj-Napoca" "Timișoara")
orase+=("Brașov")
echo "Primul oraș: ${orase[0]}"
echo "Număr de orașe: ${#orase[@]}"
echo "Ultimul oraș: ${orase[${#orase[@]}-1]}"
for oras in "${orase[@]}"; do
echo "- $oras"
done
Rezultat
Primul oraș: Iași
Număr de orașe: 4
Ultimul oraș: Brașov
- Iași
- Cluj-Napoca
- Timișoara
- Brașov
Exemplul 2: Indexuri, feliere și ștergere
După unset, indexul 1 dispare, dar celelalte își păstrează numerele.
note=(9 7 10 6)
echo "Notele 2 și 3: ${note[@]:1:2}"
unset 'note[1]'
echo "Indexuri rămase: ${!note[@]}"
echo "Note rămase: ${note[@]}"
Rezultat
Notele 2 și 3: 7 10
Indexuri rămase: 0 2 3
Note rămase: 9 10 6
Exemplul 3: Un tablou asociativ cu notele elevilor
Cheile pot conține spații dacă sunt puse între ghilimele. Parcurgerea trece prin sort, pentru o ordine previzibilă.
declare -A note
note[Ana]=9
note[Mihai]=7
note["Ioana Pop"]=10
echo "Nota Anei: ${note[Ana]}"
echo "Elevi: ${#note[@]}"
for elev in "${!note[@]}"; do
echo "$elev: ${note[$elev]}"
done | sort
Ieșire în terminal
Nota Anei: 9
Elevi: 3
Ana: 9
Ioana Pop: 10
Mihai: 7
Greșeli frecvente
echo $tablouafișează doar primul element. Pentru toate elementele scrie${tablou[@]}.- Parcurgerea cu
for x in ${tablou[@]}fără ghilimele: elementul „Cluj Napoca” devine două iterații. - Atribuirea pe chei text fără
declare -A: Bash tratează tabloul ca indexat, transformă cheia într-un număr (0) și suprascrie mereu același element.
Comenzi înrudite
Variabile în Bash: Declararea, atribuirea, valorile implicite și expandarea corectă a variabilelor în Bash.for: Iterează peste o listă de elemente, fișiere, argumente sau intervale de numere.mapfile / readarray: Citește rândurile unui fișier sau ale ieșirii unei comenzi într-un tablou Bash, câte un rând pe element.Expansiunea parametrilor (${var:-implicit}, ${var#prefix}): Valori implicite, tăierea prefixelor și sufixelor, înlocuiri și subșiruri direct în Bash, fără sed sau cut.