Comanda test

Sfaturi pentru utilizarea comenzii test

Comanda [, numită adesea „test”, este o comandă din pachetul GNU Core Utils și inițiază o instrucție condiționată în Bash.

Funcția sa este exact aceeași cu cea a comenzii test. Atunci când doriți să executați o comandă numai atunci când ceva este fie adevărat, fie fals, utilizați comanda [ sau comanda test.

Cu toate acestea, există o diferență semnificativă între [ sau test și [[, și există o diferență tehnică între aceste comenzii și versiunile lor din shell-ul dumneavoastră.

Comanda test vs [

Comenzile [ și test, instalate de pachetul GNU Core Utils, îndeplinesc aceeași funcție folosind o sintaxă ușor diferită.

Cu toate acestea, s-ar putea să vi se pară dificil să căutați documentația folosind un singur caracter de paranteză pătrată stânga, așa că mulți utilizatori consideră că test este mai ușor de consultat.

Se întâmplă ca Bash și alte shell-uri similare să aibă încorporate și comenzile [ și test, iar versiunile încorporate le înlocuiesc pe cele instalate în /usr/bin. Cu alte cuvinte, atunci când utilizați [ sau test, probabil că nu executați /usr/bin/[ sau /usr/bin/test. În schimb, invocați ceea ce este, în esență, o funcție a shell-ului Bash.

S-ar putea să vă întrebați de ce [ sau test există în /usr/bin. Unele shell-uri, cum ar fi tcsh, nu au [ și test încorporate, așa că, dacă doriți să utilizați aceste comenzi în acel shell, trebuie să le aveți instalate ca binare separate.

În concluzie, atât timp cât nu primiți o eroare atunci când tastați o comandă care începe cu [ sau test, atunci aveți tot ce vă trebuie. Aproape niciodată nu contează dacă shell-ul sau directorul bin furnizează comenzile.

Testare pentru un fișier

Se întâmplă frecvent să doriți să știți dacă un fișier există, adesea pentru a putea continua cu încredere o acțiune sau pentru a evita să îl „distrugeți” cu un fișier cu același nume.

Într-o sesiune interactivă de shell, puteți verifica dacă fișierul există sau nu, dar într-un script shell, calculatorul trebuie să determine singur acest lucru.

Opțiune -e testează dacă un fișier există, dar răspunsul său aparent este același în ambele cazuri.

$ touch exemplu
$ test -e exemplu
$ test -e notițe

Comenzile [ și test sunt în esență comutatoare. Acestea transmit un răspuns true sau false, dar le consideră pe amândouă ca fiind pozitive.

Puteți utiliza acest lucru prin asocierea comenzilor cu operatori logici, cum ar fi && și ||. Operatorul && este executat atunci când un răspuns este adevărat.

$ touch exemplu
$ test -e exemplu && echo „foo”
foo
$ test -e notițe && echo „foo”
$

Operatorul || se execută atunci când un răspuns este fals.

$ touch exemplu
$ test -e exemplu || echo „foo”
$ test -e notițe || echo „foo”
foo
$

Dacă preferați, puteți utiliza paranteze pătrate în loc de test. În toate cazurile, rezultatele sunt aceleași.

$ touch exemplu
$ [ -e exemplu ] && echo foo”
foo
$ [ -e notițe ] && echo „foo”
$

Testare pentru tipuri de fișiere

Totul în Linux este un fișier, astfel încât atunci când puteți testa existența unui director cu opțiunea -e, la fel cum testați existența unui fișier.

Cu toate acestea, există diferite tipuri de fișiere și, uneori, acest lucru contează. Puteți utiliza [ sau test pentru a detecta o varietate de tipuri de fișiere diferite.

  • -f: fișier obișnuit (răspunsul este fals pentru un director)
  • -d: director
  • -b: bloc (cum ar fi /dev/sda1)
  • -L sau -h: legătură simbolică (symlink)
  • -S: socket

Mai sunt și altele, dar acestea tind să fie cele mai frecvente.

Testare pentru atributele fișierelor

De asemenea, vă puteți uita la metadatele unui fișier.

  • -s: un fișier cu dimensiunea mai mare decât zero
  • -N: un fișier care a fost modificat de când a fost citit ultima dată

Puteți testa în funcție de proprietate.

  • -O: un fișier deținut de utilizatorul principal curent
  • -G: un fișier deținut de grupul primar curent

Sau puteți testa în funcție de permisiuni (sau de modul de fișier).

  • -r: un fișier cu permisiunea de citire acordată
  • -w: un fișier cu permisiunea de scriere acordată
  • -x: un fișier cu permisiunea de execuție acordată
  • -k: un fișier cu atributul sticky bit setat

Combinarea testelor

Nu trebuie să testați întotdeauna doar un singur atribut. Opțiunea -a („and”) vă permite să înșiruiți mai multe teste împreună, cu cerința ca toate testele să returneze true.

$ touch apocalipsa zombi acum
$ test -e apocalipsa -a -e zombi -a -e acum && echo "nu mulțumesc"
nu mulțumesc

Dacă vreuna dintre expresii nu reușește, atunci testul returnează false.

$ touch apocalipsa zombi acum
$ test -e plantă -a -e zombi -a -e acum && echo "nu mulțumesc"
$

Opțiunea -o („or”) impune ca una dintre expresii să fie adevărată.

$ touch apocalipsa zombi acum
$ test -e apocalipsa -o -e plantă -o -e apocalipsa && echo "nu mulțumesc"
nu mulțumesc

Teste cu numere întregi

De asemenea, puteți testa numere întregi. Acest lucru nu este neapărat util în mod direct (probabil că știți în mod inerent că 0 este mai mic decât 1, de exemplu), dar este de neprețuit atunci când folosiți variabile într-un script.

Operatorii sunt destul de intuitivi odată ce ați înțeles schema.

  • -eq: egal cu
  • -ne: nu este egal
  • -ge: mai mare sau egal cu
  • -gt: mai mare decât
  • -le: mai mic sau egal cu
  • -lt: mai mic decât

Iată un exemplu simplu:

$ nil=0
$ foo=1
$ test $foo -eq $nil || echo "Acestea nu sunt egale."
Acestea nu sunt egale.
$ test $foo -eq 1 && echo "Acestea sunt egale."

Bineînțeles, puteți combina testele.

$ touch exemplu
$ test $foo -ne $nil -a -e exemplu -o -e notițe && echo "yes"
yes

De final

Comenzile [ și test sunt instrucțiuni condiționate vitale în scripting. Acestea sunt modalități simple și obișnuite de a controla fluxul de cod.

Există mai multe teste disponibile decât cele pe care le-am acoperit în acest articol, așa că, indiferent dacă ați folosit Bash, tcsh, ksh sau un alt shell în întregime, aruncați o privire pe pagina man pentru a obține întregul spectru de ceea ce oferă aceste comenzii.

ThinkRoot99

Numele meu este Cristian Moldovan și sunt utilizator de Linux de peste 10 ani.Am făcut parte din mai multe echipe open source din România: Fundația Ceata, Linux Mint România, Rogentos Linux Group. Între 2014 și 2018 am fost propietarul și editorul site-ului de știri despre linux, gnulinux.ro și actual proprietar al rootlinux.ro

View all posts by ThinkRoot99 →

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *