在 Shell 脚本语言中计算数学表达式 - 第五部分
大家会感到很舒服,理解Shell 脚本并根据需要流畅地编写它们。这是本教程系列的最后一篇文章,我们将使用脚本语言执行一些复杂的数学运算。Shell脚本系列的最后四篇文章按时间顺序排列。
- 了解基本的 Linux Shell 脚本语言技巧 - 第一部分
- 5 个 Linux 新手学习 Shell 编程的 Shell 脚本 - 第二部分
- 探索 Linux BASH 脚本世界 – 第三部分
- Linux Shell 编程的数学方面 - 第四部分
让我们从斐波那契数列开始
一种数字模式,其中每个数字都是前两个数字的总和。该系列是0、1、1、2、3、5、8 ……根据定义,斐波那契数列中的前两个数字是 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@example ~]# chmod 755 Fibonacci.sh [root@example ~]# ./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: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@example ~]# chmod 755 Decimal2Binary.sh [root@example ~]# ./Decimal2Binary.sh 1121 Decimal Binary 1121 10001100001
注意:上面的脚本在运行时接受输入,这显然是一种辅助。
下载 Decimal2Binary.sh
内置的 ' bc ' 命令可以在一行脚本中将十进制转换为二进制。在终端上运行。
[root@example ~]# echo "obase=2; NUM" | bc
将“ NUM ”替换为要从十进制转换为二进制的数字。例如,
[root@example ~]# 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@example ~]# chmod 755 Binary2Decimal.sh [root@example ~]# ./Binary2Decimal.sh Enter a number : 11 3
注意:上述功能可以在终端中使用‘ bc ’命令执行。
[root@example ~]# echo "ibase=2; BINARY" | bc
将“ BINARY ”替换为二进制数,即,
[root@example ~]# echo "ibase=2; 11010101" | bc 213
下载 Binary2Decimal.sh
类似地,您可以自己编写从八进制、十六进制到十进制以及反之亦然的转换。在终端中使用“ bc ”命令实现上述结果是。
十进制转八进制
[root@example ~]# echo "obase=8; Decimal" | bc
十进制转十六进制
[root@example ~]# echo "obase=16; Decimal" | bc
八进制转十进制
[root@example ~]# echo "ibase=8; Octal" | bc
十六进制转十进制
[root@example ~]# echo "ibase=16; Hexadecimal" | bc
二进制转八进制
[root@example ~]# 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 脚本教程结束了,无论何时我们发现一个有趣的值得了解的话题或你们的疑问,我们都很乐意从这里继续本系列。
保持健康,关注并关注示例。很快我将带来另一个有趣的话题,你们一定会喜欢阅读。在评论部分分享您宝贵的想法。