Skip to content

Linux/Unix-opdracht: expr

24 de juni de 2021
hands 149976002 57e953783df78c690f4b8c25

De expr hulpprogramma voor de Linux-shell voegt argumenten samen en evalueert vervolgens het resultaat als een Tcl-expressie, waarbij de waarde wordt geretourneerd naar de standaarduitvoer. De operators die zijn toegestaan ​​in Tcl-expressies zijn een subset van de operators die zijn toegestaan ​​in C-expressies, en ze hebben dezelfde betekenis en prioriteit als de corresponderende C-operators. Uitdrukkingen leveren bijna altijd numerieke resultaten op (geheel getal of drijvende-kommawaarden).

Korte inhoud

De opdracht heeft de volgende algemene vorm: expr arg1 arg2 …

operanden

Een Tcl-expressie bestaat uit een combinatie van operanden, operators en haakjes. Er mag witruimte worden gebruikt tussen de operanden en operators en haakjes; het wordt genegeerd door de instructies van de uitdrukking. Waar mogelijk worden operanden geïnterpreteerd als gehele waarden. Integer-waarden kunnen worden opgegeven in decimaal (het normale geval), in octaal (als het eerste teken van de operand is 0), of in hexadecimaal (als de eerste twee tekens van de operand zijn 0x). Als een operand niet een van de bovenstaande integer-formaten heeft, wordt het behandeld als een getal met drijvende komma als dat mogelijk is. Drijvende-kommagetallen kunnen worden gespecificeerd op een van de manieren die worden geaccepteerd door een ANSI-conforme C-compiler (behalve dat de f, F, ik, en L achtervoegsels zijn in de meeste installaties niet toegestaan). Alle volgende getallen zijn bijvoorbeeld geldige getallen met drijvende komma: 2.1, 3., 6e4, 7.91e+16. Als er geen numerieke interpretatie mogelijk is, wordt een operand als een tekenreeks achtergelaten en mag er slechts een beperkt aantal operatoren op worden toegepast. Operanden kunnen op een van de volgende manieren worden gespecificeerd:

  • Als een numerieke waarde, een geheel getal of een drijvende komma.
  • Als een Tcl-variabele, met behulp van standaard $ notatie. De waarde van de variabele wordt gebruikt als de operand.
  • Als een string tussen dubbele aanhalingstekens. De expressieparser voert backslash-, variabele- en commandosubstituties uit op de informatie tussen de aanhalingstekens en gebruikt de resulterende waarde als de operand.
  • Als een touwtje omsloten door beugels. De karakters tussen de accolade openen en de overeenkomende accolades sluiten worden gebruikt als de operand zonder enige vervanging.
  • Als een Tcl-opdracht tussen haakjes. De opdracht wordt uitgevoerd en het resultaat wordt gebruikt als de operand.
  • Als een wiskundige functie waarvan de argumenten een van de bovenstaande vormen voor operanden hebben, zoals zonde($x).

Waar substituties hierboven voorkomen (bijv. tussen aanhalingstekens), worden ze uitgevoerd volgens de instructies van de expressie. Er kan echter al een extra substitutielaag zijn uitgevoerd door de opdrachtparser voordat de expressieprocessor werd aangeroepen. Voor enkele voorbeelden van eenvoudige uitdrukkingen, veronderstel dat de variabele een heeft de waarde 3 en de variabele b heeft de waarde 6. Dan zal het commando aan de linkerkant van elk van de onderstaande regels de waarde aan de rechterkant van de regel produceren: expr 3.1 + $a6.1
expr 2 + “$a.$b”5.6
expr 4*[llength “6 2”]8
expr {{woord één} < "woord $a"}0

Operators

