Thursday, January 13, 2011

[Shell script] Biểu thức toán học- Math

Trong shell, có 3 cách để thực thi các biểu thức toán học:

1.Sử dụng câu lệnh expr

Câu lệnh expr cho phép tính toán từ command line. Ví dụ:
$ expr 1 + 3
4

Lưu ý, phải có khoảng trắng giữa toán tử và toán hạng. Nếu ở trên đổi thành 1+3 hoặc 1+ 3 hoặc 1 +3, thì đều cho kết quả hoặc có thông báo sai.



Các phép toán như cộng, trừ, nhân, chia có thể đc sử dụng. Nhưng có một điểm cần lưu ý với phép toán nhân(*). Trong linux, ký tự * là một ký tự khá đặc biệt, nó là ký tự đại diện cho toàn bộ một nhóm ký tự, đối tượng nào đó. Nếu sử dụng phép toán a * b trong shell, sẽ có thông báo lỗi. Thay vào đó ta phải sử dụng cú pháp: a \* b. Khi đó, phép toán sẽ đc thực hiện.

Ví dụ về 1 script:
#!/bin/bash
# An example of using the expr command
var1=10
var2=20
var3=`expr $var2 / $var1`
echo The result is $var3

Script trên mô tả về việc lưu một giá trị của một biểu thức vào một biến. Muốn làm được điều này, ta phải sử dụng ký tự gọi là backtick(`).

2.Sử dụng ký tự bracket(dấu ngoặc vuông)

Shell còn cung cấp cho ta một cách để thực hiện các phép toán. Để gán giá trị cho một biến, có thể sử dụng cú pháp sau:
    $[operation]
Ví dụ:
    $ var1 = $[1 + 3]
Lúc này, var1 sẽ nhận giá trị là 4.
Khi đã sử dụng ký tự bracket, thì phép toán * đã nói ở trên trở thành hợp lệ
    $ var2 = $[var1 * 3]
    $ echo var2
    12
Hạn chế của việc sử dụng bracket này đó là nó chỉ hỗ trợ phép tính số nguyên-integer
#!/bin/bash
var1=100
var2=45
var3=$[$var1 / $var2]
echo The final result is $var3

khi chạy script trên, nó sẽ in ra kết quả là 2.
Đây là hạn chế chính của việc sử dụng bracket trong tính toán

3. Sử dụng bc-bash calculator

Đây là một ngôn ngữ cho phép ta nhập các số float vào trong bash shell. bc có thể nhận dạng và xử lý:

-các số (cả integer và float)
-biến
-comment dùng để diễn giải đoạn code( /* */)
-Expression-các biểu thức
-Các statement (ví dụ if -then)
-Các hàm


3.1.Đưa bc vào trong script

Ta có thể đưa bc vào trong srcipt để tính toán. Cú pháp:
variable=`echo "options; expression" | bc`

variable: tên biến
options: các tùy chọn
expression:biểu thức

Với cú pháp trên, ta đã đưa kết quả của expression vào biến variable.



Ở trong script trên, scale cho biết số lượng số sau dấu chấm.

3 comments:

  1. anh co the no them chut ve lenh case dc khong. thanks

    ReplyDelete
  2. case trong bash shell không phải là một lệnh (command). case được sử dụng để kiểm thử một chuỗi với một mẫu so sánh nào đó.
    Vd: file test.sh

    #!/bin/bash
    echo "What's your favorite windows manager:"
    read WM
    case "$WM" in
    mate | MATE ) echo -e "MATE! \n";;
    gnome | gnome ) echo -e "GNOME! \n";;
    kde | KDE ) echo -e "KDE! \n";;
    * ) echo -e "unknown WM! \n";;
    esac

    Có rất nhiều ví dụ về case trong bash shell.

    ReplyDelete
    Replies
    1. anh ơi em muốn hỏi là em so sánh 1 ký tự trong chuỗi vs một kí tự trực tiếp như khoảng trắng chẳng hạn thì có phải gán khoảng trắng đó vào một biến khác rùi mí so sánh trong if? hay là so sánh trực tiếp luôn. thank anh nhìu ạ

      Delete