Comandă Linux / Unix: expr

Nume

expr - Evaluați o expresie

Rezumat

expr arg ? arg arg ... ?

Concatenates arg 's (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 este 0 ) sau în hexazecimal (dacă primele două caractere ale operandului sunt 0x ). 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 compliant cu ANSI (cu excepția faptului că sufixele f , F , l și L 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 notația standard $ . 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 fi păcatul ($ 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 se realizează 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, să presupunem că variabila a are valoarea 3 iar variabila b are 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ă-apoi-altceva, ca în C. Dacă x evaluează la non-zero, atunci rezultatul este valoarea lui y . În caz contrar, rezultatul este valoarea z . Operandul x trebuie sa aiba o valoare numerica.

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 dintre [a] sau [b] 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 ambele [a] și [b] înainte de a invoca comanda expr .

Math Funcții

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

abs cosh log sqrt acos dublu log10 srand asin exp pow tan atan podea rand tanh atan2 fmod rotund tavan hypot sin cos int sinh

abs ( arg )

Returnează valoarea absolută a arg . Arg poate fi fie un număr întreg, fie un punct plutitor, iar rezultatul este returnat în aceeași formă.

acos ( arg )

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

asin ( arg )

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

atan ( arg )

Returnează tangenta arcului arg , în radianele [-pi / 2, pi / 2].

atan2 ( x, y )

Returnează tangenta arcului y / x , în intervalul [-pi, pi] radians. x și y nu pot fi ambele 0.

ceil ( arg )

Returnează valoarea cea mai mică, nu mai mică de arg .

cos ( arg )

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

cosh ( arg )

Returnează cosinusul hiperbolic al lui arg . Dacă rezultatul ar provoca o depășire, va fi returnată o eroare.

dublu ( arg )

Dacă arg este o valoare flotantă, returnează arg , altfel convertește arg la floating și returnează valoarea convertită.

exp ( arg )

Returnează exponențialul 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 lui x cu y . Dacă y este 0, este returnată o eroare.

ipot ( x, y )

Calculează lungimea ipotentului unui triunghi cu unghi drept ( x * x + y * y ).

int ( arg )

Dacă arg este o valoare întregă, returnează arg , altfel convertește arg la întreg prin trunchiere și returnează valoarea convertită.

log ( arg )

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

log10 ( arg )

Returnează logaritmul bazei 10 arg . Arg trebuie să fie o valoare pozitivă.

pow ( x, y )

Calculează valoarea x ridicată la puterea 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.

rotund ( arg )

Dacă arg este o valoare întregă, returnează arg , altfel convertește arg la întreg prin rotunjire și returnează valoarea convertită.

sin ( arg )

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

sinh ( arg )

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

sqrt ( arg )

Returnează rădăcina pătrată a arg . Arg nu trebuie să fie negativ.

srand ( arg )

Arg , care trebuie să fie un număr întreg, este folosit pentru a reseta semnul pentru generatorul de numere aleatoare. Returnează primul număr aleatoriu din acea sămânță. Fiecare interpret are propria sămânță.

tan ( arg )

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

tanh ( arg )

Returnează tangenta hiperbolică a arg .

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

Tipuri, Overflow și Precision

Toate calculele interne care implică numere întregi se fac cu tipul C lung , iar toate calculele interne care implică punctul de plutire se fac cu dublul tip C. 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 e, astfel încât acestea să nu arate ca valori întregi. De exemplu,

expr 20,0 / 5,0

returnează 4.0 , nu 4 .

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ă, operatorul numeric este convertit înapoi la un șir utilizând specificatorul formatului sprintf C % d pentru numere întregi și % g pentru valori în virgulă mobilă. De exemplu, comenzile

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

ambele retur 1. Prima comparatie se face folosind compararea intreg, iar a doua se face folosind compararea de sir dupa ce cel de-al doilea operand este convertit la sirul 18 . Din cauza tendinței lui 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 precum == atunci când doriți într-adevăr compararea șirului, iar valorile operanților ar putea fi arbitrare; este mai bine în aceste cazuri să folosiți comanda șir .

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.

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

a seta un set 3 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 variabila b , atunci comanda expr 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: Utilizați comanda om ( % man ) pentru a vedea cum se utilizează o comandă pe computerul dvs. particular.