Mindent a Linux/Unix parancsról: expr

Az expr segédprogram a Linux A shell összefűzi az argumentumokat, majd az eredményt Tcl-kifejezésként értékeli, visszaadva az értéket a standard kimenetre.

A Tcl-kifejezésekben engedélyezett operátorok a C-kifejezésekben engedélyezett operátorok egy részhalmazát képezik, jelentésük és elsőbbségük megegyezik a megfelelő C-operátorokkal. Kifejezések szinte mindig számszerű eredményeket adnak (egész vagy lebegőpontos értékek).

ember gépel a billentyűzeten
dm909/Moment/Getty Images

Szinopszis

A parancs a következő általános formát ölti:

expr arg1 arg2 ...

Operandusok

A Tcl kifejezés operandusok, operátorok és zárójelek kombinációjából áll. Az operandusok és az operátorok, valamint a zárójelek között szóköz használható; a kifejezés utasításai figyelmen kívül hagyják.

Ahol lehetséges, az operandusokat egész értékként értelmezzük. Az egész értékek decimálisan (normál eset), oktálisan adhatók meg (ha az operandus első karaktere 0), vagy hexadecimálisan (ha az operandus első két karaktere 0x). Ha egy operandus nem rendelkezik a fent megadott egész formátumok egyikével, akkor a rendszer lebegőpontos számként kezeli, ha ez lehetséges.

A lebegőpontos számok az ANSI-kompatibilis C-fordítók által elfogadott bármely módon megadhatók (kivéve, hogy a f, F, l, és L utótagok használata a legtöbb telepítésben nem megengedett). Például a következők mindegyike érvényes lebegőpontos szám: 2.1, 3., 6e4, 7,91e+16. Ha a numerikus értelmezés nem lehetséges, akkor egy operandust karakterláncként hagynak meg, és csak korlátozott számú operátor alkalmazható rá.

Az operandusok a következő módok bármelyikén megadhatók:

  • Numerikus értékként, akár egész, akár lebegőpontos.
  • Tcl változóként, standard használatával $ jelölés. A változó értéke lesz operandus.
  • Kettős idézőjelbe zárt karakterláncként. A kifejezéselemző fordított perjelet, változót és parancshelyettesítést hajt végre az idézőjelek közötti információkon, és az eredményül kapott értéket használja operandusként.
  • Kapcsos zárójelbe zárt madzagként. A nyitott kapcsos kapcsos zárójel és a hozzáillő zárt kapcsos zárójel közötti karakterek operandusként használatosak, helyettesítések nélkül.
  • Tcl-parancsként, zárójelben. A parancs végrehajtásra kerül, és annak eredményét használja operandusként.
  • Olyan matematikai függvényként, amelynek argumentumai rendelkeznek az operandusok fenti formáival, mint pl bűn($x).

Ahol a fenti helyettesítések előfordulnak (például idézőjeles karakterláncokon belül), azokat a kifejezés utasításai hajtják végre. Előfordulhat azonban, hogy a parancselemző egy további helyettesítési réteget már végrehajtott a kifejezésprocesszor meghívása előtt.

Néhány példa egyszerű kifejezésekre tegyük fel a változót a értéke 3 és változója van 6-os értéke van. Ezután az alábbi sorok bal oldalán található parancs a sor jobb oldalán adja meg az értéket:

expr 3,1 + $a6,1
2. kifejezés + "$a.$b"5.6
kif 4*[hossz "6 2"]8
expr {{word one} < "szó $a"}0

Üzemeltetők

