Skip to main content

Alt om Linux / Unix-kommandoen: expr

expr command | Evaluate Expressions in Linux - FOTV (Juni 2026)

expr command | Evaluate Expressions in Linux - FOTV (Juni 2026)
Anonim

Navn

expr - Evaluer et uttrykk

Synopsis

expr arg ? arg arg … ?

Setter sammen arg s (legger separator mellomrom), evaluerer resultatet som et Tcl uttrykk, og returnerer verdien. Operatørene tillates i Tcl-uttrykk er en delmengde av operatørene tillatt i C-uttrykk, og de har samme betydning og forrang som de tilsvarende C-operatørene. Uttrykk gir nesten alltid numeriske resultater (heltall eller flytende punktverdier). For eksempel uttrykket

ekspr 8.2 + 6

vurderer til 14,2. Tcl-uttrykk er forskjellig fra C-uttrykk i den måten operandene er angitt på. Tcl-uttrykk støtter også ikke-numeriske operand- og strengsammenligninger.

operander

Et Tcl-uttrykk består av en kombinasjon av operander, operatører og parenteser. Hvit plass kan brukes mellom operandene og operatørene og parentesene; det ignoreres av uttrykkets instruksjoner. Hvor det er mulig tolkes operander som heltallverdier. Helhetsverdier kan angis i desimal (det vanlige tilfellet), i oktal (hvis operandens første tegn er0), eller i heksadesimale (hvis de to første tegnene til operand er0x). Hvis en operand ikke har et av integerformatene gitt ovenfor, blir det behandlet som et flytende punktnummer hvis det er mulig. Flytepunktstall kan angis på noen av måtene som er godkjent av en ANSI-kompatibel C-kompilator (bortsett fra atf, F, l, ogL suffikser vil ikke bli tillatt i de fleste installasjoner). For eksempel er alle følgende gyldige flytende punktnumre: 2.1, 3., 6e4, 7.91e + 16. Hvis ingen numerisk tolkning er mulig, blir en operand igjen som en streng (og bare et begrenset sett av operatører kan brukes på det).

Operandene kan spesifiseres på en av følgende måter:

1

Som en numerisk verdi, enten heltall eller flytende punkt.

2

Som en Tcl-variabel, bruker du standard$ notasjon. Variabelenes verdi vil bli brukt som operand.

3

Som en streng som er omsluttet i dobbelte sitater. Ekspresjonsparameteren vil utføre tilbakeslag, variabel og kommandosubstitusjoner på informasjonen mellom anførselstegnene, og bruk den resulterende verdien som operand

4

Som en streng innelukket i håndtak. Tegnene mellom den åpne bøylen og matchende nærbøyle vil bli brukt som operand uten noen substitusjoner.

5

Som en Tcl-kommando vedlagt i parentes. Kommandoen blir utført og resultatet blir brukt som operand.

6

Som en matematisk funksjon hvis argumenter har noen av de ovennevnte former for operander, for eksempelsin ($ x). Se nedenfor for en liste over definerte funksjoner.

Hvor substitusjoner forekommer over (for eksempel inne citerte strenger), utføres de av uttrykkets instruksjoner. Imidlertid kan et ekstra lag av substitusjon allerede blitt utført av kommandoparseren før ekspresjonsprosessoren ble kalt. Som diskutert nedenfor er det vanligvis best å legge inn uttrykk i braces for å hindre at kommandoparseren utfører substitusjoner på innholdet.

For noen eksempler på enkle uttrykk, anta variabelenen har verdien 3 og variabelenbhar verdien 6. Da vil kommandoen på venstre side av hver av linjene nedenfor gi verdien på høyre side av linjen:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * length "6 2" 8 expr {{ord ett} <"ord $ a"} 0

operatører

De gyldige operatørene er oppført nedenfor, gruppert i avtagende rekkefølge:

- + ~ !

Unary minus, unary pluss, bit-wise IKKE, logisk IKKE. Ingen av disse operandene kan bli brukt på strengoperander, og bitvis kan IKKE bare brukes på heltall.

* / %

Multipliser, del, resten. Ingen av disse operandene kan brukes på strengoperander, og resten kan bare brukes på heltall. Resten vil alltid ha samme tegn som divisoren og en absolutt verdi mindre enn divisoren.

+ -

Legg til og trekk ut. Gyldig for alle numeriske operander.

<< >>

Venstre og høyre skift. Gyldig for heltall opererer bare. Et rett skifte propagererer alltid tegnbiten.

< > <= >=

