Parantezele pătrate sunt o notație abreviere pentru efectuarea unui test condițional. Parantezele [
, precum și [[
sunt comenzi reale în Unix, credeți-le sau nu.
Gândiți-vă:
$ [ -f /etc/rc.local ] && echo "real file" real file -and- $ test -f /etc/rc.local && echo "real file" real file
În Bash [
este o comandă încorporată, precum și un executabil. [[
este doar un cuvânt cheie pentru Bash.
Exemplu
Puteți confirma acest lucru folosind type
:
$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword
Puteți vedea executabilul fizic aici:
$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[
builtins vs. . cuvinte cheie
Dacă aruncați o privire la pagina manuală Bash, man bash
, veți găsi următoarele definiții pentru cele 2:
-
cuvinte cheie – Cuvintele rezervate sunt cuvinte care au o semnificație specială pentru shell. Următoarele cuvinte sunt recunoscut ca rezervat atunci când nu este citat și fie primul cuvânt al unei comenzi simple (vezi GRAMATICA SHELL mai jos), fie al treilea cuvânt al unui caz sau pentru comandă:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
-
builtins – Dacă numele comenzii nu conține bare oblice, shell-ul încearcă să îl localizeze. Dacă există există o funcție shell cu acel nume, acea funcție este invocată așa cum este descris mai sus în F UNȚIUNI. Dacă numele nu se potrivește cu o funcție, shell-ul o caută în lista de shell-uri încorporate. Dacă se găsește o potrivire, se invocă acel program integrat.
Dacă numele nu este nici o funcție shell, nici un program încorporat și nu conține bare oblice, bash caută în fiecare element al PATH un director care conține un fișier executabil de către acel nume. Bash folosește un tabel hash pentru a vă aminti numele de cale complete ale fișierelor executabile (vedeți hash sub SHELL BUILTIN COMMANDS mai jos). O căutare completă a directoarelor din PATH se efectuează numai dacă comanda nu este găsită în tabelul hash. Dacă căutarea nu reușește, shell-ul caută o funcție shell definită numită command_not_found_handle. Dacă această funcție există, este invocată cu comanda originală și argumentele comenzii originale ca argumente, iar starea de ieșire a funcției devine starea de ieșire a shell-ului. Dacă această funcție nu este definită, shell-ul imprimă un mesaj de eroare și returnează o stare de ieșire de 127.
pagina manual
Dacă priviți prin Pagina manuală Bash veți găsi detaliile pe ea.
test expr [ expr ] Return a status of 0 or 1 depending on the evaluation of the conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described above under CONDITIONAL EXPRESSIONS. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options.
În cele din urmă, din pagina manuală:
test and [ evaluate conditional expressions using a set of rules based on the number of arguments.
EDITARE # 1
Întrebare de urmărire din OP.
Ok, deci de ce există o nevoie de un „dacă” atunci? Adică, de ce „dacă” există chiar dacă „[” ar fi suficient.
if
face parte dintr-un condițional. Comanda test
sau comanda [ ... ]
evaluează pur și simplu condiționalul și returnează un 0 sau a 1. 0 sau 1 este apoi acționat de instrucțiunea if. Cele 2 funcționează împreună atunci când le utilizați.
Exemplu
if [ ... ]; then ... do this ... else ... do that ... fi
Comentarii
Ooohh, unul dintre subiectele mele preferate !!
Parantezele pătrate sunt un sinonim pentru comanda „test”. Dacă citiți pagina manuală de testare, veți vedea că puteți invoca comanda de testare fie ca
test -r /etc/profile.d/java.sh
, fie
[ -r /etc/profile.d/java.sh ]
Spațiile dintre paranteze și elementele din interior și din exterior sunt necesare.
Comanda„ test ”în acest caz verifică dacă fișierul / etc / profile.d / java.sh este lizibil pentru utilizatorul curent. Implicat este o verificare pentru a vedea dacă există, desigur. 🙂
&&
este o comandă rapidă de sintaxă bash pentru „dacă comanda din stânga reușește, atunci executați comanda din dreapta. Deci, această comandă compusă este o prescurtare pentru un „dacă-atunci” care ar arăta astfel:
if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi
Acum, veți găsi și paranteze pătrate duble explicat în pagina de manual bash. Acestea sunt o versiune internă bash a unei funcții de testare extinse. Rețineți că acestea nu sunt exact aceleași. Există lucruri pe care le puteți face cu cele pe care nu le puteți face cu comanda „test” și „ [„synonym.
Comentarii