Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Thành thao phép toán toán học phức tạp trong Shell Script – Phần V

Các bạn đã thoải mái hiểu Shell Scripts và viết chúng thành thạo theo nhu cầu. Đây là bài cuối series, thực hiện Phép toán Toán học phức tạp hơn dùng scripting language. 4 bài trước của series Shell Scripting theo thứ tự:

  1. Hiểu Basic Linux Shell Scripting Language Tips – Phần I
  2. 5 Shell Scripts cho Linux Newbies học Shell Programming – Phần II
  3. Khám phá thế giới Linux BASH Scripting – Phần III
  4. Khía cạnh Toán học của Linux Shell Programming – Phần IV

Bắt đầu với dãy Fibonacci

Mẫu số mà mỗi số là tổng hai số trước. Dãy: 0, 1, 1, 2, 3, 5, 8... Theo định nghĩa, hai số đầu trong dãy Fibonacci là 0 và 1.

Script 1: Fibonacci.sh
#!/bin/bash
echo "Bạn muốn bao nhiêu số dãy Fibonacci?"
read total
x=0
y=1
i=2
echo "Dãy Fibonacci đến $total số :: "
echo "$x"
echo "$y"
while [ $i -lt $total ]
do
  i=`expr $i + 1 `
  z=`expr $x + $y `
  echo "$z"
  x=$y
  y=$z
done
Kết quả mẫu
[admin@wsxdn.com ~]# chmod 755 Fibonacci.sh
[admin@wsxdn.com ~]# ./Fibonacci.sh
Bạn muốn bao nhiêu số dãy Fibonacci? 10
Dãy Fibonacci đến 10 số ::
0
1
1
2
3
5
8
13
21
34

Tải Fibonacci.sh

Bạn biết máy tính chỉ hiểu định dạng Binary, '0' và '1' và hầu hết chúng ta thích học chuyển Decimal sang Binary. Viết script đơn giản cho phép toán phức tạp này?

Script 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 admin@wsxdn.com; 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
Kết quả mẫu
[admin@wsxdn.com ~]# chmod 755 Decimal2Binary.sh
[admin@wsxdn.com ~]# ./Decimal2Binary.sh 1121
Decimal		Binary
1121		10001100001

Lưu ý: Script trên chấp nhận input lúc chạy, rõ ràng là hỗ trợ.

Tải Decimal2Binary.sh

Lệnh bc tích hợp có thể chuyển decimal sang binary trong script một dòng. Chạy tại terminal:

[admin@wsxdn.com ~]# echo "obase=2; NUM" | bc

Thay 'NUM' bằng số muốn chuyển từ Decimal sang Binary. Ví dụ:

[admin@wsxdn.com ~]# echo "obase=2; 121" | bc
1111001

Tiếp theo viết script ngược lại: Chuyển Binary sang Decimal.

Script 3: Binary2Decimal.sh
#!/bin/bash
echo "Nhập một số:"
read Binary
if [ $Binary -eq 0 ]
then
  echo "Nhập số hợp lệ"
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
Kết quả mẫu
[admin@wsxdn.com ~]# chmod 755 Binary2Decimal.sh
[admin@wsxdn.com ~]# ./Binary2Decimal.sh
Nhập một số: 11
3

Lưu ý: Chức năng trên có thể thực hiện tại terminal bằng bc:

[admin@wsxdn.com ~]# echo "ibase=2; BINARY" | bc

Thay 'BINARY' bằng số nhị phân, ví dụ:

[admin@wsxdn.com ~]# echo "ibase=2; 11010101" | bc
213

Tải Binary2Decimal.sh

Tương tự bạn có thể tự viết chuyển đổi octal, hexadecimal sang decimal và ngược lại. Thực hiện bằng bc:

Decimal sang Octal
[admin@wsxdn.com ~]# echo "obase=8; Decimal" | bc
Decimal sang Hexadecimal
[admin@wsxdn.com ~]# echo "obase=16; Decimal" | bc
Octal sang Decimal
[admin@wsxdn.com ~]# echo "ibase=8; Octal" | bc
Hexadecimal sang Decimal
[admin@wsxdn.com ~]# echo "ibase=16; Hexadecimal" | bc
Binary sang Octal
[admin@wsxdn.com ~]# echo "ibase=2;obase=8 Binary" | bc

Một số Kiểm tra số thường dùng trong shell scripting với mô tả:

Test: INTEGER1 -eq INTEGER2  Ý nghĩa: INTEGER1 bằng INTEGER2
Test: INTEGER1 -ge INTEGER2  Ý nghĩa: INTEGER1 lớn hơn hoặc bằng INTEGER2
Test: INTEGER1 -gt INTEGER2  Ý nghĩa: INTEGER1 lớn hơn INTEGER2
Test: INTEGER1 -le INTEGER2  Ý nghĩa: INTEGER1 nhỏ hơn hoặc bằng INTEGER2
Test: INTEGER1 -lt INTEGER2  Ý nghĩa: INTEGER1 nhỏ hơn INTEGER2
Test: INTEGER1 -ne INTEGER2  Ý nghĩa: INTEGER1 không bằng INTEGER2

Đó là tất cả cho bài này và series. Đây là bài cuối Shell Script Series không có nghĩa là không còn bài về Scripting, chỉ có nghĩa là tutorial shell scripting kết thúc và khi tìm thấy chủ đề thú vị hoặc câu hỏi từ các bạn, sẽ tiếp tục series từ đây.

Hãy khỏe, theo dõi và kết nối Tecmint. Sớm sẽ có chủ đề thú vị khác. Chia sẻ ý kiến quý báu ở Phần bình luận.