如何在Shell脚本中计算数学表达式

到现在为止,你应该在编写和理解基本的 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

在这里插入图片描述

十进制转二进制转换

每台计算机都理解二进制:只有 01。以下是您如何编写一个 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脚本中处理基本数学运算更加自信,比如生成斐波那契数列以及在十进制、二进制、八进制和十六进制数系统之间进行转换。

🔥运维干货分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅侠客

您的打赏是我创作旅程中的关键燃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值