Toán học dễ, Bash script dễ, nên toán/arithmetic trong Bash/Shell script cũng dễ. Thực sự dễ. Đây là cách làm.
Làm việc với số nguyên (Integers)
Arithmetic built-in của Bash chỉ xử lý số nguyên (integer). Nếu khai báo biến với giá trị không phải nguyên:
declare -i e=2.5
Sẽ báo lỗi:
bash: declare: 2.5: syntax error: invalid arithmetic operator (error token is ".5")
Để làm việc số không nguyên, cần chương trình ngoài – nhưng trước tiên, đây là cách dùng arithmetic built-in Bash cho số nguyên.
Dùng khai báo biến
Nếu biến khai báo integer bằng declare, có thể tính toán không cầnพิจารณa đặc biệt:
# Khai báo biến integer declare -i x=4 declare -i y=2 # Tính toán với biến integer result=x/y echo $result
Kết quả:
2
Biểu thức toán học không cần bọc ngoặc nếu biến khai báo integer.
Dùng ngoặc kép/double brackets
Nếu biến không khai báo integer, truyền param script, hoặc output từ chương trình, mặc định coi như string.
Bash xử lý string trong arithmetic – chỉ nếu biểu thức được đánh dấu là arithmetic expression bằng double brackets. Xem ví dụ:
x=6 ((y=x+3)) echo $y
Script trên xuất kết quả đúng:
9
…vì biểu thức arithmetic trong ngoặc được hiểu đúng chứa biến số, không phải string.
Không có ngoặc:
y=x+3
Kết quả:
6+3
Biểu thức bị coi là nối 2 string, không được đánh giá.
Toán tử toán học hỗ trợ
Arithmetic built-in Bash hỗ trợ toán tử:
| Toán tử | Ý nghĩa |
|---|---|
| + | Cộng |
| – | Trừ |
| ++ | Tăng (Increment) |
| — | Giảm (Decrement) |
| * | Nhân |
| / | Chia |
| % | Chia lấy dư (Remainder) |
| ** | Lũy thừa (Exponentiation) |
Boolean và arithmetic
Double brackets cũng thấy khi dùng boolean operator, vì biểu thức đánh giá trả về 0 hoặc 1:
if (( x > y )); then echo "x lon hon y" fi
Xem thêm về Boolean Bash tại đây
Làm việc với số thập phân (Decimal)
Dùng lệnh bc
Như đã chỉ ra, arithmetic Bash với số không nguyên báo lỗi.
Lệnh bc xử lý số thập phân (và toán phức tạp hơn). Cú pháp:
bc TUY_CHON FILE
Trong đó:
- TUY_CHON là danh sách tùy chọn (xem full list tại đây)
- FILE là đường dẫn file text chứa phép tính cần giải.
Vì bc chấp nhận input piped, không cần lưu equation trong file; pipe trực tiếp từ console:
echo "2.32+3.45" | bc
…kết quả đúng:
5.77
Xem chi tiết piping và redirect input/output lệnh dòng lệnh.
Xem manual bc đầy đủ bằng lệnh:
man bc
Có nhiều cú pháp nâng cao cho toán phức tạp trong bc, chi tiết trong manual.