Vse o ukazu Linux/Unix: expr
The ekspr uporabnost za Linux lupina združi argumente in nato oceni rezultat kot izraz Tcl in vrne vrednost v standardni izhod.
Operatorji, dovoljeni v izrazih Tcl, so podmnožica operatorjev, dovoljenih v izrazih C, in imajo enak pomen in prednost kot ustrezni operatorji C. Izrazi skoraj vedno prinašajo številčne rezultate (celoštevilske vrednosti ali vrednosti s plavajočo vejico).

Povzetek
Ukaz ima naslednjo splošno obliko:
izraz arg1 arg2 ...
Operandi
Izraz Tcl je sestavljen iz kombinacije operandov, operatorjev in oklepajev. Med operandi in operatorji ter oklepaji se lahko uporabi presledek; navodila izraza ga ignorirajo.
Kjer je mogoče, se operandi razlagajo kot celoštevilske vrednosti. Celoštevilske vrednosti so lahko podane v decimalni (običajni primeri), v osmiški (če je prvi znak operanda 0) ali v šestnajstiški (če sta prva dva znaka operanda 0x). Če operand nima enega od zgoraj navedenih celoštevilskih formatov, se obravnava kot število s plavajočo vejico, če je to mogoče.
Številke s plavajočo vejico je mogoče podati na kateri koli način, ki ga sprejme prevajalnik C, skladen z ANSI (razen da f, F, l, in L pripone v večini instalacij ne bodo dovoljene). Na primer, vse naslednje so veljavne številke s plavajočo vejico: 2.1, 3., 6e4, 7,91e+16. Če številčna interpretacija ni mogoča, se operand pusti kot niz in zanj se lahko uporabi le omejen nabor operatorjev.
Operande je mogoče podati na katerega koli od naslednjih načinov:
- Kot številska vrednost, celo število ali plavajoča vejica.
- Kot spremenljivka Tcl z uporabo standarda $ zapis. Vrednost spremenljivke bo uporabljena kot operand.
- Kot niz, zaprt v dvojnih narekovajih. Razčlenjevalnik izrazov bo izvedel zamenjavo povratne poševnice, spremenljivke in ukazov za informacije med narekovaji in uporabil nastalo vrednost kot operand.
- Kot niz, zaprt v oklepajih. Znaki med odprtim in ujemajočim se zaprtim oklepajem bodo uporabljeni kot operand brez kakršnih koli zamenjav.
- Kot ukaz Tcl v oklepaju. Ukaz se bo izvedel in njegov rezultat bo uporabljen kot operand.
- Kot matematična funkcija, katere argumenti imajo katero koli od zgornjih oblik za operande, kot je npr greh ($x).
Kjer se zamenjave pojavijo zgoraj (npr. znotraj narekovajev), se izvedejo po navodilih izraza. Vendar pa je lahko razčlenjevalnik ukazov že izvedel dodatno plast zamenjave, preden je bil poklican procesor izrazov.
Za nekatere primere preprostih izrazov predpostavimo spremenljivko a ima vrednost 3 in spremenljivko b ima vrednost 6. Nato bo ukaz na levi strani vsake od spodnjih vrstic ustvaril vrednost na desni strani vrstice:
izraz 3,1 + $a6,1
izraz 2 + "$a.$b"5.6
izraz 4*[llength "6 2"]8
izraz {{beseda ena} < "beseda $a"}0
Operaterji
Veljavni operaterji so navedeni spodaj, razvrščeni v padajočem vrstnem redu:
- - + ~ !: unarno minus, unarno plus, bitno NE, logično NE. Nobenega od teh operandov ni mogoče uporabiti za nizovne operande, bitno NE pa se lahko uporabi samo za cela števila.
- * / %: Množi, deli, ostanek. Nobenega od teh operandov ni mogoče uporabiti za nizovne operande, preostanek pa samo za cela števila. Preostanek bo vedno imel enak predznak kot delilec in absolutno vrednost, ki je manjša od delitelja.
- + -: Dodaj in odštej. Velja za vse številske operande.
- << >>: Premik v levo in desno. Velja samo za celoštevilske operande. Desni premik vedno širi predznak.
- < > <= >=: Boolean manj, večji, manjši ali enak in večji ali enak. Vsak operater ustvari 1, če je pogoj resničen, 0 v nasprotnem primeru. Te operatorje je mogoče uporabiti tako za nize kot tudi za številske operande, v tem primeru pa se uporabi primerjava nizov.
- == !=: Boolean enako in ne enako. Vsak operater ustvari rezultat nič/ena. Velja za vse vrste operandov.
- &: Bitno IN. Velja samo za celoštevilske operande.
- ^: Bitno izključujoče ALI. Velja samo za celoštevilske operande.
- |: Bitno ALI. Velja samo za celoštevilske operande.
- &&: Logično IN. Proizvede rezultat 1, če oba operanda nista nič, v nasprotnem primeru 0. Velja samo za logične in številske (cela števila ali plavajočo vejico) operande.
- ||: Logično ALI. Proizvede rezultat 0, če sta oba operanda nič, v nasprotnem primeru 1. Velja samo za logične in številske (cela števila ali plavajočo vejico) operande.
- x?y:z: Če-potem-drugače, kot v C. Če x se oceni na nič, potem je rezultat vrednost y. V nasprotnem primeru je rezultat vrednost z. The x operand mora imeti številsko vrednost.
Za več podrobnosti o rezultatih vsakega operaterja glejte priročnik C. Vse od binarni operaterji skupina od leve proti desni znotraj iste stopnje prednosti. Na primer ukaz.
izraz 4*2 < 7
vrne 0.
The &&, ||, in ?: operatorji imajo "leno vrednotenje", tako kot v C, kar pomeni, da se operandi ne ovrednotijo, če niso potrebni za določitev izida. Na primer, v ukaz
izraz {$v? [a]: [b]}
samo eden od [a] oz [b] bo dejansko ovrednoten, odvisno od vrednosti $v. Upoštevajte pa, da to velja le, če je celoten izraz zaprt v oklepajih; sicer bo razčlenjevalnik Tcl ocenil oboje [a] in [b] preden prikličete ekspr ukaz.
Matematične funkcije
Tcl podpira naslednje matematične funkcije v izrazih:
- abs (arg): Vrne absolutno vrednost arg. Arg je lahko celo število ali s plavajočo vejico, rezultat pa se vrne v enaki obliki.
- acos(arg): Vrne lok kosinus od arg, v območju [0,pi] radianov. Arg mora biti v območju [-1,1].
- kot v(arg): Vrne lok sinus od arg, v območju [-pi/2,pi/2] radianov. Arg mora biti v območju [-1,1].
- atan(arg): Vrne tangent loka arg, v območju [-pi/2,pi/2] radianov.
- atan2(x, y): Vrne tangent loka y/x, v območju [-pi, pi] radianov. x in y oboje ne more biti 0.
- strop (arg): Vrne najmanjšo celo število, ki ni manjše od arg.
- cos(arg): Vrne kosinus od arg, merjeno v radianih.
- cosh (arg): Vrne hiperbolični kosinus od arg. Če bi rezultat povzročil prelivanje, se vrne napaka.
- dvojno (arg): Če arg je plavajoča vrednost, vrne arg, sicer pretvori arg na plavajočo in vrne pretvorjeno vrednost.
- exp(arg): Vrne eksponent od arg, opredeljeno kot e**arg. Če bi rezultat povzročil prelivanje, se vrne napaka.
- nadstropje(arg): Vrne največjo integralno vrednost, ki ni večja od arg.
- fmod(x, y): Vrne preostanek deljenja s plavajočo vejico x od y. Če y je 0, vrne se napaka.
- hipot (x, y): izračuna dolžino hipotenuze pravokotnega trikotnika (x*x+y*y).
- int(arg): Če arg je celo število, vrne arg, sicer pretvori arg na celo število z skrajšanjem in vrne pretvorjeno vrednost.
- dnevnik (arg): Vrne naravni logaritem arg. Arg mora biti pozitivna vrednost.
- dnevnik 10(arg): Vrne logaritem osnove 10 arg. Arg mora biti pozitivna vrednost.
- moč (x, y): izračuna vrednost x dvignjen na moč y. Če x je negativna, y mora biti celo število.
- rand(): Vrne število s plavajočo vejico od nič do manj kot ena ali, v matematičnem smislu, obseg [0,1). Seme prihaja iz notranje ure stroja ali pa se lahko nastavi ročno s funkcijo srand.
- krog (arg): Če arg je celo število, vrne arg, sicer pretvori arg na celo število z zaokroževanjem in vrne pretvorjeno vrednost.
- greh (arg): Vrne sinus od arg, merjeno v radianih.
- sinh (arg): Vrne hiperbolični sinus od arg. Če bi rezultat povzročil prelivanje, se vrne napaka.
- sqrt(arg): Vrne kvadratni koren od arg. Arg mora biti nenegativna.
- srand(arg): The arg, ki mora biti celo število, se uporablja za ponastavitev semena za generator naključnih števil. Vrne prvo naključno število iz tega semena. Vsak tolmač ima svoje seme.
- porjavelost (arg): Vrne tangento arg, merjeno v radianih.
- tanh(arg): Vrne hiperbolični tangens arg.
Poleg teh vnaprej določenih funkcij lahko aplikacije definirajo dodatne funkcije z uporabo Tcl_CreateMathFunc().
Vrste, prelivanje in natančnost
Vsi notranji izračuni, ki vključujejo cela števila, se izvajajo s tipom C dolga, vsi notranji izračuni, ki vključujejo plavajočo vejico, pa se izvajajo s tipom C dvojno. Pri pretvorbi niza v plavajočo vejico se zazna prekoračitev eksponenta in povzroči napako Tcl. Za pretvorbo v celo število iz niza je zaznavanje prelivanja odvisno od obnašanja nekaterih rutin v lokalni knjižnici C, zato ga je treba obravnavati kot nezanesljivo. Vsekakor celoten preliv in podtok na splošno nista zaznana zanesljivo za vmesne rezultate. Prelivanje in podtok s plavajočo vejico se zaznata do stopnje, ki jo podpira strojna oprema, ki je na splošno precej zanesljiva.
Pretvorba med notranjimi predstavitvami za celoštevilske, plavajočo vejico in nizovne operande se po potrebi izvede samodejno. Za aritmetične izračune se uporabljajo cela števila, dokler se ne uvede nekaj števila s plavajočo vejico, nato pa se uporabi plavajoče vejico. na primer
izraz 5/4
vrne 1, medtem ko.
izraz 5 / 4.0
izraz 5 / ( [dolžina niza "abcd"] + 0,0)
oba vrneta 1,25. Vrednosti s plavajočo vejico se vedno vrnejo z.''ali an e tako da ne bodo videti kot cele vrednosti. na primer
ekspr 20,0/5,0
vrne 4.0, ne 4.
Operacije z nizi
Vrednosti nizov se lahko uporabljajo kot operandi primerjalnih operatorjev, čeprav ocenjevalec izrazov poskuša izvesti primerjave kot celo število ali s plavajočo vejico, kadar lahko. Če je eden od operandov primerjave niz, drugi pa ima številsko vrednost, se številčni operand pretvori nazaj v niz z uporabo C sprintf specifikacija formata %d za cela števila in %g za vrednosti s plavajočo vejico. Na primer ukazi:
izraz {"0x03" > "2"}
izraz {"0y" < "0x12"}
oba vrneta 1. Prva primerjava se izvede s primerjavo celih števil, druga pa s primerjavo nizov, potem ko je drugi operand pretvorjen v niz 18. Zaradi Tcl-jeve težnje, da vrednosti obravnava kot številke, kadar koli je to mogoče, na splošno ni dobra ideja uporabljati operatorje, kot je == ko resnično želite primerjavo nizov in so vrednosti operandov lahko poljubne; v teh primerih je bolje uporabiti vrvica namesto tega ukaz.