Wyszukiwanie w witrynie

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.

  1. Zapoznaj się z podstawowymi wskazówkami dotyczącymi języka skryptowego powłoki systemu Linux — część I
  2. 5 skryptów powłoki dla początkujących w Linuksie do nauki programowania w powłoce – część II
  3. Żeglowanie po świecie skryptów Linux BASH – część III
  4. 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.