Website-Suche

Wie man mathematische Ausdrücke in Shell-Skripten berechnet


Mittlerweile sollten Sie sich beim Schreiben und Verstehen grundlegender Shell-Skripte etwas sicherer fühlen. Wenn Sie den vorherigen Teilen dieser Tutorial-Serie gefolgt sind, sind Sie bereits mit Variablen, Schleifen, Bedingungen und einfachen Operationen im Shell-Scripting vertraut.

Dies ist der fünfte Teil dieser Shell-Skript-Tutorialserie. In diesem Beitrag werden wir etwas fortgeschrittene mathematische Operationen untersuchen und wie man sie mit Shell-Skripten handhabt.

Lass uns mit der Fibonacci-Folge anfangen

Die Fibonacci-Reihe ist eine Zahlenfolge, bei der jede Zahl die Summe der beiden vorhergehenden Zahlen ist. Sie beginnt mit 0 und 1, sodass die Reihe lautet: 0, 1, 1, 2, 3, 5, 8, und so weiter.

Drehbuch 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

Dezimal zu Binär Umwandlung

Jeder Computer versteht Binär: nur 0s und 1s. Hier erfahren Sie, wie Sie ein Shell-Skript schreiben können, um eine Dezimalzahl (wie 10) in Binär (1010) zu konvertieren.

Drehbuch 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

Willst du eine schnellere Möglichkeit? Verwende den Befehl bc, der eine Dezimalzahl in einer einzigen Codezeile in Binär umwandeln wird.

echo "obase=2; NUM" | bc

Ersetzen Sie NUM durch die Dezimalzahl, die Sie in Binär umwandeln möchten.

echo "obase=2; 121" | bc

Dies wird das binäre Äquivalent von 121 ausgeben, welches 1111001 ist.

Binär-zu-Dezimal-Umwandlung

Als Nächstes werden wir ein Skript schreiben, das das Gegenteil des obigen Skripts ausführt und binäre Werte in Dezimalwerte umwandelt.

Drehbuch 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"

Die oben genannte Umrechnung kann direkt im Terminal mit dem bc-Befehl wie folgt durchgeführt werden:

echo "ibase=2; BINARY" | bc

Ersetzen Sie einfach BINARY durch die binäre Zahl, die Sie konvertieren möchten.

echo "ibase=2; 11010101" | bc

Dies wird den entsprechenden Dezimalwert ausgeben.

Andere Zahlenbasis-Konvertierungen mit dem bc-Befehl

Ähnlich können Sie Skripte schreiben, um zwischen oktal, hexadezimal und dezimal hin und her zu konvertieren. Sie können diese Konversionen auch direkt im Terminal mit dem Befehl bc durchführen.

Dezimal zu Oktal

echo "obase=8; 123" | bc

Dezimal zu Hexadezimal

echo "obase=16; 123" | bc

Okto zu Dezimal

echo "ibase=8; 173" | bc

Hexadezimal zu Dezimal

echo "ibase=16; 7B" | bc

Binär zu Oktal

echo "ibase=2; obase=8; 101101" | bc

Gängige numerische Tests im Shell-Scripting

Verwende diese Tests innerhalb von if-Anweisungen, um Zahlen zu vergleichen.

TestbefehlBedeutung
[ $a -eq $b ]a ist gleich b
[ $a -ne $b ]a ist nicht gleich b
[ $a -gt $b ]a ist größer als b
[ $a -lt $b ]a ist kleiner als b
[ $a -ge $b ]a ist größer als oder gleich b
[ $a -le $b ]a ist kleiner oder gleich b
Fazit

In diesem fünften Teil unserer Shell-Skript-Tutorial-Serie haben wir uns auf etwas fortgeschrittenere mathematische Operationen eingelassen, wobei wir uns auf die Umwandlung von Zahlen zwischen verschiedenen Zahlensystemen und die Berechnung der Fibonacci-Reihe konzentriert haben.

Mittlerweile sollten Sie sich sicherer im Umgang mit grundlegenden mathematischen Operationen in Shell-Skripten fühlen, wie zum Beispiel beim Erzeugen der Fibonacci-Folge und beim Durchführen von Umrechnungen zwischen dezimalen, binären, oktalen und hexadezimalen Zahlensystemen.