Az érvényes operátorok az alábbiakban vannak felsorolva, csökkenő sorrendben:

  • - + ~ !: Unáris mínusz, unáris plusz, bitenként NEM, logikai NEM. Ezen operandusok egyike sem alkalmazható karakterlánc-operandusokra, és bitenkénti NOT csak egész számokra alkalmazható.
  • * / %: Szorzás, osztás, maradék. Ezen operandusok egyike sem alkalmazható karakterlánc-operandusokra, a maradék pedig csak egész számokra alkalmazható. A maradék mindig ugyanazzal az előjellel rendelkezik, mint az osztó, és az abszolút értéke kisebb, mint az osztó.
  • + -: Összeadás és kivonás. Bármilyen numerikus operandusra érvényes.
  • << >>: Bal és jobb váltás. Csak egész operandusokra érvényes. A jobbra eltolás mindig az előjelbitet továbbítja.
  • < > <= >=: Logikai érték kisebb, nagyobb, kisebb vagy egyenlő, és nagyobb vagy egyenlő. Minden operátor 1-et ad, ha a feltétel igaz, ellenkező esetben 0-t. Ezeket az operátorokat karakterláncokra és numerikus operandusokra is lehet alkalmazni, ebben az esetben karakterlánc-összehasonlítást használunk.
  • == !=: Logikai egyenlő és nem egyenlő. Minden operátor nulla/egy eredményt ad. Minden operandustípusra érvényes.
  • &: Bitenként ÉS. Csak egész operandusokra érvényes.
  • ^: Bitenként kizárólagos VAGY. Csak egész operandusokra érvényes.
  • |: Bitenként VAGY. Csak egész operandusokra érvényes.
  • &&: Logikai ÉS. 1 eredményt ad, ha mindkét operandus nem nulla, ellenkező esetben 0. Csak logikai és numerikus (egész vagy lebegőpontos) operandusokra érvényes.
  • ||: Logikai VAGY. 0 eredményt ad, ha mindkét operandus nulla, ellenkező esetben 1. Csak logikai és numerikus (egész vagy lebegőpontos) operandusokra érvényes.
  • x?y:z: Ha-akkor-más, mint a C-ben. Ha x nem nullára értékeli ki, akkor az eredmény az értéke y. Ellenkező esetben az eredmény az értéke z. Az x az operandusnak numerikus értékkel kell rendelkeznie.

Az egyes kezelők által elért eredményekről bővebben a C kézikönyvben olvashat. Minden bináris operátorok csoportosítsa balról jobbra ugyanazon a prioritási szinten. Például a parancs.

kifejezés 4*2 < 7

0-t ad vissza.

Az &&, ||, és ?: Az operátorok „lusta kiértékeléssel” rendelkeznek, csakúgy, mint a C-ben, ami azt jelenti, hogy az operandusok nem kerülnek kiértékelésre, ha nem szükségesek az eredmény meghatározásához. Például a parancs

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

csak az egyik [a] vagy [b] értékétől függően ténylegesen ki lesz értékelve $v. Megjegyzendő azonban, hogy ez csak akkor igaz, ha a teljes kifejezést kapcsos zárójelek közé zárjuk; ellenkező esetben a Tcl elemző mindkettőt kiértékeli [a] és [b] mielõtt a expr parancs.

Matematikai függvények

