Viss par Linux/Unix komandu: expr
The ekspr lietderība Linux shell savieno argumentus un pēc tam novērtē rezultātu kā Tcl izteiksmi, atgriežot vērtību standarta izvadē.
Tcl izteiksmēs atļautie operatori ir C izteiksmēs atļauto operatoru apakškopa, un tiem ir tāda pati nozīme un prioritāte kā atbilstošajiem C operatoriem. Izteicieni gandrīz vienmēr dod skaitliskus rezultātus (vesels skaitlis vai peldošā komata vērtības).

Anotācija
Komandai ir šāda vispārīga forma:
expr arg1 arg2 ...
Operandi
Tcl izteiksme sastāv no operandu, operatoru un iekavu kombinācijas. Starp operandiem un operatoriem un iekavām var izmantot atstarpi; to ignorē izteiksmes norādījumi.
Ja iespējams, operandi tiek interpretēti kā veselas vērtības. Veselu skaitļu vērtības var norādīt decimāldaļā (parastais gadījums), oktālā (ja operanda pirmā rakstzīme ir 0), vai heksadecimālā (ja pirmās divas operanda rakstzīmes ir 0x). Ja operandam nav neviena no iepriekš norādītajiem veselo skaitļu formātiem, tas tiek uzskatīts par peldošā komata skaitli, ja tas ir iespējams.
Peldošā komata skaitļus var norādīt jebkurā no veidiem, ko pieņem ar ANSI saderīgs C kompilators (izņemot to, ka f, F, l, un L sufiksi nebūs atļauti lielākajā daļā instalāciju). Piemēram, visi šie ir derīgi peldošā komata skaitļi: 2.1, 3., 6e4, 7,91e+16. Ja nav iespējama skaitļu interpretācija, operands tiek atstāts kā virkne un tam var tikt piemērots tikai ierobežots operatoru kopums.
Operandus var norādīt jebkurā no šiem veidiem:
- Kā skaitliska vērtība, vesels skaitlis vai peldošā komata vērtība.
- Kā Tcl mainīgais, izmantojot standartu $ apzīmējums. Mainīgā vērtība tiks izmantota kā operands.
- Kā virkne, kas ievietota dubultpēdiņās. Izteiksmes parsētājs veiks atpakaļvērstā slīpsvītra, mainīgā un komandu aizstāšanu ar informāciju starp pēdiņām un izmantos iegūto vērtību kā operandu.
- Kā virkne, kas ietverta lencēs. Rakstzīmes starp atvērto figūriekavu un atbilstošo aizveramo figūriekava tiks izmantotas kā operands bez aizstāšanas.
- Kā Tcl komanda, kas ievietota iekavās. Komanda tiks izpildīta, un tās rezultāts tiks izmantots kā operands.
- Kā matemātiska funkcija, kuras argumentiem ir kāda no iepriekš minētajām operandu formām, piemēram, grēks ($x).
Ja aizstāšana notiek iepriekš (piemēram, pēdiņās), tās tiek veiktas saskaņā ar izteiksmes norādījumiem. Tomēr, iespējams, komandu parsētājs jau ir veicis papildu aizstāšanas slāni pirms izteiksmes procesora izsaukšanas.
Dažiem vienkāršu izteiksmju piemēriem pieņemsim mainīgo a ir vērtība 3 un mainīgais b ir vērtība 6. Pēc tam katras tālāk norādītās rindas kreisajā pusē esošā komanda radīs vērtību rindas labajā pusē:
izteiksme 3,1 + a6,1 $
2. izteiksme + "$a.$b"5.6
izteiksme 4*[garums "6 2"]8
expr {{word one} < "word $a"}0
Operatori
Derīgie operatori ir norādīti zemāk, sagrupēti dilstošā prioritātes secībā:
- - + ~ !: Unārs mīnuss, unārs pluss, bitu prāts NAV, loģiski NĒ. Nevienu no šiem operandiem nedrīkst lietot virknes operandiem, un bitu griezumā NOT var lietot tikai veselus skaitļus.
- * / %: reizināt, dalīt, atlikumu. Nevienu no šiem operandiem nedrīkst lietot virknes operandiem, un atlikumu var lietot tikai veseliem skaitļiem. Atlikušajam vienmēr būs tāda pati zīme kā dalītājam un absolūtā vērtība, kas ir mazāka par dalītāju.
- + -: saskaitīt un atņemt. Derīgs visiem ciparu operandiem.
- << >>: Pārslēgšanās pa kreisi un pa labi. Derīgs tikai veselu skaitļu operandiem. Nobīde pa labi vienmēr izplata zīmes bitu.
- < > <= >=: Būla vērtība ir mazāka, lielāka, mazāka vai vienāda ar un lielāka vai vienāda. Katrs operators rada 1, ja nosacījums ir patiess, bet 0 pretējā gadījumā. Šos operatorus var lietot gan virknēm, gan ciparu operandiem, un tādā gadījumā tiek izmantota virkņu salīdzināšana.
- == !=: Būla vērtība ir vienāda un nav vienāda. Katrs operators rada nulles/viens rezultātu. Derīgs visiem operandu veidiem.
- &: Bitu gudrs UN. Derīgs tikai veselu skaitļu operandiem.
- ^: ekskluzīvs bitu ziņā VAI. Derīgs tikai veselu skaitļu operandiem.
- |: Bitu pareizs VAI. Derīgs tikai veselu skaitļu operandiem.
- &&: Loģiski UN. Iegūst rezultātu 1, ja abi operandi nav nulle, pretējā gadījumā 0. Derīgs tikai Būla un skaitliskiem (veseliem skaitļiem vai peldošā komata) operandiem.
- ||: loģisks VAI. Iegūst rezultātu 0, ja abi operandi ir nulle, pretējā gadījumā 1. Derīgs tikai Būla un skaitliskiem (veseliem skaitļiem vai peldošā komata) operandiem.
- x?y:z: Ja-tad-citādi, kā C. Ja x novērtē līdz nullei, tad rezultāts ir vērtība y. Pretējā gadījumā rezultāts ir vērtība z. The x operandam ir jābūt skaitliskai vērtībai.
Plašāku informāciju par katra operatora iegūtajiem rezultātiem skatiet C rokasgrāmatā. Visi no binārie operatori grupēt no kreisās uz labo pusi tajā pašā prioritātes līmenī. Piemēram, komanda.
izteiksme 4*2 < 7
atgriež 0.
The &&, ||, un ?: operatoriem ir "slinks novērtējums", tāpat kā C, kas nozīmē, ka operandi netiek novērtēti, ja tie nav nepieciešami rezultāta noteikšanai. Piemēram, sadaļā komandu
expr {$v? [a]: [b]}
tikai viens no [a] vai [b] faktiski tiks novērtēts atkarībā no vērtības $v. Tomēr ņemiet vērā, ka tas ir taisnība tikai tad, ja visa izteiksme ir ietverta iekavās; pretējā gadījumā Tcl parsētājs novērtēs abus [a] un [b] pirms izsaucat ekspr komandu.
Matemātikas funkcijas
Tcl atbalsta šādas matemātiskās funkcijas izteiksmēs:
- abs(arg): atgriež absolūto vērtību arg. Arg var būt vesels skaitlis vai peldošā komata vērtība, un rezultāts tiek atgriezts tādā pašā formā.
- acos(arg): atgriež loka kosinusu arg, diapazonā [0,pi] radiāni. Arg jābūt diapazonā [-1,1].
- kā(arg): atgriež loka sinusu no arg, diapazonā [-pi/2,pi/2] radiāni. Arg jābūt diapazonā [-1,1].
- atan(arg): atgriež loka tangensu arg, diapazonā [-pi/2,pi/2] radiāni.
- atan2(x, y): atgriež loka tangensu y/x, diapazonā [-pi, pi] radiāni. x un y abi nevar būt 0.
- ceil(arg): atgriež mazāko veselo skaitļa vērtību, kas nav mazāka par arg.
- cos(arg): atgriež kosinusu no arg, mēra radiānos.
- cosh (arg): atgriež hiperbolisko kosinusu no arg. Ja rezultāts izraisītu pārplūdi, tiek atgriezta kļūda.
- double (arg): Ja arg ir peldoša vērtība, atgriež arg, pretējā gadījumā pārvērš arg uz peldošu un atgriež konvertēto vērtību.
- exp(arg): atgriež eksponenciālo vērtību arg, definēts kā e**arg. Ja rezultāts izraisītu pārplūdi, tiek atgriezta kļūda.
- stāvs (arg): atgriež lielāko integrāļa vērtību, kas nav lielāka par arg.
- fmod (x, y): atgriež dalījuma peldošā komata atlikumu x autors y. Ja y ir 0, tiek atgriezta kļūda.
- hipotēze(x, y): aprēķina taisnleņķa trīsstūra hipotenūzas garumu (x*x+y*y).
- int(arg): Ja arg ir vesela skaitļa vērtība, atgriež arg, pretējā gadījumā pārvērš arg uz veselu skaitli, saīsinot, un atgriež konvertēto vērtību.
- žurnāls(arg): atgriež naturālo logaritmu arg. Arg jābūt pozitīvai vērtībai.
- log10(arg): atgriež 10 bāzes logaritmu arg. Arg jābūt pozitīvai vērtībai.
- pow(x, y): aprēķina vērtību x pacelts pie varas y. Ja x ir negatīvs, y ir jābūt veselam skaitlim.
- rands (): atgriež peldošā komata skaitli no nulles līdz mazākam par vienu vai, matemātiskā izteiksmē, diapazonu [0,1). Sēklas nāk no mašīnas iekšējā pulksteņa vai to var iestatīt manuāli ar srand funkciju.
- raunds(arg): Ja arg ir vesela skaitļa vērtība, atgriež arg, pretējā gadījumā pārvērš arg uz veselu skaitli, noapaļojot, un atgriež konvertēto vērtību.
- grēks (arg): atgriež sinusu no arg, mēra radiānos.
- sinh(arg): atgriež hiperbolisko sinusu no arg. Ja rezultāts izraisītu pārplūdi, tiek atgriezta kļūda.
- sqrt(arg): atgriež kvadrātsakni no arg. Arg jābūt nenegatīvam.
- srand(arg): arg, kam ir jābūt veselam skaitlim, tiek izmantots, lai atiestatītu nejaušo skaitļu ģeneratora sākumu. Atgriež pirmo nejaušo skaitli no šīs sēklas. Katram tulkam ir sava sēkla.
- iedegums(arg): atgriež tangensu arg, mēra radiānos.
- tanh(arg): atgriež hiperbolisko tangensu arg.
Papildus šīm iepriekš definētajām funkcijām lietojumprogrammas var definēt papildu funkcijas, izmantojot Tcl_CreateMathFunc().
Veidi, pārplūde un precizitāte
Visi iekšējie aprēķini, kas ietver veselus skaitļus, tiek veikti ar C tipu garš, un visi iekšējie aprēķini, kas saistīti ar peldošo komatu, tiek veikti ar C tipu dubultā. Pārvēršot virkni uz peldošā komata, tiek konstatēta eksponenta pārpilde un rodas Tcl kļūda. Pārveidojot par veselu skaitli no virknes, pārpildes noteikšana ir atkarīga no dažu rutīnu darbības vietējā C bibliotēkā, tāpēc tā jāuzskata par neuzticamu. Jebkurā gadījumā veselu skaitļu pārpilde un nepietiekamība starprezultātiem parasti netiek droši noteikt. Peldošā komata pārpilde un pārpilde tiek noteikta tādā mērā, kādu atbalsta aparatūra, kas parasti ir diezgan uzticama.
Pārvēršana starp iekšējiem attēlojumiem veseliem skaitļiem, peldošā komata un virknes operandiem tiek veikta automātiski pēc vajadzības. Aritmētiskajiem aprēķiniem tiek izmantoti veseli skaitļi, līdz tiek ievadīts kāds peldošā komata skaitlis, pēc kura tiek izmantots peldošā komata skaitlis. Piemēram,
izteiksme 5/4
atgriež 1, kamēr.
izteiksme 5 / 4,0
expr 5 / ( [virknes garums "abcd"] + 0,0)
abi atgriežas 1.25. Peldošā komata vērtības vienmēr tiek atgrieztas ar ``.'' vai an e lai tie neizskatītos pēc veselām vērtībām. Piemēram,
expr 20,0/5,0
atgriežas 4.0, nē 4.
Stīgu operācijas
Virknes vērtības var izmantot kā salīdzināšanas operatoru operandus, lai gan izteiksmes vērtētājs mēģina veikt salīdzinājumus kā veselu skaitļu vai peldošā komata, kad tas ir iespējams. Ja viens no salīdzinājuma operandiem ir virkne un otram ir skaitliska vērtība, skaitliskais operands tiek pārveidots atpakaļ par virkni, izmantojot C sprintf formāta norādītājs %d veseliem skaitļiem un %g peldošā komata vērtībām. Piemēram, komandas:
izteiksme {"0x03" > "2"}
izteiksme {"0g" < "0x12"}
abi atgriežas 1. Pirmais salīdzinājums tiek veikts, izmantojot veselu skaitļu salīdzināšanu, bet otrais tiek veikts, izmantojot virkņu salīdzināšanu pēc tam, kad otrais operands ir pārveidots par virkni 18. Tā kā Tcl, kad vien iespējams, vērtības tiek uzskatītas par skaitļiem, parasti nav ieteicams izmantot tādus operatorus kā == ja patiešām vēlaties virkņu salīdzinājumu un operandu vērtības var būt patvaļīgas; šādos gadījumos labāk ir izmantot virkne tā vietā komandu.