网站搜索

使用 Shell 脚本语言计算数学表达式 - 第五部分


你们会感到很舒服,理解 Shell 脚本并根据您的需要流利地编写它们。这是本教程系列的最后一篇文章,我们将使用脚本语言执行一些复杂的数学运算Shell Scripting系列的最后四篇文章按时间顺序排列。

  1. 了解基本的 Linux Shell 脚本语言技巧 – 第一部分
  2. 供 Linux 新手学习 Shell 编程的 5 个 Shell 脚本 - 第二部分
  3. 畅游 Linux BASH 脚本世界 – 第三部分
  4. Linux Shell 编程的数学方面 – 第四部分

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

一种数字模式,其中每个数字都是前面两个数字的总和。系列为01123 >58……根据定义,斐波那契数列的前两个数字是0和1。

脚本1:斐波那契.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

下载斐波那契.sh

您熟悉这样一个事实:计算机只能理解二进制格式,即“0”和“1”,并且我们大多数人都喜欢学习0”和“1”的转换>十进制到二进制。为这个复杂的操作编写一个简单的脚本怎么样?

脚本2:Decimal2Binary.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

Decimal		Binary 
1121      	10001100001

注意:上面的脚本在运行时接受输入,这显然是一种帮助。

下载Decimal2Binary.sh

那么内置的“bc”命令可以在单行脚本中将十进制转换为二进制。在你的终端运行。

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

将“NUM”替换为您想要从十进制转换为二进制的数字。例如,

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

1111001

接下来我们将编写一个与上述脚本相反的脚本,将二进制值转换为十进制

脚本3:Binary2Decimal.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

下载Binary2Decimal.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

这就是本文和系列文章的全部内容。这是Shell脚本系列的最后一篇文章,并不意味着这里不会再有关于脚本语言的文章,它只是意味着Shell脚本教程已经结束,每当我们发现一个有趣的话题值得了解时或者您有疑问,我们很乐意从这里继续该系列。

保持健康、关注并连接到 Howtoing。很快我就会带来另一个有趣的话题,你们会喜欢阅读的。在评论部分分享您的宝贵想法。