De geldige operators worden hieronder vermeld, gegroepeerd in afnemende volgorde van prioriteit:

  • – + ~ !: Unair min, unair plus, bitsgewijs NIET, logisch NIET. Geen van deze operanden mag worden toegepast op tekenreeksoperanden, en bitsgewijze NOT mag alleen worden toegepast op gehele getallen.
  • * / %: Vermenigvuldigen, delen, rest. Geen van deze operanden kan worden toegepast op tekenreeksoperanden en de rest kan alleen worden toegepast op gehele getallen. De rest heeft altijd hetzelfde teken als de deler en een absolute waarde kleiner dan de deler.
  • + –: optellen en aftrekken. Geldig voor alle numerieke operanden.
  • << >>: Links en rechts verschuiven. Alleen geldig voor gehele operanden. Een verschuiving naar rechts propageert altijd het tekenbit.
  • < > <= >=: Boolean kleiner, groter, kleiner dan of gelijk en groter dan of gelijk. Elke operator produceert 1 als de voorwaarde waar is, 0 anders. Deze operatoren kunnen zowel op strings als op numerieke operanden worden toegepast, in welk geval stringvergelijking wordt gebruikt.
  • == !=: Booleaans gelijk en niet gelijk. Elke operator levert een nul/één resultaat op. Geldig voor alle operandtypen.
  • &: Bitgewijs EN. Alleen geldig voor gehele operanden.
  • ^: Bitsgewijze exclusieve OR. Alleen geldig voor gehele operanden.
  • |: Bitgewijs OR. Alleen geldig voor gehele operanden.
  • &&: Logische EN. Produceert een 1 resultaat als beide operanden niet nul zijn, anders 0. Alleen geldig voor booleaanse en numerieke (gehele of drijvende-komma) operanden.
  • ||: Logische OF. Produceert een 0-resultaat als beide operanden nul zijn, anders 1. Alleen geldig voor booleaanse en numerieke (gehele of drijvende-komma) operanden.
  • X?ja:z: Als-dan-anders, zoals in C. Als X evalueert tot niet-nul, dan is het resultaat de waarde van ja. Anders is het resultaat de waarde van z. De X operand moet een numerieke waarde hebben.

Zie de C-handleiding voor meer details over de resultaten die door elke operator worden geproduceerd. Alle binaire operatoren groeperen van links naar rechts binnen hetzelfde prioriteitsniveau. Bijvoorbeeld het commando expr 4*2 < 7

geeft 0 terug. De &&, ||, en ?: operators hebben “lazy Evaluation”, net als in C, wat betekent dat operanden niet worden geëvalueerd als ze niet nodig zijn om de uitkomst te bepalen. Bijvoorbeeld in het commando expr {$v ? [a] : [b]}

slechts één van [a] of [b] wordt daadwerkelijk geëvalueerd, afhankelijk van de waarde van $v. Merk echter op dat dit alleen waar is als de hele uitdrukking tussen accolades staat; anders zal de Tcl-parser beide evalueren [a] en [b] voordat u de . aanroept expr opdracht.

Wiskundige functies

