当前位置: > shell编程 >

Linux Shell脚本语言与数学表达式

时间:2014-07-01 00:37来源:linux.it.net.cn 作者:IT网
当你理解了Shell脚本,每当需要时都能流畅编写时,那种感觉很爽的。本章中,我们将教你用脚本语言进行比较复杂的数学运算。

让我们从斐波那契数列开始吧。

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21……,它的每一项都是前两项的和,定义数列的首两项为0、1。

脚本1:Fibonacci.sh

#!/bin/bash
echo "How many numbers do you want of Fibonacci series ?" 
  read total 
  x=0 
  y=1 
  i=2 
  echo "Fibonacci Series up to $total terms :: " 
  echo "$x" 
  echo "$y" 
  while [ $i -lt $total ] 
  do 
      i=`expr $i + 1 ` 
      z=`expr $x + $y ` 
      echo "$z" 
      x=$y 
      y=$z 
  done

示例输出

[root@tecmint ~]# chmod 755 Fibonacci.sh
[root@tecmint ~]# ./Fibonacci.sh

How many numbers do you want of Fibonacci series ? 
10 
Fibonacci Series up to 10 terms :: 
0 
1 
1 
2 
3 
5 
8 
13 
21 
34

下载Fibonacci.sh

 

想必大家都清楚,计算机只能理解二进制格式,即0和1,大多数人都喜欢学习十进制与二进制的转换。不如为这个复杂的计算编写一个简单的脚本吧。

脚本2:DecimalToBinary.sh

#!/bin/bash 

for ((i=32;i>=0;i--)); do 
        r=$(( 2**$i)) 
        Probablity+=( $r  ) 
done 

[[ $# -eq 0 ]] &echo -en "Decimal\t\tBinary\n" 
for input_int in $@; do 
s=0 
test ${#input_int} -gt 11 &printf "%-10s\t" "$input_int" 

        for n in ${Probablity[@]}; do 

                if [[ $input_int -lt ${n} ]]; then 
                        [[ $s = 1 ]] && printf "%d" 0 
                else 
                        printf "%d" 1 ; s=1 
                        input_int=$(( $input_int - ${n} )) 
                fi 
        done 
echo -e 
done

示例输出

[root@tecmint ~]# chmod 755 Decimal2Binary.sh
[root@tecmint ~]# ./Decimal2Binary.sh 1121

DecimalBinary 
1121      10001100001

注意:上面的脚本在运行时接受输入,这对我们来说无疑是个好帮手。

下载DecimalToBinary.sh

其实,内置的“bc”命令仅用简单的一行代码就能将十进制数转成二进制。运行如下脚本:

[root@tecmint ~]# echo "obase=2; NUM" | bc

NUM是你想要转换的十进制数,比如,

[root@tecmint ~]# echo "obase=2; 121" | bc 

1111001

 

接下来是另一个脚本,功能与上述脚本恰恰相反,即将二进制值转成十进制。

脚本3:BinaryToDecimal.sh

#!/bin/bash 
echo "Enter a number :" 
read Binary 
if [ $Binary -eq 0 ] 
then 
echo "Enter a valid number " 
else 
while [ $Binary -ne 0 ] 
do 
Bnumber=$Binary 
Decimal=0 
power=1 
while [ $Binary -ne 0 ] 
do 
rem=$(expr $Binary % 10 ) 
Decimal=$((Decimal+(rem*power))) 
power=$((power*2)) 
Binary=$(expr $Binary / 10) 
done 
echo  " $Decimal" 
done 
fi

示例输出

[root@tecmint ~]# chmod 755 Binary2Decimal.sh
[root@tecmint ~]# ./Binary2Decimal.sh

Enter a number : 
11 
3

注意:上述功能在终端也能用“bc”命令达成,如下,

[root@tecmint ~]# echo "ibase=2; BINARY" | bc

BINARY是你想转换的二进制数,例如,

[root@tecmint ~]# echo "ibase=2; 11010101" | bc 

213

下载BinaryToDecimal.sh

 

同样,你自己也能编写八进制、十六进制转换成十进制,反之亦然。用“bc”命令完成这些转换的代码如下,

十进制转八进制

[root@tecmint ~]# echo "obase=8; Decimal" | bc

十进制转十六进制

[root@tecmint ~]# echo "obase=16; Decimal" | bc

八进制转十进制

[root@tecmint ~]# echo "ibase=8; Octal" | bc

十六进制转十进制

[root@tecmint ~]# echo "ibase=16; Hexadecimal" | bc

二进制转八进制

[root@tecmint ~]# echo "ibase=2;obase=8 Binary" | bc

 

Shell脚本语言中一些常用的数值描述如下,

Test : INTEGER1 -eq INTEGER2
Meaning: INTEGER1 is equal to INTEGER2
Test : INTEGER1 -ge INTEGER2
Meaning: INTEGER1 is greater than or equal to INTEGER2
Test: INTEGER1 -gt INTEGER2
Meaning: INTEGER1 is greater than INTEGER2
Test:INTEGER1 -le INTEGER2
Meaning: INTEGER1 is less than or equal to INTEGER2
Test: INTEGER1 -lt INTEGER2
Meaning: INTEGER1 is less than INTEGER2
Test: INTEGER1 -ne INTEGER2
Meaning: INTEGER1 is not equal to INTEGER2

原文链接:http://www.tecmint.com/calculating-mathematical-expressions-in-shell-scripting-part-v/

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容