Boolsk mindre, større, mindre enn eller lik, og større enn eller lik. Hver operatør produserer 1 hvis tilstanden er sant, 0 ellers. Disse operatørene kan brukes på strenger, så vel som numeriske operander, i hvilket tilfelle streng sammenligning brukes.

== !=

Boolsk lik og ikke lik. Hver operatør produserer et null / ett resultat. Gyldig for alle operand typer.

&

Bit-wise AND. Gyldig for heltall opererer bare.

^

Bitvis eksklusiv ELLER. Gyldig for heltall opererer bare.

|

Bitvis OR. Gyldig for heltall opererer bare.

&&

Logisk AND. Produserer et 1 resultat hvis begge operandene er ikke-null, 0 ellers. Gyldig for boolsk og numerisk (heltall eller flytende punkt) operander bare.

||

Logisk ELLER. Produserer et 0 resultat hvis begge operandene er null, 1 ellers. Gyldig for boolsk og numerisk (heltall eller flytende punkt) operander bare.

x ? y : z

Hvis-da-ellers, som i C. Hvis x vurderer til ikke-null, så er resultatet verdien av y . Ellers er resultatet verdien av z . De x operand må ha en numerisk verdi.

Se C-håndboken for mer informasjon om resultatene produsert av hver operatør. Alle binæroperatørgruppene vender mot høyre innenfor samme prioritetsnivå. For eksempel, kommandoen

expr 4 * 2 <7

returnerer 0.

De&&, ||, og?: operatørene har `` lat evaluering '', akkurat som i C, noe som betyr at operandene ikke blir vurdert hvis de ikke er nødvendige for å bestemme utfallet. For eksempel, i kommandoen

expr {$ v? a: b}

bare en aven ellerB vil faktisk bli vurdert, avhengig av verdien av$ v. Vær imidlertid oppmerksom på at dette bare er sant dersom hele uttrykket er innelukket i braces; ellers vil Tcl-parseren evaluere beggeen ogB før du anroperexpr kommando.

Matematiske funksjoner

Tcl støtter følgende matematiske funksjoner i uttrykk:

abs coshLoggsqrt Acos dobbeltlog10srand som i exppowtan brunfarge gulvrandtanh atan2 fmodrund ceil hypotsynd cos intsinh

abs ( arg )

Returnerer absolutt verdien av arg . Arg kan være enten heltall eller flytende punkt, og resultatet returneres i samme form.

Acos ( arg )

Returnerer lysbue cosinus av arg , i området 0, pi radianer. Arg bør ligge i området -1,1.

som i( arg )

Returnerer bue sinus av arg , i området -pi / 2, pi / 2 radianer. Arg bør ligge i området -1,1.

brunfarge( arg )

Returnerer bue tangenten til arg , i området -pi / 2, pi / 2 radianer.

atan2 ( x, y )

Returnerer bue tangenten til y / x , i rekkevidden -pi, pi radianer. x og y kan ikke begge være 0.

ceil ( arg )

Returnerer den minste integerverdien ikke mindre enn arg .

cos ( arg )

Returnerer cosinus av arg , målt i radianer.

cosh ( arg )

Returnerer den hyperbolske cosinus av arg . Hvis resultatet skulle føre til overløp, returneres en feil.

dobbelt( arg )

Hvis arg er en flytende verdi, returnerer arg , ellers konverterer arg å flyte og returnerer den konverterte verdien.

exp ( arg )

Returnerer eksponentiell av arg , definert som e ** arg . Hvis resultatet skulle føre til overløp, returneres en feil.

gulv( arg )

Returnerer den største integrale verdien ikke større enn arg .

fmod ( x, y )

Returnerer flytende punktrester av delingen av x av y . Hvis y er 0, returneres en feil.

hypot ( x, y )

Beregner lengden på hypotenusen til en rettvinklet trekant ( x * x + y * y ).

int ( arg )

Hvis arg er et heltall, returnerer arg , ellers konverterer arg til heltall ved trunking og returnerer den konverterte verdien.

Logg( arg )

Returnerer den naturlige logaritmen til arg . Arg må være en positiv verdi.

log10 ( arg )

Returnerer basen 10 logaritmen til arg . Arg må være en positiv verdi.

pow ( x, y )

Beregner verdien av x hevet til makten y . Hvis x er negativ, y må være et heltall.

rand ()

Returnerer et flytpunktsnummer fra null til bare mindre enn ett, eller i matematiske termer, området 0,1. Frøet kommer fra maskinens interne klokke eller kan settes manuelt med srand-funksjonen.

rund( arg )

Hvis arg er et heltall, returnerer arg , ellers konverterer arg til heltall ved å avrunde og returnerer den konverterte verdien.

synd( arg )

