使用 Shell 脚本语言计算数学表达式 - 第五部分
你们会感到很舒服,理解 Shell 脚本并根据您的需要流利地编写它们。这是本教程系列的最后一篇文章,我们将使用脚本语言执行一些复杂的数学运算。 Shell Scripting系列的最后四篇文章按时间顺序排列。
- 了解基本的 Linux Shell 脚本语言技巧 – 第一部分
- 供 Linux 新手学习 Shell 编程的 5 个 Shell 脚本 - 第二部分
- 畅游 Linux BASH 脚本世界 – 第三部分
- Linux Shell 编程的数学方面 – 第四部分
让我们从斐波那契数列开始
一种数字模式,其中每个数字都是前面两个数字的总和。系列为0、1、1、2、3、 >5、8……根据定义,斐波那契数列的前两个数字是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。很快我就会带来另一个有趣的话题,你们会喜欢阅读的。在评论部分分享您的宝贵想法。