Skip to main content

Totul despre comanda Linux / Unix: expr

Comanda UNIX grep (Iunie 2025)

Comanda UNIX grep (Iunie 2025)
Anonim

Nume

expr - Evaluați o expresie

Rezumat

expr arg ? arg arg … ?

concatenează arg (adăugând spații separatoare între ele), evaluează rezultatul ca expresie Tcl și returnează valoarea. Operatorii permise în expresiile Tcl sunt un subset al operatorilor permiși în expresiile C și au același înțeles și precedență ca operatorii C corespunzători. Expresiile aproape întotdeauna dau rezultate numerice (valori întregi sau puncte în virgulă mobilă). De exemplu, expresia

expr 8.2 + 6

se evaluează la 14.2. Expresiile Tcl diferă de expresiile C în modul în care sunt specificate operanzii. De asemenea, expresiile Tcl acceptă operanzi non-numerici și comparații de șir.

operanzi

Expresia Tcl constă dintr-o combinație de operanzi, operatori și paranteze. Spațiul alb poate fi folosit între operanzi și operatori și paranteze; este ignorat de instrucțiunile expresiei. Unde este posibil, operanzii sunt interpretați ca valori întregi. Valorile întregi pot fi specificate în zecimal (cazul normal), în octal (dacă primul caracter al operandului este0) sau în hexazecimal (dacă sunt primele două caractere ale operandului0x). Dacă un operand nu are unul dintre formatele întregului dat mai sus, atunci acesta este tratat ca un număr în virgulă mobilă dacă este posibil. Numerele cu puncte în virgulă pot fi specificate în oricare dintre căile acceptate de un compilator C compatibil cu ANSI (cu excepția faptului căf, F, L, șiL sufixele nu vor fi permise în majoritatea instalațiilor). De exemplu, toate cele ce urmează sunt numere valide în virgulă mobilă: 2.1, 3., 6e4, 7.91e + 16. Dacă nu este posibilă interpretarea numerică, atunci un operand este lăsat ca un șir (și poate fi aplicat numai un număr limitat de operatori).

Operanzii pot fi specificați în oricare din următoarele moduri:

1

Ca valoare numerică, fie întreg, fie punct plutitor.

2

Ca variabilă Tcl, folosind standardul$ notaţie. Valoarea variabilei va fi folosită ca operand.

3

Ca un șir închis în dublu-citate. Parserul expresiei va efectua înlocuirea inversă, variabila și înlocuirea comenzii pe informațiile dintre ghilimele și va folosi valoarea rezultată ca operand

4

Ca o coardă închisă în bretele. Caracterele dintre brațul deschis și coada de potrivire apropiată vor fi folosite ca operand fără substituții.

5

Ca o comandă Tcl închisă între paranteze. Comanda va fi executată și rezultatul acesteia va fi folosit ca operand.

6

Ca o funcție matematică ale cărei argumente au oricare dintre formele de mai sus pentru operanzi, cum ar fisin ($ x). Vedeți mai jos o listă a funcțiilor definite.

În cazul în care înlocuirile apar mai sus (de exemplu, în interiorul șirurilor cotate), ele sunt efectuate prin instrucțiunile expresiei. Cu toate acestea, un paragraf suplimentar de substituire poate fi deja efectuat de parserul comenzii înainte ca procesorul de expresie să fie apelat. Așa cum am discutat mai jos, este de obicei cel mai bine să închideți expresii în brațe pentru a împiedica parserul comenzii să efectueze substituții asupra conținutului.

Pentru câteva exemple de expresii simple, presupuneți variabilaA are valoarea 3 și variabilabare valoarea 6. Apoi, comanda din partea stângă a fiecăreia dintre liniile de mai jos va produce valoarea din partea dreaptă a liniei:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * lungime "6 2" 8 expr {{cuvânt unu} <"cuvânt $ a"} 0

operatorii

Operatorii valida sunt listați mai jos, grupați în ordinea descrescătoare a precedenței:

- + ~ !

Minus unar, plus unar, NU bit, NU. Niciunul dintre acești operanzi nu poate fi aplicat operanților de șir, iar NOT-ul pe bază de biți nu poate fi aplicat numai întregilor.

* / %

Multiplicați, împărțiți, restul. Niciunul dintre acești operanzi nu poate fi aplicat operanzilor de șir, iar restul poate fi aplicat numai întregilor. Restul va avea întotdeauna același semn ca divizorul și o valoare absolută mai mică decât divizorul.

+ -

Adăugați și scădeți. Valabil pentru orice operand numeric.

<< >>

Traversarea stânga și dreapta. Valabil numai pentru operanzii întregi. O schimbare corectă propagă întotdeauna semnul biți.

< > <= >=

