Все про команду Linux/Unix: expr
The вир корисність для Linux shell об’єднує аргументи, а потім оцінює результат як вираз Tcl, повертаючи значення до стандартного виводу.
Оператори, дозволені у виразах Tcl, є підмножиною операторів, дозволених у виразах C, і вони мають те саме значення та пріоритет, що й відповідні оператори C. Вирази майже завжди дають числові результати (цілі числа або значення з плаваючою комою).

Синопсис
Команда має такий загальний вигляд:
вираз arg1 arg2 ...
Операнди
Вираз Tcl складається з комбінації операндів, операторів і дужок. Між операндами та операторами та дужками може використовуватися пробіл; він ігнорується інструкціями виразу.
Якщо можливо, операнди інтерпретуються як цілі значення. Цілі значення можуть бути вказані в десятковому (звичайний регістр) і вісімковому (якщо перший символ операнда є 0), або в шістнадцятковому (якщо перші два символи операнда є 0x). Якщо операнд не має одного з цілих форматів, наведених вище, то він розглядається як число з плаваючою комою, якщо це можливо.
Числа з плаваючою комою можуть бути вказані будь-яким із способів, прийнятих компілятором C, сумісним із ANSI (за винятком того, що f, Ф, л, і Л суфікси не будуть дозволені в більшості установок). Наприклад, усі наведені нижче числа є дійсними числами з плаваючою комою: 2.1, 3., 6e4, 7,91e+16. Якщо числова інтерпретація неможлива, операнд залишається у вигляді рядка, і до нього можна застосувати лише обмежений набір операторів.
Операнди можна вказати будь-яким із наступних способів:
- Як числове значення, ціле чи з плаваючою комою.
- Як змінна Tcl, використовуючи стандарт $ позначення. Значення змінної буде використано як операнд.
- Як рядок, укладений у подвійні лапки. Синтаксичний аналізатор виразів виконуватиме зворотну косу риску, змінну та заміну команд щодо інформації між лапками та використовуватиме отримане значення як операнд.
- Як рядок, укладений у дужки. Символи між відкритою дужкою та відповідною закритою дужкою будуть використовуватися як операнд без будь-яких замін.
- Як команда Tcl, укладена в дужки. Команда буде виконана, а її результат буде використано як операнд.
- Як математична функція, аргументи якої мають будь-яку з наведених вище форм для операндів, наприклад гріх ($x).
Якщо заміни відбуваються вище (наприклад, всередині рядків у лапках), вони виконуються за інструкціями виразу. Однак додатковий рівень заміни, можливо, вже був виконаний синтаксичним аналізатором команд до виклику процесора виразів.
Для деяких прикладів простих виразів припустимо змінну а має значення 3 і змінну б має значення 6. Тоді команда з лівого боку кожного з рядків нижче видасть значення з правого боку рядка:
вираз 3.1 + $a6.1
вираз 2 + "$a.$b"5.6
вираз 4*[llength "6 2"]8
вираз {{word one} < "word $a"}0
Оператори
Нижче наведено дійсні оператори, згруповані в порядку зменшення пріоритету:
- - + ~ !: унарний мінус, унарний плюс, порозрядне НЕ, логічне НІ. Жоден з цих операндів не можна застосовувати до рядкових операндів, а порозрядно НЕ можна застосовувати лише до цілих чисел.
- * / %: помножити, поділити, залишити. Жоден з цих операндів не можна застосовувати до рядкових операндів, а залишок можна застосовувати лише до цілих чисел. Залишок завжди матиме той самий знак, що й дільник, і абсолютне значення, менше за дільник.
- + -: Додавання і віднімання. Дійсний для будь-яких числових операндів.
- << >>: Зсув вліво і вправо. Діє лише для цілочисельних операндів. Зсув вправо завжди поширює знаковий біт.
- < > <= >=: Логічне значення менше, більше, менше або дорівнює і більше або дорівнює. Кожен оператор видає 1, якщо умова істинна, 0 — в іншому випадку. Ці оператори можуть застосовуватися до рядків, а також до числових операндів, у цьому випадку використовується порівняння рядків.
- == !=: Логічне значення дорівнює і не дорівнює. Кожен оператор дає результат нуль/один. Дійсний для всіх типів операндів.
- &: побітове І. Діє лише для цілочисельних операндів.
- ^: Побітове виключне АБО. Діє лише для цілочисельних операндів.
- |: побітове АБО. Діє лише для цілочисельних операндів.
- &&: Логічне І. Видає 1 результат, якщо обидва операнди ненульові, 0 в іншому випадку. Дійсний лише для логічних та числових (цілих чи з плаваючою комою) операндів.
- ||: Логічне АБО. Видає результат 0, якщо обидва операнди дорівнюють нулю, 1 в іншому випадку. Дійсний лише для логічних та числових (цілих чи з плаваючою комою) операндів.
- x?y:z: Якщо-то-інше, як у C. Якщо x оцінюється як відмінний від нуля, тоді результатом є значення y. В іншому випадку результатом є значення z. The x операнд повинен мати числове значення.
Додаткову інформацію про результати, отримані кожним оператором, дивіться у посібнику C. Усі з двійкові оператори групувати зліва направо в межах одного рівня пріоритету. Наприклад, команда.
вираз 4*2 < 7
повертає 0.
The &&, ||, і ?: Оператори мають "ліниве оцінювання", як і в C, що означає, що операнди не оцінюються, якщо вони не потрібні для визначення результату. Наприклад, в команда
вираз {$v? [a]: [b]}
тільки один з [а] або [b] буде фактично оцінено залежно від значення $v. Зауважте, однак, що це справедливо лише в тому випадку, якщо весь вираз укладено в дужки; інакше парсер Tcl оцінить обидва [а] і [b] перед викликом вир команда.
Математичні функції
Tcl підтримує такі математичні функції у виразах:
- прес (арг): Повертає абсолютне значення арг. Арг може бути цілим або з плаваючою комою, а результат повертається в тому ж вигляді.
- acos(арг): повертає арккосинус арг, в діапазоні [0,pi] радіан. Арг має бути в діапазоні [-1,1].
- а саме(арг): повертає арксинус арг, в діапазоні [-pi/2,pi/2] радіан. Арг має бути в діапазоні [-1,1].
- атан(арг): повертає тангенс дуги арг, в діапазоні [-pi/2,pi/2] радіан.
- atan2(x, y): повертає тангенс дуги y/x, в діапазоні [-pi, pi] радіан. x і y не може обидва бути 0.
- стеля(арг): Повертає найменше ціле значення не менше ніж арг.
- cos(арг): повертає косинус арг, вимірюється в радіанах.
- cosh(арг): повертає гіперболічний косинус арг. Якщо результат призведе до переповнення, повертається помилка.
- подвійний(арг): Якщо арг є плаваючим значенням, повертає арг, інакше перетворює арг до floating і повертає перетворене значення.
- досвід (арг): повертає експоненцію арг, визначається як e**арг. Якщо результат призведе до переповнення, повертається помилка.
- підлога(арг): Повертає найбільше інтегральне значення, не більше ніж арг.
- fmod(x, y): повертає залишок з плаваючою комою від ділення x за y. Якщо y дорівнює 0, повертається помилка.
- гіпот (x, y): Обчислює довжину гіпотенузи прямокутного трикутника (x*x+y*y).
- int(арг): Якщо арг це ціле значення, повертає арг, інакше перетворює арг до цілого шляхом усічення та повертає перетворене значення.
- журнал (арг): повертає натуральний логарифм арг. Арг має бути позитивним значенням.
- журнал 10(арг): повертає логарифм із основою 10 арг. Арг має бути позитивним значенням.
- пау (x, y): обчислює значення x піднято до влади y. Якщо x є негативним, y має бути цілим значенням.
- ранд(): Повертає число з плаваючою комою від нуля до трохи менше одиниці або, математично, діапазон [0,1). Насіння надходить із внутрішнього годинника машини або може бути встановлено вручну за допомогою функції srand.
- круглий(арг): Якщо арг це ціле значення, повертає арг, інакше перетворює арг до цілого числа шляхом округлення та повертає перетворене значення.
- гріх(арг): Повертає синус арг, вимірюється в радіанах.
- синх (арг): повертає гіперболічний синус арг. Якщо результат призведе до переповнення, повертається помилка.
- sqrt(арг): повертає квадратний корінь з арг. Арг має бути невід’ємним.
- Сранд(арг): The арг, яке має бути цілим числом, використовується для скидання початкового значення для генератора випадкових чисел. Повертає перше випадкове число з цього насіння. Кожен інтерпретатор має своє зерно.
- засмага (арг): повертає тангенс арг, вимірюється в радіанах.
- tanh(арг): повертає гіперболічний тангенс арг.
На додаток до цих попередньо визначених функцій програми можуть визначати додаткові функції за допомогою Tcl_CreateMathFunc().
Типи, переповнення та точність
Усі внутрішні обчислення з використанням цілих чисел виконуються за допомогою типу C довго, а всі внутрішні обчислення з плаваючою комою виконуються за допомогою типу C подвійний. Під час перетворення рядка в число з плаваючою комою виявляється переповнення експонента, що призводить до помилки Tcl. Для перетворення в ціле число з рядка виявлення переповнення залежить від поведінки деяких підпрограм у локальній бібліотеці C, тому його слід вважати ненадійним. У будь-якому випадку цілочисельне переповнення та недоповнення, як правило, не надійно виявляються для проміжних результатів. Переповнення та недоповнення з плаваючою комою виявляються в тій мірі, яку підтримує апаратне забезпечення, яке, як правило, є досить надійним.
Перетворення між внутрішніми представленнями для цілих, з плаваючою комою та рядкових операндів виконується автоматично за потреби. Для арифметичних обчислень використовуються цілі числа, поки не буде введено деяке число з плаваючою комою, після чого використовується число з плаваючою комою. Наприклад,
вираз 5/4
повертає 1, поки.
вираз 5 / 4.0
вираз 5 / ( [довжина рядка "abcd"] + 0,0)
обидва повертають 1,25. Значення з плаваючою комою завжди повертаються з ``.'' або ан e щоб вони не виглядали як цілі значення. Наприклад,
вираз 20,0/5,0
повертається 4.0, ні 4.
Рядкові операції
Рядкові значення можуть використовуватися як операнди операторів порівняння, хоча засіб обчислення виразів намагається виконувати порівняння як ціле число або з плаваючою комою, коли це можливо. Якщо один з операндів порівняння є рядком, а інший має числове значення, числовий операнд перетворюється назад у рядок за допомогою C sprintf специфікатор формату %d для цілих чисел і %g для значень з плаваючою комою. Наприклад, команди:
вираз {"0x03" > "2"}
вираз {"0y" < "0x12"}
обидва повертають 1. Перше порівняння виконується за допомогою цілого порівняння, а друге виконується за допомогою порівняння рядків після перетворення другого операнда в рядок 18. Через тенденцію Tcl розглядати значення як числа, коли це можливо, зазвичай не варто використовувати такі оператори, як == коли вам дійсно потрібно порівняння рядків, а значення операндів можуть бути довільними; в цих випадках краще використовувати рядок замість цього команда.