Skip to content

Příkaz Linux / Unix: expr

27 de Červen de 2021
hands 149976002 57e953783df78c690f4b8c25

The expr obslužný program pro linuxový shell spojí argumenty a poté vyhodnotí výsledek jako výraz Tcl a vrátí hodnotu na standardní výstup. Operátory povolené ve výrazech Tcl jsou podmnožinou operátorů povolených ve výrazech C a mají stejný význam a prioritu jako odpovídající operátory C. Výrazy téměř vždy přinášejí číselné výsledky (celočíselné hodnoty nebo hodnoty s plovoucí desetinnou čárkou).

Synopse

Příkaz má následující obecnou podobu: expr arg1 arg2 …

Operandy

Výraz Tcl se skládá z kombinace operandů, operátorů a závorek. Mezi operandy a operátory a závorkami může být použito prázdné místo; podle pokynů výrazu je ignorován. Kde je to možné, jsou operandy interpretovány jako celočíselné hodnoty. Celočíselné hodnoty mohou být zadány v desítkové soustavě (normální případ), v osmičkové soustavě (pokud je první znak operandu 0) nebo šestnáctkově (jsou-li první dva znaky operandu 0x). Pokud operand nemá jeden z celočíselných formátů uvedených výše, je s ním zacházeno jako s plovoucí desetinnou čárkou, pokud je to možné. Čísla s plovoucí desetinnou čárkou mohou být specifikována jakýmkoli způsobem, který přijímá kompilátor C kompatibilní s ANSI (kromě toho F, F, l, a L přípony nebudou ve většině instalací povoleny). Například všechny následující hodnoty jsou platná čísla s plovoucí desetinnou čárkou: 2.1, 3., 6e4, 7,91e + 16. Pokud není možná žádná numerická interpretace, je operand ponechán jako řetězec a lze na něj použít pouze omezenou sadu operátorů. Operandy lze určit některým z následujících způsobů:

  • Jako číselná hodnota, celé číslo nebo s plovoucí desetinnou čárkou.
  • Jako proměnná Tcl, používající standard $ notace. Jako operand bude použita hodnota proměnné.
  • Jako řetězec uzavřený do uvozovek. Analyzátor výrazů provede záměnu zpětných lomítek, proměnných a příkazů u informací mezi uvozovkami a výslednou hodnotu použije jako operand.
  • Jako řetězec uzavřený v závorkách. Znaky mezi otevřenou složenou závorkou a odpovídající uzavřenou složenou závorkou budou použity jako operand bez jakýchkoli substitucí.
  • Jako příkaz Tcl uzavřený v závorkách. Příkaz bude proveden a jeho výsledek bude použit jako operand.
  • Jako matematická funkce, jejíž argumenty mají některou z výše uvedených forem pro operandy, například hřích ($ x).

Tam, kde se substituce vyskytují výše (např. Uvnitř uvozovek), jsou prováděny podle pokynů výrazu. Analyzátor příkazů však již mohl provést další vrstvu substituce před voláním procesoru výrazu. U některých příkladů jednoduchých výrazů předpokládejme proměnnou A má hodnotu 3 a proměnnou b má hodnotu 6. Potom příkaz na levé straně každého z níže uvedených řádků vytvoří hodnotu na pravé straně řádku: expr 3.1 + $ a6.1
expr 2 + „$ a. $ b“ 5.6
expr 4 *[llength „6 2“]8
expr {{word one} <"word $ a"} 0

Operátoři

Níže jsou uvedeny platné operátory seskupené v sestupném pořadí podle priority:

  • – + ~!: Unární mínus, unární plus, bitově NENÍ, logické NENÍ. Žádný z těchto operandů nelze použít na operandy řetězce a bitově NENÍ možné použít pouze na celá čísla.
  • * /%: Násobení, dělení, zbytek. Žádný z těchto operandů nelze použít na operandy řetězců a zbytek lze použít pouze na celá čísla. Zbytek bude mít vždy stejné znaménko jako dělitel a absolutní hodnotu menší než dělitel.
  • + –: Sčítání a odčítání. Platí pro všechny číselné operandy.
  • << >>: Levý a pravý posun. Platí pouze pro celočíselné operandy. Posun doprava vždy šíří znaménkový bit.
  • <> <=> =: Boolean menší, větší, menší nebo rovný a větší nebo rovný. Každý operátor vytvoří 1, pokud je podmínka pravdivá, jinak 0. Tyto operátory lze použít na řetězce i na číselné operandy, v takovém případě se použije porovnání řetězců.
  • ==! =: Booleovský rovný a nerovný. Každý operátor vytvoří výsledek nula / jeden. Platí pro všechny typy operandů.
  • &: Bitově a AND. Platí pouze pro celočíselné operandy.
  • ^: Bit-moudrý exkluzivní NEBO. Platí pouze pro celočíselné operandy.
  • |: Bit-moudrý NEBO. Platí pouze pro celočíselné operandy.
  • &&: Logické AND. Produkuje 1 výsledek, pokud jsou oba operandy nenulové, jinak 0. Platí pouze pro booleovské a číselné (celá čísla nebo s plovoucí desetinnou čárkou) operandy.
  • ||: Logické NEBO. Produkuje výsledek 0, pokud jsou oba operandy nula, jinak 1. Platí pouze pro booleovské a číselné (celá čísla nebo s plovoucí desetinnou čárkou) operandy.
  • X?y:z: If-then-else, as in C. If X vyhodnotí na nenulovou, pak je výsledkem hodnota y. Jinak je výsledkem hodnota z. The X operand musí mít číselnou hodnotu.

