2010-06-10 6 views
4

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

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

+0

Я полагаю, что «используйте' bc' вместо »не * довольно * ответ, который вы ищете ... –

+0

@ignacio ... не могли бы вы прокомментировать пример использования bc? – Vijay

+0

'PI = $ (echo" 4 * a (1) "| bc -l)' –

ответ

3

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

«человек баш», например, имеет достаточно информации о выполнении арифметики с помощью bash.

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

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

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

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

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

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

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

+0

Я не нашел ничего на странице руководства. – Vijay

+1

http://osr507doc.sco.com/OSUserG/_math_on_var_in_ksh.html http://www.bo.infn.it/alice/alice-doc/mll-doc/impgde/node18.html –

+0

спасибо за правое направление zed – Vijay

4

Современные оболочки (совместимые с 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, грех .... см:

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

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

Ьс -l

пример:

echo 'sqrt(.977)' | bc -l 
0

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

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

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

Смежные вопросы