Obliczanie wyrażeń matematycznych w języku skryptowym powłoki — część V
Wy, ludzie, czulibyście się komfortowo, rozumiejąc Skrypty Shell i pisząc je płynnie, zgodnie ze swoimi potrzebami. To ostatni post z tej serii samouczków, w którym będziemy przeprowadzać nieco złożone operacje matematyczne przy użyciu języka skryptowego. Ostatnie cztery artykuły z serii Skrypty powłoki, ułożone chronologicznie.
- Zapoznaj się z podstawowymi wskazówkami dotyczącymi języka skryptowego powłoki systemu Linux — część I
- 5 skryptów powłoki dla początkujących w Linuksie do nauki programowania w powłoce – część II
- Żeglowanie po świecie skryptów Linux BASH – część III
- Matematyczny aspekt programowania w powłoce systemu Linux – część IV
Zacznijmy od szeregu Fibonacciego
Układ liczb, w którym każda liczba jest sumą dwóch poprzedzających liczb. Seria to 0, 1, 1, 2, 3, 5, 8…… Z definicji pierwsze dwie liczby w sekwencji Fibonccai to 0 i 1.
Skrypt 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
Przykładowe wyjście
[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
Pobierz Fibonacci.sh
Wiesz, że komputer rozumie tylko format binarny, tj. „0” i „1”, a większość z nas z przyjemnością uczyła się konwersji Dziesiętny na binarny. A może napiszesz prosty skrypt dla tej złożonej operacji.
Skrypt 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
Przykładowe wyjście
[root@tecmint ~]# chmod 755 Decimal2Binary.sh
[root@tecmint ~]# ./Decimal2Binary.sh 1121
Decimal Binary
1121 10001100001
Uwaga: powyższy skrypt akceptuje wprowadzanie danych w czasie wykonywania, co oczywiście jest pomocą.
Pobierz Decimal2Binary.sh
Cóż, wbudowane polecenie „bc” może przekonwertować liczbę dziesiętną na binarną w skrypcie składającym się z jednej linii. Uruchom, na swoim terminalu.
[root@tecmint ~]# echo "obase=2; NUM" | bc
Zastąp „NUM” liczbą, którą chcesz przekonwertować z dziesiętnego na binarny. Na przykład,
[root@tecmint ~]# echo "obase=2; 121" | bc
1111001
Następnie napiszemy skrypt, który będzie działał odwrotnie niż powyższy skrypt, Konwersja wartości binarnych na Dziesiętny.
Skrypt 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
Przykładowe wyjście
[root@tecmint ~]# chmod 755 Binary2Decimal.sh
[root@tecmint ~]# ./Binary2Decimal.sh
Enter a number :
11
3
Uwaga: Powyższą funkcję można wykonać w terminalu za pomocą polecenia „bc” as.
[root@tecmint ~]# echo "ibase=2; BINARY" | bc
Zamień „BINARY” na liczbę binarną, np.
[root@tecmint ~]# echo "ibase=2; 11010101" | bc
213
Pobierz Binary2Decimal.sh
Podobnie możesz samodzielnie napisać konwersję z formatu ósemkowego, szesnastkowego na dziesiętny i odwrotnie. Osiągnięcie powyższego wyniku w terminalu za pomocą polecenia „bc” jest.
Dziesiętny do ósemkowego
[root@tecmint ~]# echo "obase=8; Decimal" | bc
Dziesiętny na szesnastkowy
[root@tecmint ~]# echo "obase=16; Decimal" | bc
Od ósemkowego do dziesiętnego
[root@tecmint ~]# echo "ibase=8; Octal" | bc
Szesnastkowy na dziesiętny
[root@tecmint ~]# echo "ibase=16; Hexadecimal" | bc
Binarny do ósemkowego
[root@tecmint ~]# echo "ibase=2;obase=8 Binary" | bc
Niektóre z typowych testów numerycznych używanych w języku skryptowym powłoki z opisem to.
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
To wszystko w tym artykule i w całej serii artykułów. To jest ostatni artykuł z serii skryptów Shell i nie oznacza to, że nie pojawi się już żaden artykuł na temat języka skryptowego, oznacza to jedynie, że tutorial dotyczący skryptów Shell dobiegł końca i zawsze, gdy znajdziemy ciekawy temat warty poznania lub zapytanie od Was, z przyjemnością będziemy kontynuować serię od tego miejsca.
Zachowaj zdrowie, dostrojony i połączony z Tecmint. Wkrótce przyjdę z kolejnym interesującym tematem, który z chęcią przeczytacie. Podziel się swoimi cennymi przemyśleniami w Sekcji komentarzy.