арифметические операции сценариев оболочки - PullRequest
4 голосов
/ 10 июня 2010

В общем, я буду использовать expr внутри сценариев оболочки для выполнения арифметических операций.

есть ли способ, которым мы можем придумать арифметическую операцию в сценарии оболочки без использования expr?

Ответы [ 3 ]

4 голосов
/ 10 июня 2010

Современные оболочки (POSIX-совместимые = современные, на мой взгляд) поддерживают арифметические операции: + - / * над знаковыми длинными целочисленными переменными +/- 2147483647.

Использование awk для двойной точности, 15 значащих цифр.SQRT.

Используйте bc -l для расширенной точности до 20 значащих цифр.

Синтаксис (zed_0xff) для оболочки, который вы уже видели:

a=$(( 13 * 2 ))
a=$(( $2 / 2 ))
b=$(( $a - 1 ))
a=(( $a + $b ))

awk изначально выполняет двойную точность - операции с плавающей запятой - арифметические операции.Он также имеет sqrt, cos, sin .... см .:

http://people.cs.uu.nl/piet/docs/nawk/nawk_toc.html

bc имеет некоторые определенные функции и расширенное управление, которые доступны с опцией -l:

вс-1

пример:

echo 'sqrt(.977)' | bc -l
3 голосов
/ 10 июня 2010

Вы пытались прочитать "man ksh", если используете ksh?

Например, у "man bash" достаточно информации о выполнении арифметики с bash.

командаtypeset -i может использоваться для указания того, что переменная должна рассматриваться как целое число, например typeset -i MYVAR указывает, что переменная MYVAR является целым числом, а не строкой.После команды typeset попытки присвоить переменной не целое значение завершатся неудачно:

   $ typeset -i MYVAR
   $ MYVAR=56
   $ echo $MYVAR
   56
   $ MYVAR=fred
   ksh: fred: bad number
   $

Для выполнения арифметических операций над переменными или внутри сценария оболочки используйте команду let.let оценивает свои аргументы как простые арифметические выражения.Например:

   $ let ans=$MYVAR+45
   echo $ans
   101
   $

Вышеприведенное выражение также можно записать следующим образом:

   $ echo $(($MYVAR+45))
   101
   $

Все, что заключено в $ ((и)), интерпретируется оболочкой Корна как арифметикавыражение

0 голосов
/ 15 сентября 2016

Точность и диапазон встроенной оболочки $(( <expr> )) зависит от платформы. На 32-разрядной платформе он ограничен 32-разрядными целыми числами (в отличие от expr, который, по-видимому, поддерживает большие целые числа способом, который не зависит от платформы).

(N.B. Имейте в виду, что хотя ^ является допустимым оператором в большинстве оболочек, это не означает «степень», а скорее XOR.)

Кроме того, некоторые снаряды более открыты в этом отношении. Zsh, например, разрешает операции с плавающей запятой, такие как $(( 10/3.0 ))

...