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
没有评论:
发表评论