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ă$NUMEeste 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/-ltsau(( 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 (( )).