Tablouri în Bash (indexate și asociative) în Linux / Bash

Scripting Bash Bash 2.0 (indexate), Bash 4.0 (asociative)

Liste de valori accesate prin index (tablou[0]) și dicționare cheie-valoare cu declare -A, cu parcurgere și numărare.

Sintaxă comandă
tablou=("a" "b" "c")
${tablou[0]}  ${tablou[@]}  ${#tablou[@]}
declare -A dictionar=([cheie]=valoare)

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 $tablou afiș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.