Tcl ondersteunt de volgende wiskundige functies in uitdrukkingen:

  • buikspieren(arg): Retourneert de absolute waarde van arg. Arg kan een geheel getal of een drijvende komma zijn en het resultaat wordt in dezelfde vorm geretourneerd.
  • acos(arg): Retourneert de boogcosinus van arg, binnen bereik [0,pi] radialen. Arg zou in het bereik moeten zijn [-1,1].
  • als in(arg): Retourneert de boogsinus van arg, binnen bereik [-pi/2,pi/2] radialen. Arg zou in het bereik moeten zijn [-1,1].
  • een tint(arg): Retourneert de boogtangens van arg, binnen bereik [-pi/2,pi/2] radialen.
  • atan2(x, ja): Retourneert de boogtangens van ja/X, binnen bereik [-pi,pi] radialen. X en ja kunnen niet allebei 0 zijn.
  • plafondarg): Retourneert de kleinste gehele waarde die niet kleiner is dan arg.
  • omdat (arg): Retourneert de cosinus van arg, gemeten in radialen.
  • kos (arg): Retourneert de cosinus hyperbolicus van arg. Als het resultaat een overflow zou veroorzaken, wordt een fout geretourneerd.
  • dubbele(arg): Als arg is een zwevende waarde, retourneert arg, anders converteert arg naar zwevend en retourneert de geconverteerde waarde.
  • exp(arg): Geeft de exponentiële waarde van arg, gedefinieerd als e**arg. Als het resultaat een overflow zou veroorzaken, wordt een fout geretourneerd.
  • verdieping(arg): Retourneert de grootste integrale waarde die niet groter is dan arg.
  • fmod(x, ja): Retourneert de drijvende-kommarest van de deling van X door ja. Als ja is 0, wordt een fout geretourneerd.
  • hypot(x, ja): Berekent de lengte van de hypotenusa van een rechthoekige driehoek (X*X+ja*ja).
  • int(arg): Als arg is een geheel getal, retourneert arg, anders converteert arg naar geheel getal door afkappen en retourneert de geconverteerde waarde.
  • log(arg): Retourneert de natuurlijke logaritme van arg. Arg moet een positieve waarde zijn.
  • log10(arg): Retourneert de logaritme met grondtal 10 van arg. Arg moet een positieve waarde zijn.
  • pow(x, ja): Berekent de waarde van X verheven tot de macht ja. Als X is negatief, ja moet een geheel getal zijn.
  • rand(): Retourneert een getal met drijvende komma van nul tot net minder dan één of, in wiskundige termen, het bereik [0,1). The seed comes from the internal clock of the machine or may be set manual with the srand function.
  • round(arg): If arg is an integer value, returns arg, otherwise converts arg to integer by rounding and returns the converted value.
  • sin(arg): Returns the sine of arg, measured in radians.
  • sinh(arg): Returns the hyperbolic sine of arg. If the result would cause an overflow, an error is returned.
  • sqrt(arg): Returns the square root of argArg must be non-negative.
  • srand(arg): The arg, which must be an integer, is used to reset the seed for the random number generator. Returns the first random number from that seed. Each interpreter has its own seed.
  • tan(arg): Returns the tangent of arg, measured in radians.
  • tanh(arg): Returns the hyperbolic tangent of arg.

In addition to these predefined functions, applications may define additional functions using Tcl_CreateMathFunc().  

Types, Overflow, and Precision

All internal computations involving integers are done with the C type long, and all internal computations involving floating-point are done with the C type double. When converting a string to floating-point, exponent overflow is detected and results in a Tcl error. For conversion to integer from string, detection of overflow depends on the behavior of some routines in the local C library, so it should be regarded as unreliable. In any case, integer overflow and underflow are generally not detected reliably for intermediate results. Floating-point overflow and underflow are detected to the degree supported by the hardware, which is generally pretty reliable.

Conversion among internal representations for integer, floating-point, and string operands is done automatically as needed. For arithmetic computations, integers are used until some floating-point number is introduced, after which floating-point is used. For example,

expr 5 / 4

returns 1, while

expr 5 / 4.0
expr 5 / ( [string length “abcd”] + 0,0)

beide keren 1,25 terug. Drijvende-kommawaarden worden altijd geretourneerd met een “.” of een e zodat ze er niet uitzien als gehele waarden. Bijvoorbeeld expr 20.0/5.0

geeft terug 4.0, niet 4.

Stringbewerkingen

Tekenreekswaarden kunnen worden gebruikt als operanden van de vergelijkingsoperatoren, hoewel de expressie-evaluator probeert vergelijkingen uit te voeren als geheel getal of drijvende komma wanneer dit mogelijk is. Als een van de operanden van een vergelijking een tekenreeks is en de andere een numerieke waarde heeft, wordt de numerieke operand terug geconverteerd naar een tekenreeks met de C sprintf formaatspecificatie %d voor gehele getallen en %g voor drijvende-kommawaarden. Bijvoorbeeld de opdrachten: expr {“0x03” > “2”}
expr {“0j” < "0x12"}

beide retourneren 1. De eerste vergelijking wordt gedaan met behulp van integer-vergelijking en de tweede wordt gedaan met behulp van tekenreeksvergelijking nadat de tweede operand is geconverteerd naar de tekenreeks 18. Vanwege de neiging van Tcl om waarden waar mogelijk als getallen te behandelen, is het over het algemeen geen goed idee om operators zoals . te gebruiken == wanneer je echt stringvergelijking wilt en de waarden van de operanden willekeurig kunnen zijn; in deze gevallen is het beter om de draad commando in plaats daarvan.