test, [ ] și [[ ]] în Linux / Bash

Scripting Bash POSIX (test, [ ]) / Bash ([[ ]])

Verifică fișiere, numere și texte și întoarce codul 0 (adevărat) sau 1 (fals), folosit în if, while și cu && / ||.

Sintaxă comandă
test EXPRESIE
[ EXPRESIE ]
[[ EXPRESIE ]]

Ce face test, [ ] și [[ ]]

Comanda test evaluează o expresie și nu afișează nimic: rezultatul este doar codul de ieșire (0 înseamnă adevărat, 1 înseamnă fals). Forma [ EXPRESIE ] este aceeași comandă, scrisă altfel; paranteza de închidere ] este ultimul argument și trebuie separată prin spațiu.

[[ EXPRESIE ]] este o construcție specifică Bash. Nu împarte variabilele în cuvinte, deci ghilimelele sunt mai puțin critice, acceptă && și || în interior, potrivire cu tipare (== *.pdf) și expresii regulate (=~). În scripturile #!/bin/sh folosește doar [ ].

Atenție la tipul comparației: -eq, -lt, -ge compară numere, iar =, != compară texte. [ 10 < 9 ] nu compară numere: în [ ] semnul < este o redirecționare.

Opțiuni și argumente

Opțiune / Parametru Descriere
-f FIȘIER / -d DIRECTOR Adevărat dacă există și este fișier obișnuit / director.
-e CALE Adevărat dacă există calea (fișier, director, link etc.).
-s FIȘIER Adevărat dacă fișierul există și nu este gol.
-r / -w / -x FIȘIER Adevărat dacă fișierul poate fi citit / scris / executat de utilizatorul curent.
-z TEXT / -n TEXT Adevărat dacă textul are lungimea zero / nu este gol.
A = B, A != B Texte egale / diferite (în [[ ]] se poate scrie și ==).
-eq, -ne, -lt, -le, -gt, -ge Comparații numerice: egal, diferit, mai mic, mai mic sau egal, mai mare, mai mare sau egal.
! EXPR Neagă expresia.
[[ A == tipar ]] Potrivire cu tipar de tip glob (*, ?, [abc]); tiparul nu se pune între ghilimele.
[[ A =~ regex ]] Potrivire cu expresie regulată extinsă; grupurile capturate ajung în tabloul BASH_REMATCH.

Exemple

Exemplul 1: Verificarea fișierelor și directoarelor

Testele de fișiere se combină des cu && și || pentru verificări scurte, pe un rând.

touch raport.txt
mkdir arhiva
[ -f raport.txt ] && echo "raport.txt este un fișier"
[ -d arhiva ] && echo "arhiva este un director"
[ -s raport.txt ] || echo "raport.txt este gol"
test -e lipsa.txt || echo "lipsa.txt nu există"

Rezultat

raport.txt este un fișier
arhiva este un director
raport.txt este gol
lipsa.txt nu există

Exemplul 2: Numere și texte cu [ ]

Variabilele stau între ghilimele, ca o valoare goală să nu strice expresia.

NOTA=8
ORAS="Iași"
if [ "$NOTA" -ge 5 ]; then
  echo "Promovat cu nota $NOTA"
fi
if [ "$ORAS" = "Iași" ]; then
  echo "Orașul este $ORAS"
fi
if [ -z "$PRENUME" ]; then
  echo "PRENUME nu este setat"
fi

Rezultat

Promovat cu nota 8
Orașul este Iași
PRENUME nu este setat

Exemplul 3: Tipare și expresii regulate cu [[ ]]

Grupul din paranteze al expresiei regulate se citește din BASH_REMATCH[1].

FISIER="factura_2026.pdf"
if [[ $FISIER == *.pdf ]]; then
  echo "Este un PDF"
fi
if [[ $FISIER =~ ^factura_([0-9]{4})\.pdf$ ]]; then
  echo "Anul facturii: ${BASH_REMATCH[1]}"
fi
NOTA=9
if [[ $NOTA -ge 1 && $NOTA -le 10 ]]; then
  echo "Nota $NOTA este validă"
fi

Rezultat

Este un PDF
Anul facturii: 2026
Nota 9 este validă

Greșeli frecvente

  • Lipsa spațiilor: ["$a"="b"] sau [ "$a"="b" ] nu fac comparația pe care o aștepți. Fiecare operator și fiecare paranteză sunt argumente separate: [ "$a" = "b" ].
  • Variabile fără ghilimele în [ ]: dacă $NUME este gol, [ $NUME = Ana ] devine [ = Ana ] și dă eroare.
  • Folosirea lui > sau < pentru numere în [ ]: se creează un fișier numit după al doilea operand. Pentru numere folosește -gt / -lt sau (( a > b )).
  • Expresia regulată pusă între ghilimele în [[ $x =~ "^[0-9]+$" ]]: Bash o tratează ca text literal. Pune regex-ul într-o variabilă sau scrie-l fără ghilimele.

Comenzi înrudite

  • if / else: Execuția condiționată a blocurilor de comenzi pe baza codurilor de ieșire sau a testelor logice.
  • while: Execută repetat un bloc de comenzi atâta timp cât condiția specificată rămâne adevărată.
  • Coduri de ieșire ($?, &&, ||): Fiecare comandă întoarce un cod: 0 pentru succes, 1-255 pentru eroare. Se citește cu $? și se folosește cu && și ||.
  • Aritmetică în Bash: $(( )) și (( )): Calcule cu numere întregi direct în shell: adunări, împărțiri, rest, puteri, contoare și comparații în (( )).