A Tcl a következő matematikai függvényeket támogatja a kifejezésekben:

  • abs(arg): Az abszolút értékét adja vissza arg. Arg lehet egész vagy lebegőpontos, és az eredményt ugyanabban a formában adjuk vissza.
  • acos(arg): Az arc koszinuszát adja eredményül arg, a [0,pi] radián tartományban. Arg a [-1,1] tartományban kell lennie.
  • mint a(arg): Az arc szinuszát adja vissza arg, a [-pi/2,pi/2] radián tartományban. Arg a [-1,1] tartományban kell lennie.
  • atan(arg): Az arc tangensét adja vissza arg, a [-pi/2,pi/2] radián tartományban.
  • atan2(x, y): Az arc tangensét adja vissza y/x, a [-pi, pi] radián tartományban. x és y mindkettő nem lehet 0.
  • ceil(arg): A legkisebb egész értéket adja vissza, amely nem kisebb, mint arg.
  • kötözősaláta(arg): A koszinuszát adja vissza arg, radiánban mérve.
  • kényelmes(arg): A hiperbolikus koszinuszát adja eredményül arg. Ha az eredmény túlcsordulást okozna, hibaüzenet jelenik meg.
  • kettős(arg): Ha arg lebegő érték, visszaadja arg, egyébként megtérít arg lebegőre, és visszaadja a konvertált értéket.
  • exp(arg): A következő exponenciális értékét adja vissza arg, e**arg. Ha az eredmény túlcsordulást okozna, hibaüzenet jelenik meg.
  • padló(arg): A legnagyobb integrálértéket adja vissza, amely nem nagyobb, mint arg.
  • fmod(x, y): Az osztás lebegőpontos maradékát adja vissza x által y. Ha y értéke 0, hibaüzenet jelenik meg.
  • hipotézis(x, y): Kiszámítja egy derékszögű háromszög befogójának hosszát (x*x+y*y).
  • int(arg): Ha arg egy egész érték, visszaadja arg, egyébként megtérít arg egész számra csonkolással, és visszaadja a konvertált értéket.
  • log(arg): A természetes logaritmusát adja vissza arg. Arg pozitív értéknek kell lennie.
  • log10(arg): A 10-es alap logaritmusát adja eredményül arg. Arg pozitív értéknek kell lennie.
  • hadifogoly(x, y): Kiszámítja az értékét x hatalomra emelték y. Ha x negatív, y egész számnak kell lennie.
  • rand(): Lebegőpontos számot ad vissza nulláról egynél kisebbre, vagy matematikai értelemben a [0,1 tartományt. A vetőmag a gép belső órájáról származik, vagy manuálisan is beállítható a srand funkcióval.
  • kerek(arg): Ha arg egy egész érték, visszaadja arg, egyébként megtérít arg egész számra kerekítéssel, és az átváltott értéket adja vissza.
  • bűn(arg): A szinuszát adja vissza arg, radiánban mérve.
  • sinh(arg): A hiperbolikus szinuszát adja eredményül arg. Ha az eredmény túlcsordulást okozna, hibaüzenet jelenik meg.
  • sqrt(arg): A négyzetgyökét adja vissza arg. Arg nem negatívnak kell lennie.
  • srand(arg): Az arg, amelynek egész számnak kell lennie, a véletlenszám-generátor magjának visszaállítására szolgál. Az első véletlen számot adja vissza az adott magból. Minden tolmácsnak megvan a maga magja.
  • Cser(arg): A következő tangensét adja vissza arg, radiánban mérve.
  • tanh(arg): A hiperbolikus tangensét adja eredményül arg.

Ezeken az előre meghatározott funkciókon kívül az alkalmazások további funkciókat is meghatározhatnak a használatával Tcl_CreateMathFunc().

Típusok, túlcsordulás és pontosság

Az egész számokat tartalmazó belső számítások C típussal történik hosszú, és minden lebegőpontos belső számítás a C típussal történik kettős. Egy karakterlánc lebegőpontossá alakításakor a rendszer kitevő túlcsordulást észlel, és Tcl hibát eredményez. A karakterláncból egész számmá való konvertáláskor a túlcsordulás észlelése a helyi C könyvtár egyes rutinjainak viselkedésétől függ, ezért megbízhatatlannak kell tekinteni. Mindenesetre az egész szám túlcsordulása és alulcsordulása általában nem észlelhető megbízhatóan a köztes eredményekhez. A lebegőpontos túlcsordulás és alulcsordulás a hardver által támogatott mértékben észlelhető, ami általában meglehetősen megbízható.

Az egész számok, lebegőpontos és karakterlánc-operandusok belső reprezentációi közötti átalakítás szükség szerint automatikusan megtörténik. Az aritmetikai számításokhoz egész számokat használunk, amíg valamilyen lebegőpontos számot nem vezetünk be, majd ezután lebegőpontos számot használunk. Például,

kifejezés 5/4

1-et ad vissza, míg.

kifejezés 5 / 4,0
expr 5 / ( [karakterlánc hossza "abcd"] + 0,0 )

mindkettő 1,25-öt ad vissza. A lebegőpontos értékeket mindig `` jellel adja vissza.'' vagy an e hogy ne tűnjenek egész értékeknek. Például,

expr 20,0/5,0

visszatér 4.0, nem 4.

String műveletek

A karakterlánc-értékek használhatók az összehasonlító operátorok operandusaiként, bár a kifejezéskiértékelő megpróbálja egész számként vagy lebegőpontos összehasonlítást végezni, amikor lehetséges. Ha az összehasonlítás egyik operandusa egy karakterlánc, a másik pedig numerikus értékkel rendelkezik, a numerikus operandus visszaalakítható karakterláncsá a C segítségével. sprintf formátum specifikátor %d egész számokhoz és %g lebegőpontos értékekhez. Például a parancsok:

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

mindkettő 1-et ad vissza. Az első összehasonlítás egész számok összehasonlításával, a második pedig karakterlánc-összehasonlítással történik, miután a második operandust karakterláncsá alakították. 18. Mivel a Tcl hajlamos az értékeket számokként kezelni, amikor csak lehetséges, általában nem jó ötlet olyan operátorokat használni, mint pl. == ha valóban karakterlánc-összehasonlítást szeretne, és az operandusok értékei tetszőlegesek lehetnek; ezekben az esetekben jobb a húr parancs helyett.