Alt om Linux/Unix-kommandoen: expr

De uttr nytte for Linux shell setter sammen argumenter og evaluerer deretter resultatet som et Tcl-uttrykk, og returnerer verdien til standardutgangen.

Operatorene som er tillatt i Tcl-uttrykk er en delmengde av operatorene som er tillatt i C-uttrykk, og de har samme betydning og forrang som de tilsvarende C-operatorene. Uttrykk nesten alltid gi numeriske resultater (heltalls- eller flyttallsverdier).

mann som skriver på tastaturet
dm909/Moment/Getty Images

Synopsis

Kommandoen har følgende generelle form:

uttr arg1 arg2 ...

Operander

Et Tcl-uttrykk består av en kombinasjon av operander, operatorer og parenteser. Mellomrom kan brukes mellom operandene og operatorer og parenteser; det ignoreres av uttrykkets instruksjoner.

Der det er mulig, tolkes operander som heltallsverdier. Heltallsverdier kan spesifiseres i desimal (normaltall), i oktal (hvis det første tegnet i operanden er 0), eller i heksadesimal (hvis de to første tegnene i operanden er det 0x). Hvis en operand ikke har ett av heltallsformatene gitt ovenfor, behandles den som et flyttall hvis det er mulig.

Flytende tall kan spesifiseres på alle måtene som er akseptert av en ANSI-kompatibel C-kompilator (bortsett fra at f, F, l, og L suffikser vil ikke være tillatt i de fleste installasjoner). For eksempel er alt av følgende gyldige flyttall: 2.1, 3., 6e4, 7,91e+16. Hvis ingen numerisk tolkning er mulig, blir en operand stående som en streng og bare et begrenset sett med operatorer kan brukes på den.

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

  • Som en numerisk verdi, enten heltall eller flyttall.
  • Som en Tcl-variabel, ved å bruke standard $ notasjon. Variabelens verdi vil bli brukt som operanden.
  • Som en streng omsluttet av doble anførselstegn. Uttrykksparseren vil utføre omvendt skråstrek, variabel og kommandoerstatninger på informasjonen mellom anførselstegnene, og bruke den resulterende verdien som operanden.
  • Som en streng innelukket i seler. Tegnene mellom åpen klammeparentes og matchende tette klammeparentes vil bli brukt som operand uten noen erstatninger.
  • Som en Tcl-kommando i parentes. Kommandoen vil bli utført og resultatet vil bli brukt som operanden.
  • Som en matematisk funksjon hvis argumenter har noen av de ovennevnte formene for operander, som f.eks sin($x).

Der substitusjoner forekommer ovenfor (f.eks. inne i anførselstegn), utføres de av uttrykkets instruksjoner. Imidlertid kan et ekstra substitusjonslag allerede ha blitt utført av kommandoparseren før uttrykksprosessoren ble kalt.

For noen eksempler på enkle uttrykk, anta variabelen en har verdien 3 og variabelen har verdien 6. Deretter vil kommandoen på venstre side av hver av linjene nedenfor produsere verdien på høyre side av linjen:

expr 3,1 + $a6,1
uttr 2 + "$a.$b"5.6
expr 4*[length "6 2"]8
expr {{ord én} < "ord $a"}0

Operatører

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

  • - + ~ !: Unær minus, unær pluss, bitvis IKKE, logisk IKKE. Ingen av disse operandene kan brukes på strengoperander, og bitvis NOT kan bare brukes på heltall.
  • * / %: Multipliser, divider, gjenværende. Ingen av disse operandene kan brukes på strengoperander, og resten kan bare brukes på heltall. Resten vil alltid ha samme fortegn som divisor og en absolutt verdi mindre enn divisor.
  • + -: Legg til og trekk fra. Gyldig for alle numeriske operander.
  • << >>: Venstre og høyre skift. Kun gyldig for heltallsoperander. Et høyreskift forplanter alltid fortegnsbiten.
  • < > <= >=: Boolsk mindre, større, mindre enn eller lik, og større enn eller lik. Hver operator produserer 1 hvis betingelsen er sann, ellers 0. Disse operatorene kan brukes på strenger så vel som numeriske operander, i så fall brukes strengsammenligning.
  • == !=: Boolsk lik og ikke lik. Hver operatør produserer et null/ett resultat. Gyldig for alle operandtyper.
  • &: Bitvis OG. Kun gyldig for heltallsoperander.
  • ^: Bitvis eksklusiv ELLER. Kun gyldig for heltallsoperander.
  • |: Bitvis ELLER. Kun gyldig for heltallsoperander.
  • &&: Logisk OG. Gir et 1-resultat hvis begge operandene ikke er null, ellers 0. Kun gyldig for boolske og numeriske (heltall eller flytende komma) operander.
  • ||: Logisk ELLER. Gir et 0-resultat hvis begge operandene er null, ellers 1. Kun gyldig for boolske og numeriske (heltall eller flytende komma) operander.
  • x?y:z: Hvis-så-ellers, som i C. Hvis x evalueres 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-manualen for flere detaljer om resultatene produsert av hver operatør. Alle binære operatorer grupper fra venstre til høyre innenfor samme prioritetsnivå. For eksempel kommandoen.

uttr 4*2 < 7

returnerer 0.

De &&, ||, og ?: operatører har ``lat evaluering'', akkurat som i C, som betyr at operander ikke blir evaluert hvis de ikke er nødvendige for å bestemme utfallet. For eksempel i kommando

