2009-03-03

shell的数学运算

shell的直接数学运算能力很差,它不能进行浮点运算,甚至整数运算也不能直接进行,而要借助内部命令expr,let或(( ))的帮助
expr的运算能力比较有限,它支持的运算符比较少,而且运算符号还要加转义字符,非常麻烦.let和(( ))则比较方便,运算符几乎完全和C语言的一致,而且还支持C语言所不支持的指数运算符(**)
$ math=$(expr 3 \* 4)

$ echo $math
12

$ let "math=3**3"

$ echo $math
27

$ math=$(( 3**2 ))

$ echo $math
9

$ math=$(( 1<<2 ))

$ echo $math
4


expr,let都是shell的内部命令(built-in command).在shell中要进行浮点运算,则要用到这个外部bc命令
bc有它自己的编程语言,不过它的语法和C大致相同,而且因为只需要支持数学运算,所以语法非常简单易学.

在bc中,一个数字的总位数,包括整数部分和小数,叫做length;小数部分的位数叫做scale

在bc中可以定义变量.变量的命令规则和C语言一样,不过只允许使用小写字母.
bc有四个特殊的变量:1.scale定义运算结果的小数位数;2.ibase定义输入的进制;3.obase定义输出的进制
4.last是上一次的运算结果

bc的多行注释也和C语言一样使用/* */,不过bc还可以像shell那样用#来单行注释

bc自带有几个常用的函数:1.length()求数字的总位数;2.read()从标准输入读一个数;3.sqrt()求平方根4.scale()求数字的小数位数

除了自带的几个函数外,使用-l选项运行bc还可以使用一些数学函数,例如一些三角函数

bc也支持自定义函数.格式是:
define [void] func_name(param_list) {
auto var1,var2;
...
}

auto定义的是局部变量.
没有声明为void的函数总是有返回值的;如果没有使用return返回一个值,则函数总是返回0.
参数的传递和C语言一样是按值传递的.但是对于数组,如果定义函数的时候写作*array[],则这个数组是按变量传递的.

bc还有一个print的命令,这个命令提供了另一种输出方式,它输出字符串后不输出换行符

bc的控制结构,if,while,for,break,continue和C的完全一样

bc的语句是用换行符或分号分隔开的.每读入一句用换行符或分号的语句,bc就马上执行该语句并把结果输出.
所以,可以像下面那样调用bc:
$ math=`echo "scale=3; 1/3" | bc`

$ echo $math
.333

还可以使用here document来调用bc:
$ bc <<END
> scale = 3;
> ibase=2;
> 1/10;
> END
.500

当然,还可以写成一个文件,让bc来执行
#!/bin/bc -l
count=2
for(; count < 4; count++)
{
count
}
while( count < 6 )
{
count++
}
ibase=16
scale = 2
"input a number :"
var = read()
var2 = var/4
var2

if ( last != 0 )
{
"last is not zero."
}

define f(n){
if( n > 1 )
return f(n-1)*n
return 1
}

f(4)

array[0] = 1
array[1] = 2
define swap(*arr[])
{
auto tmp
tmp = arr[0]
arr[0] = arr[1]
arr[1] = tmp
}
swap(array[])
array[0]
array[1]

quit


转载请注明出处 http://fornote.blogspot.com

没有评论:

发表评论