Returnerer sinus av arg , målt i radianer.

sinh ( arg )

Returnerer hyperbolisk sinus av arg . Hvis resultatet skulle føre til overløp, returneres en feil.

sqrt ( arg )

Returnerer kvadratroten til arg . Arg må være ikke-negativ.

srand ( arg )

De arg , som må være et heltall, brukes til å tilbakestille frøet for tilfeldig talgeneratoren. Returnerer det første tilfeldige tallet fra det frøet. Hver tolk har sitt eget frø.

tan ( arg )

Returnerer tangenten til arg , målt i radianer.

tanh ( arg )

Returnerer hyperbolisk tangent av arg .

I tillegg til disse forhåndsdefinerte funksjonene kan applikasjoner definere tilleggsfunksjoner ved hjelp avTcl_CreateMathFunc().

Typer, Overflow og Precision

Alle interne beregninger som involverer heltall er gjort med C-typen lang , og alle interne beregninger som involverer flytende punkt er gjort med C-typen dobbelt . Når du konverterer en streng til flytpunkt, blir eksponentoverløp detektert og resulterer i en Tcl-feil. For konvertering til heltall fra streng er deteksjon av overløp avhengig av oppførselen til noen rutiner i det lokale C-biblioteket, så det bør betraktes som upålitelig. Under alle omstendigheter blir ikke heltall overflyt og understrøm ikke pålidelig pålitelig for mellomliggende resultater. Flytende punktoverløp og understrøm blir detektert i den grad som støttes av maskinvaren, som generelt er ganske pålitelig.

Konvertering mellom interne representasjoner for heltall, flytpunkt og strengoperand gjøres automatisk etter behov. For aritmetiske beregninger blir heltall brukt til noen flytende punkt er innført, hvorpå flytpunkt brukes. For eksempel,

expr 5/4

returnerer 1, mens

expr 5 / 4.0 expr 5 / (strenglengde "abcd" + 0,0)

begge returnerer 1,25. Flytende punktverdier returneres alltid med en ``.'' eller ene slik at de ikke vil se ut som heltallverdier. For eksempel,

expr 20.0 / 5.0

avkastning4.0, ikke4.

Stringsoperasjoner

Strengverdier kan brukes som operandene til sammenligningsoperatørene, selv om uttrykksevaluatoren forsøker å gjøre sammenligninger som heltall eller flytpunkt når det kan. Hvis en av operandene til en sammenligning er en streng og den andre har en numerisk verdi, konverteres den numeriske operand tilbake til en streng ved hjelp av C sprintf format spesifiserer% d for heltall og% g for flytende punktverdier. For eksempel kommandoene

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

begge tilbake 1. Den første sammenligningen gjøres ved å bruke heltalls-sammenligning, og den andre er gjort ved hjelp av streng-sammenligning etter at den andre operand er konvertert til strengen18. På grunn av Tcls tendens til å behandle verdier som tall når det er mulig, er det ikke generelt en god ide å bruke operatører som==når du virkelig ønsker streng sammenligning og verdiene av operandene kan være vilkårlig; Det er bedre i disse tilfellene å brukestring kommandoen i stedet.

Prestasjonshensyn

Legg inn uttrykk i håndtak for best mulig hastighet og de minste lagringsbehovene. Dette gjør at Tcl bytecode-kompilatoren kan generere den beste koden.

Som nevnt ovenfor er uttrykkene erstattet to ganger: en gang ved Tcl-parseren og en gang ved expr kommando. For eksempel kommandoene

sett en 3 sett b {$ a + 2} expr $ b * 4

returnere 11, ikke et multiplum av 4. Dette skyldes at Tcl-parseren først erstatter$ a + 2 for variabelenb, og såexpr kommandoen vil evaluere uttrykket$ a + 2 * 4.

De fleste uttrykkene krever ikke en andre substitusjonsrunde. Enten de er innelukket i bøyler eller, om ikke, deres variabel- og kommandosubstitusjoner gir tall eller strenger som ikke selv krever substitusjoner. Imidlertid fordi byttekompilatoren må utstede flere instruksjoner for å håndtere denne situasjonen, fordi noen unbraced uttrykk trenger to runder av substitusjoner. Den dyreste koden er nødvendig for unbraced uttrykk som inneholder kommandosubstitusjoner. Disse uttrykkene må implementeres ved å generere ny kode hver gang uttrykket utføres.

nøkkelord

aritmetisk, boolsk, sammenligne, uttrykk, fuzzy sammenligning

Viktig: Bruke Mann kommando ( % Mann ) for å se hvordan en kommando brukes på din datamaskin.