uttr {$v? [a]: [b]}

bare en av [en] eller [b] vil faktisk bli evaluert, avhengig av verdien av $v. Merk imidlertid at dette bare er sant hvis hele uttrykket er omsluttet av parentes; ellers vil Tcl-parseren evaluere begge [en] og [b] før du påkaller uttr kommando.

Matematiske funksjoner

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

  • abs(arg): Returnerer den absolutte verdien av arg. Arg kan være enten heltall eller flyttall, og resultatet returneres i samme form.
  • acos(arg): Returnerer buekosinus til arg, i området [0,pi] radianer. Arg skal være i området [-1,1].
  • som i(arg): Returnerer sinusbuen til arg, i området [-pi/2,pi/2] radianer. Arg skal være i området [-1,1].
  • brunfarge(arg): Returnerer buetangensen til arg, i området [-pi/2,pi/2] radianer.
  • atan2(x, y): Returnerer buetangensen til y/x, i området [-pi, pi] radianer. x og y kan ikke begge være 0.
  • tak(arg): Returnerer den minste heltallsverdien ikke mindre enn arg.
  • fordi(arg): Returnerer cosinus til arg, målt i radianer.
  • cosh(arg): Returnerer den hyperbolske cosinus til arg. Hvis resultatet ville forårsake overløp, returneres en feil.
  • dobbelt(arg): Hvis arg er en flytende verdi, returnerer arg, ellers konverterer arg til flytende og returnerer den konverterte verdien.
  • exp(arg): Returnerer eksponentialen til arg, definert som e**arg. Hvis resultatet ville forårsake overløp, returneres en feil.
  • gulv(arg): Returnerer den største integralverdien ikke større enn arg.
  • fmod(x, y): Returnerer flytepunktet resten av divisjonen 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 en heltallsverdi, returnerer arg, ellers konverterer arg til heltall ved trunkering og returnerer den konverterte verdien.
  • Logg(arg): Returnerer den naturlige logaritmen til arg. Arg må være en positiv verdi.
  • log10(arg): Returnerer grunntallet 10-logaritmen av 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 en heltallsverdi.
  • rand(): Returnerer et flyttall fra null til bare mindre enn én eller, i matematiske termer, området [0,1). Frøet kommer fra den interne klokken i maskinen eller kan stilles inn manuelt med srand-funksjonen.
  • rund(arg): Hvis arg er en heltallsverdi, returnerer arg, ellers konverterer arg til heltall ved å avrunde og returnerer den konverterte verdien.
  • synd(arg): Returnerer sinus til arg, målt i radianer.
  • sinh(arg): Returnerer hyperbolsk sinus til arg. Hvis resultatet ville forårsake overløp, returneres en feil.
  • sqrt(arg): Returnerer kvadratroten av arg. Arg må være ikke-negativ.
  • srand(arg): Den arg, som må være et heltall, brukes til å tilbakestille frøet for tilfeldig tallgenerator. Returnerer det første tilfeldige tallet fra det frøet. Hver tolk har sitt eget frø.
  • brun(arg): Returnerer tangenten til arg, målt i radianer.
  • tanh(arg): Returnerer den hyperbolske tangens av arg.

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

Typer, overløp og presisjon

Alle interne beregninger som involverer heltall gjøres med C-typen lang, og alle interne beregninger som involverer flyttall gjøres med C-typen dobbelt. Når du konverterer en streng til flyttall, oppdages eksponentoverløp og resulterer i en Tcl-feil. For konvertering til heltall fra streng, avhenger deteksjon av overløp av oppførselen til enkelte rutiner i det lokale C-biblioteket, så det bør betraktes som upålitelig. I alle fall blir heltallsoverløp og underflyt generelt ikke oppdaget pålitelig for mellomresultater. Flytepunktoverløp og underflyt oppdages i den grad det støttes av maskinvaren, som generelt er ganske pålitelig.

Konvertering mellom interne representasjoner for heltalls-, flyttall- og strengoperander gjøres automatisk etter behov. For aritmetiske beregninger brukes heltall inntil et eller annet flytende tall er introdusert, hvoretter flytende tall brukes. For eksempel,

uttr 5/4

returnerer 1, mens.

uttr 5 / 4,0
expr 5 / ( [strenglengde "abcd"] + 0,0 )

begge returnerer 1,25. Flytende kommaverdier returneres alltid med en ``.'' eller en e slik at de ikke ser ut som heltallsverdier. For eksempel,

uttr 20,0/5,0

returnerer 4.0, ikke 4.

Strengeoperasjoner

Strengverdier kan brukes som operander for sammenligningsoperatorene, selv om uttrykksevaluatoren prøver å gjøre sammenligninger som heltall eller flytende komma når den kan. Hvis en av operandene til en sammenligning er en streng og den andre har en numerisk verdi, konverteres den numeriske operanden tilbake til en streng ved å bruke C sprintf formatspesifikasjoner %d for heltall og %g for flyttallsverdier. For eksempel kommandoene:

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

begge returnerer 1. Den første sammenligningen gjøres ved å bruke heltallssammenligning, og den andre gjøres ved å bruke strengsammenligning etter at den andre operanden er konvertert til strengen 18. På grunn av Tcls tendens til å behandle verdier som tall når det er mulig, er det vanligvis ikke en god idé å bruke operatører som == når du virkelig ønsker strengsammenligning og verdiene til operandene kan være vilkårlige; det er bedre i disse tilfellene å bruke streng kommando i stedet.