Boolean mai mic, mai mare, mai mic sau egal, și mai mare sau egal. Fiecare operator produce 1 dacă condiția este adevărată, altfel 0. Acești operatori pot fi aplicați și în șiruri, precum și în operanții numerici, caz în care se utilizează compararea șirului.

== !=

Boolean egal și nu egal. Fiecare operator produce un rezultat zero / unu. Valabil pentru toate tipurile de operand.

&

În buzunar ȘI. Valabil numai pentru operanzii întregi.

^

În mod exclusiv OR. Valabil numai pentru operanzii întregi.

|

Bit-înțelept SAU. Valabil numai pentru operanzii întregi.

&&

Logic AND. Produce un rezultat 1 dacă ambii operanzi sunt non-zero, 0 altfel. Valabil numai pentru operanzii booleeni și numerici (întregi sau în virgulă mobilă).

||

Logic OR. Produce un rezultat 0 dacă ambii operanzi sunt zero, altfel 1. Valabil numai pentru operanzii booleeni și numerici (întregi sau în virgulă mobilă).

X ? y : z

Dacă-atunci-altceva, ca în C. Dacă X evaluează la non-zero, atunci rezultatul este valoarea lui y . În caz contrar, rezultatul este valoarea lui z . X operand trebuie să aibă o valoare numerică.

Consultați manualul C pentru mai multe detalii cu privire la rezultatele obținute de fiecare operator. Toate grupurile de operatori binari de la stânga la dreapta în același nivel de prioritate. De exemplu, comanda

expr 4 * 2 <7

returnează 0.

&&, ||, și?: operatorii au o "evaluare leneșă", la fel ca în C, ceea ce înseamnă că operanzii nu sunt evaluați dacă nu sunt necesari pentru a determina rezultatul. De exemplu, în comandă

expr {$ v? a: b}

numai unul dinA sauB va fi efectiv evaluat, în funcție de valoarea lui$ v. Rețineți, totuși, că acest lucru este valabil numai dacă întreaga expresie este inclusă în bretele; în caz contrar, parserul Tcl va evalua ambeleA șiB înainte de a invocaexpr comanda.

Math Funcții

Tcl acceptă următoarele funcții matematice în expresii:

abs coshButurugasqrt acos dublalog10srand ca în exppowbronza un bronz podeaRandtanh ATAN2 FMODrundă tencui hypotpăcat cos intSinh

abs ( arg )

Returnează valoarea absolută a arg . Arg poate fi intreg sau punct plutitor, iar rezultatul este returnat in aceeasi forma.

acos ( arg )

Returnează cosinusul arc al arg , în intervalul 0, pi radiani. Arg ar trebui să se situeze în intervalul -1,1.

ca în( arg )

Returnează sinusul arc al arg , în raza -pi / 2, pi / 2. Arg ar trebui să se situeze în intervalul -1,1.

un bronz( arg )

Returnează tangenta arcului arg , în raza -pi / 2, pi / 2.

ATAN2 ( X y )

Returnează tangenta arcului y / X , în intervalul -pi, pi radiani. X și y nu pot fi ambele 0.

ceil ( arg )

Returnează valoarea minimă cel puțin egală cu arg .

cos ( arg )

Returnează cosinusul arg , măsurată în radiani.

cosh ( arg )

Returnează cosinusul hiperbolic din arg . Dacă rezultatul ar provoca o depășire, se va întoarce o eroare.

dubla( arg )

Dacă arg este o valoare plutitoare, se întoarce arg , altfel se convertește arg să plutească și să returneze valoarea convertită.

exp ( arg )

Returnează exponența arg , definit ca e ** arg . Dacă rezultatul ar provoca o depășire, va fi returnată o eroare.

podea( arg )

Returnează valoarea cea mai mare integrală nu mai mare de arg .

FMOD ( X y )

Returnează restul punctului variabil al împărțirii X de y . Dacă y este 0, se restituie o eroare.

hypot ( X y )

Calculează lungimea hipotenței unui triunghi cu unghi drept ( X * X + y * y ).

int ( arg )

Dacă arg este o valoare intreg, returneaza arg , altfel se convertește arg la intreg prin trunchiere și returnează valoarea convertită.

Buturuga( arg )

Returnează logaritmul natural al lui arg . Arg trebuie să fie o valoare pozitivă.

log10 ( arg )

Returnează logaritmul de bază 10 din arg . Arg trebuie să fie o valoare pozitivă.

pow ( X y )

Calculează valoarea X ridicată la putere y . Dacă X este negativ, y trebuie să fie o valoare întregă.

rand ()

Returnează un număr de punct variabil de la zero la doar mai puțin decât unul sau, din punct de vedere matematic, intervalul 0,1. Sămânța provine de la ceasul intern al mașinii sau poate fi setată manual cu funcția de funcionare.

rundă( arg )

Dacă arg este o valoare intreg, returneaza arg , altfel se convertește arg la intreg prin rotunjire și returnează valoarea convertită.