Podrobnější informace o výsledcích jednotlivých operátorů najdete v příručce C. Všechny binární operátory se seskupují zleva doprava ve stejné úrovni priority. Například příkaz expr 4 * 2 <7

vrátí 0. The &&, ||, a ?: operátoři mají „ líné vyhodnocení “, stejně jako v C, což znamená, že operandy nejsou hodnoceny, pokud nejsou potřebné k určení výsledku. Například v příkazu expr {$ v? [a] : [b]}

pouze jeden z [a] nebo [b] bude skutečně hodnoceno v závislosti na hodnotě $ v. Všimněte si však, že to platí pouze v případě, že je celý výraz uzavřen do složených závorek; jinak analyzátor Tcl vyhodnotí obojí [a] a [b] před vyvoláním expr příkaz.

Matematické funkce

Tcl podporuje následující matematické funkce ve výrazech:

  • břišní svaly(arg): Vrátí absolutní hodnotu arg. Arg může být celé číslo nebo s plovoucí desetinnou čárkou a výsledek je vrácen ve stejné formě.
  • acos (arg): Vrátí kosinový oblouk arg, v dosahu [0,pi] radiány. Arg by měl být v rozsahu [-1,1].
  • jako v(arg): Vrátí sinus oblouku arg, v dosahu [-pi/2,pi/2] radiány. Arg by měl být v rozsahu [-1,1].
  • opálení(arg): Vrátí tangens oblouku arg, v dosahu [-pi/2,pi/2] radiány.
  • atan2 (x, y): Vrátí tangens oblouku y/X, v dosahu [-pi,pi] radiány. X a y nemůže být oba 0.
  • strop (arg): Vrátí nejmenší celočíselnou hodnotu ne menší než arg.
  • cos (arg): Vrátí kosinus z arg, měřeno v radiánech.
  • cosh (arg): Vrátí hyperbolický kosinus z arg. Pokud by výsledek způsobil přetečení, je vrácena chyba.
  • dvojnásobek(arg): Pokud arg je plovoucí hodnota, vrací arg, jinak převede arg na plovoucí a vrátí převedenou hodnotu.
  • exp (arg): Vrátí exponenciální hodnotu arg, definované jako e **arg. Pokud by výsledek způsobil přetečení, je vrácena chyba.
  • podlaha(arg): Vrátí největší celočíselnou hodnotu, která není větší než arg.
  • fmod (x, y): Vrátí zbytek s plovoucí desetinnou čárkou dělení X podle y. Li y je 0, je vrácena chyba.
  • hypot (x, y): Vypočítá délku přepony pravoúhlého trojúhelníku (X*X+y*y).
  • int (arg): Pokud arg je celočíselná hodnota, vrací arg, jinak převede arg na celé číslo zkrácením a vrátí převedenou hodnotu.
  • log (arg): Vrátí přirozený logaritmus arg. Arg musí být kladná hodnota.
  • log10 (arg): Vrátí základní 10 logaritmus arg. Arg musí být kladná hodnota.
  • prášek (x, y): Vypočítá hodnotu X zvednutý k moci y. Li X je negativní, y musí být celočíselná hodnota.
  • rand (): Vrátí číslo s plovoucí desetinnou čárkou z nuly na pouhých méně než jedno nebo, matematicky, rozsah [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)

oba vracejí 1.25. Hodnoty s plovoucí desetinnou čárkou jsou vždy vráceny s „.“ nebo E takže nebudou vypadat jako celočíselné hodnoty. Například expr 20.0 / 5.0

se vrací 4.0, ne 4.

Řetězcové operace

Řetězcové hodnoty lze použít jako operandy operátorů porovnání, i když se vyhodnocovač výrazů pokusí provést porovnání jako celé číslo nebo s plovoucí desetinnou čárkou, pokud je to možné. Pokud je jedním z operandů porovnání řetězec a druhý má číselnou hodnotu, je numerický operand převeden zpět na řetězec pomocí C sprintf specifikátor formátu % d pro celá čísla a %G pro hodnoty s plovoucí desetinnou čárkou. Například příkazy: expr {„0x03″> „2“}
expr {„0y“ <"0x12"}

oba vrací 1. První porovnání se provádí pomocí celočíselného porovnání a druhé se provádí pomocí porovnání řetězců poté, co je druhý operand převeden na řetězec 18. Kvůli tendenci Tcl považovat hodnoty za čísla, kdykoli je to možné, není obecně dobrý nápad používat podobné operátory == když opravdu chcete porovnání řetězců a hodnoty operandů mohou být libovolné; v těchto případech je lepší použít tětiva místo toho povel.