到现在为止,你应该在编写和理解基本的 shell 脚本方面感到更有信心。如果你按照本教程系列的前面部分进行学习,你已经熟悉了变量、循环、条件以及 shell 脚本中的简单操作。
这是这个 shell 脚本教程系列的第五部分。在这篇文章中,我们将探讨稍微复杂的数学操作以及如何使用 shell 脚本处理它们。
让我们从斐波那契数列开始
斐波那契数列是一组数字的序列,其中每个数字是前两个数字的和。它以0和1开始,因此序列为:0, 1, 1, 2, 3, 5, 8,依此类推。
脚本 1: Fibonacci.sh
#!/bin/bash
echo "How many numbers of the Fibonacci series do you want?"
read total
Initialize the first two numbers
x=0
y=1
echo "Fibonacci Series up to $total terms:"
Print the first two numbers
echo "$x"
echo "$y"
Loop starts from the 3rd term
i=2
while [ $i -lt $total ]
do
z=$((x + y)) # Next number is sum of previous two
echo "$z"
x=$y
y=$z
i=$((i + 1))
done
十进制转二进制转换
每台计算机都理解二进制:只有 0
和 1
。以下是您如何编写一个 shell 脚本将一个 十进制 数字(如 10
)转换为 二进制(1010
)的方法。
脚本 2: Decimal2Binary.sh
#!/bin/bash
Create an array of powers of 2 (2^31 to 2^0)
for ((i=32;i>=0;i--)); do
power=$((2**i))
powersOfTwo+=( $power )
done
Check if input was provided
if [ $# -eq 0 ]; then
echo -e "Usage: ./Decimal2Binary.sh <number1> <number2> ..."
exit 1
fi
echo -e "Decimal\t\tBinary"
Convert each number to binary
for num in "$@"; do
binary=""
started=0
for pow in "${powersOfTwo[@]}"; do
if [ $num -lt $pow ]; then
if [ $started -eq 1 ]; then
binary+="0"
fi
else
binary+="1"
num=$((num - pow))
started=1
fi
done
echo -e "$1\t\t$binary"
done
想要更快的方法吗?使用 bc 命令,它可以在一行代码中将十进制数字转换为二进制。
echo "obase=2; NUM" | bc
将 NUM
替换为您想转换为二进制的十进制数。
echo "obase=2; 121" | bc
这将输出121
的二进制等价,即1111001
。
二进制转十进制转换
接下来,我们将编写一个脚本,执行与上述脚本相反的操作,将二进制值转换为十进制。
脚本 3: Binary2Decimal.sh
#!/bin/bash
echo "Enter a binary number:"
read Binary
Check if input is a valid binary number
if ! [[ $Binary =~ ^[01]+$ ]]; then
echo "Please enter a valid binary number (only 0 and 1 allowed)."
exit 1
fi
Decimal=0
power=1
Loop from right to left
while [ $Binary -ne 0 ]; do
digit=$((Binary % 10))
Decimal=$((Decimal + digit * power))
power=$((power * 2))
Binary=$((Binary / 10))
done
echo "Decimal Value: $Decimal"
可以直接在终端中使用 bc
命令进行上述转换,具体如下:
echo "ibase=2; BINARY" | bc
只需将BINARY
替换为您想转换的二进制数字。
echo "ibase=2; 11010101" | bc
这将输出相应的十进制值。
使用 bc 命令进行其他进制转换
同样,您可以编写脚本在八进制、十六进制和十进制之间进行双向转换。您还可以使用bc
命令直接在终端中完成这些转换。
十进制转八进制
echo "obase=8; 123" | bc
十进制转十六进制
echo "obase=16; 123" | bc
八进制转十进制
echo "ibase=8; 173" | bc
十六进制转十进制
echo "ibase=16; 7B" | bc
二进制转八进制
echo "ibase=2; obase=8; 101101" | bc
Shell 脚本中的常见数值测试
在 if
语句中使用这些测试来比较数字。
测试命令 | 意义 |
---|---|
[ $a -eq $b ] | a 等于 b |
[ $a -ne $b ] | a 不等于 b |
[ $a > $b ] | a 大于 b |
[ $a -lt $b ] | a 小于 b |
[ $a -ge $b ] | a 大于或等于 b |
[ $a -le $b ] | a 小于或等于 b |
结论
在我们脚本教程系列的第五部分中,我们涉足了稍微更高级的数学操作,重点是将数字转换为不同的进制以及计算斐波那契数列。
到现在为止,你应该对在shell脚本中处理基本数学运算更加自信,比如生成斐波那契数列以及在十进制、二进制、八进制和十六进制数系统之间进行转换。