păcat( arg )

Returnează sinusoidul arg , măsurată în radiani.

Sinh ( arg )

Returnează sinele hiperbolic din arg . Dacă rezultatul ar provoca o depășire, va fi returnată o eroare.

sqrt ( arg )

Returnează rădăcina pătrată din arg . Arg trebuie să fie non-negative.

srand ( arg )

arg , care trebuie să fie un număr întreg, se utilizează pentru resetarea semințelor pentru generatorul de numere aleatoare. Returnează primul număr aleatoriu din acea sămânță. Fiecare interpret are propria sămânță.

bronza( arg )

Returnează tangenta lui arg , măsurată în radiani.

tanh ( arg )

Returnează tangenta hiperbolică din arg .

În plus față de aceste funcții predefinite, aplicațiile pot defini funcții suplimentare utilizândTcl_CreateMathFunc().

Tipuri, Overflow și Precision

Toate calculele interne care implică numere întregi se fac cu tipul C lung , iar toate calculele interne care implică un punct plutitor se fac cu tipul C dubla . Când se convertește un șir la un punct variabil, se detectează o depășire a exponenților și rezultă o eroare Tcl. Pentru conversia la întreg din șir, detecția depășirii depinde de comportamentul unor rutine din biblioteca locală C, deci ar trebui considerată ca fiind nesigură. În orice caz, depășirea întregului număr și sub-fluxul nu sunt în general detectate în mod fiabil pentru rezultatele intermediare. Suprafața în virgulă și sub-fluxul sunt detectate la gradul susținut de hardware, care este în general destul de fiabil.

Conversia între reprezentările interne pentru operatori cu puncte întregi, cu puncte în virgulă și cu șir este executată automat după cum este necesar. Pentru calculele aritmetice, se folosesc numere întregi până când se introduce un număr de puncte cu virgulă, după care se utilizează punctul de flotare. De exemplu,

expr 5/4

returnează 1, în timp ce

expr 5 / 4.0 expr 5 / (lungimea șirului "abcd" + 0.0)

ambele returnează 1,25. Valorile în virgulă în vîrf sunt întotdeauna returnate cu un "`.'' sau un ane astfel încât acestea să nu pară ca valori întregi. De exemplu,

expr 20,0 / 5,0

se intoarce4.0, nu4.

String Operations

Valorile de șir pot fi folosite ca operanzi ai operatorilor de comparare, deși evaluatorul expresiei încearcă să facă comparații ca întreg sau punct plutitor atunci când poate. Dacă unul dintre operanții unei comparații este un șir și celălalt are o valoare numerică, operandul numeric este convertit înapoi într-un șir folosind C sprintf formatul specificat% d pentru numere întregi și% g pentru valori în virgulă mobilă. De exemplu, comenzile

expr {"0x03"> "2"} expr {"0y" <"0x12"}

ambele întoarce 1. Prima comparație se face folosind compararea întregului, iar a doua se face folosind compararea șir după ce cel de-al doilea operand este convertit în șir18. Din cauza tendinței Tcl de a trata valorile ca numere ori de câte ori este posibil, nu este, în general, o idee bună să folosiți operatori cum ar fi==când într-adevăr doriți compararea șirului și valorile operanților ar putea fi arbitrare; este mai bine să utilizați în aceste cazurişir comanda.

Performanță

Puneți expresii în bretele pentru cea mai bună viteză și cele mai mici cerințe de stocare. Aceasta permite compilatorului Tcl bytecode să genereze cel mai bun cod.

Așa cum am menționat mai sus, expresiile sunt înlocuite de două ori: o dată de parserul Tcl și o dată de către expr comanda. De exemplu, comenzile

setați un 3 setați b {$ a + 2} expr $ b * 4

returnați 11, nu un multiplu de 4. Acest lucru se datorează faptului că parserul Tcl va înlocui mai întâi$ a + 2 pentru variabilab, apoiexpr comanda va evalua expresia$ a + 2 * 4.

Cele mai multe expresii nu necesită oa doua rundă de substituții. Fie ele sunt închise în bretele, fie, dacă nu, substituțiile lor variabile și de comandă produc numere sau șiruri care nu necesită ele însele substituții. Cu toate acestea, pentru că câteva expresii nerebușite au nevoie de două runde de substituții, compilatorul bytecode trebuie să emită instrucțiuni suplimentare pentru a face față acestei situații. Codul cel mai scump este necesar pentru expresii fără expresii care conțin substituții de comandă. Aceste expresii trebuie implementate prin generarea unui nou cod de fiecare dată când expresia este executată.

Cuvinte cheie

aritmetică, booleană, comparație, expresie, comparație fuzzy

Important: Folosește om comandă ( % om ) pentru a vedea cum se utilizează o comandă pe computerul dvs. particular.