Toán tử (Operators) trong Shell Script
Ở các bài trước mình có sử dụng một số toán tử nhưng chưa giới thiệu về nó như toán tử cộng (+) trừ (-) nhân (\*) và chia (/), vậy thì trong bài này mình sẽ giới thiệu những toán tử căn bản thường dùng nhất trong Linux.
Có rất nhiều loại toán tử, và được chia thành các nhóm như toán tử toán học (Arithmetic Operators), toán tử quan hệ (Relational Operators), toán tử boolean (Boolean Operators), toán tử xử lý chuỗi (String Operators), toán tử xử lý file (File Test Operators) và cuối cùng là C Shell Operators và Korn Shell Operators.
1. Khoảng trắng là quan trọng
Trước khi đi vào tìm hiểu từng loại toán tử thì bạn phải hiểu khoảng trắng rất quan trọng khi lập trình shell script, nếu bạn chỉ vô tình thiếu khoảng trắng thôi cũng rất tai hại đấy.
Ví dụ: In ra tổng của 2 + 2
Bài viết này được đăng tại [free tuts .net]
Mình sẽ sử dụng lệnh expr để thực hiện tính toán trên số nguyên, xem hai cách dưới đây.
echo `expr 2+2` 2+2
echo `expr 2 + 2` 4
Trong hai ví dụ này khác nhau chỉ là khoảng trắng, nếu chạy thì kết quả cũng sẽ khác nhau:
- Ở ví dụ 1 kết quả là 2+2 vì không có khoảng trắng nên lệnh expr sẽ trả về là lệnh nối chuỗi
- Ở ví dụ 2 kết quả là 4 vì có khoảng trắng nên lệnh expr sẽ trả về kết quả là lệnh cộng hai số nguyên.
Như vậy bạn cần phải chú ý đến khoảng trắng kẻo viết nhầm nhé.
2. Arithmetic Operators - toán tử toán học
Toán tử toán học trong shell script cũng như ngôn ngữ khác, lui tới cũng là các phép toán thông thường.
Giả sử biến a có giá trị là 10, biến b có giá trị là 20 thì các toán tử sẽ được tính như bảng dưới đây.
Operator | Description | Example |
---|---|---|
+ (phép cộng) | Cộng hai giá trị | `expr $a + $b` => 30 |
- (phép trừ) | Trừ hai giá trị | `expr $a - $b` => -10 |
* (phép nhân) | Nhân hai giá trị, phải thêm dấu \* vì * là ký tự đặc biệt trong linux |
`expr $a \* $b` => 200 |
/ (phép chua) | Chia hai giá trị | `expr $b / $a` => 2 |
% (phép chia lấy dư) | Chia lấy dư | `expr $b % $a` => 0 |
= (phép gán) | Phép gán | a=$b sẽ gán giá trị của b vào a |
== (phép so sánh bằng) | Phép so sánh bằng | [ $a == $b ] => false. |
!= (phép so sánh không bằng) | Phéo so sánh không bằng | [ $a != $b ] => true |
3. Relational Operators - toán tử quan hệ
Toán tử quan hệ là toán tử so sánh giá trị giữa hai biểu thức, biểu thức có thể là một giá trị đơn hoặc một biểu thức dài với nhiều phép toán trong đó.
Toán tử quan hệ thường được dùng trong các mệnh đề kiểm tra điều kiện, ví dụ mệnh đề if else, vòng lặp ... Bảng ví dụ dưới đây a sẽ có giá trị là 10 và b là 20.
Operator | Description | Example |
---|---|---|
-eq | So sánh bằng | [ $a -eq $b ] => false |
-ne | So sánh không bằng | [ $a -ne $b ] => true. |
-gt | So sánh lớn hơn | [ $a -gt $b ] => true. |
-lt | So sánh bé hơn | [ $a -lt $b ] => true. |
-ge | So sánh lớn hơn hoặc bằng | [ $a -ge $b ] => false |
-le | So sánh bé hơn hoặc bằng | [ $a -le $b ] => true. |
Lưu ý: Khoảng trắng là bắt buộc phải có nhé các bạn, nếu không sẽ bị báo lỗi sai hoặc cho kết quả không như mong đợi. Ví dụ [ $a -lt $b ] sẽ khác [$a -lt $b].
4. Toán tử boolean
Boolean là kiểu dữ liệu có một trong hai giá trị là đúng hoặc sai, tức true hoặc false. Bảng dưới đây a sẽ có giá trị là 10 và b là 20.
Operator | Description | Example |
---|---|---|
! | Toán tử phủ định, phủ định true => false, phủ định false => true | [ ! false ] => true. |
-o | Toán tử hoặc (OR), trả về true khi một trong hai mệnh đề trái hoặc phải có giá trị true | [ $a -lt 20 -o $b -gt 100 ] => true. |
-a | Toán tử và (AND), trả về true khi cả hai mệnh đề trái và phải đều có giá tr | [ $a -lt 20 -a $b -gt 100 ] => false. |
5. String Operators - toán tử xử lý chuỗi
Khi làm việc với chuỗi đôi khi ta cũng cần phải so sánh, ví dụ khi đăng nhập ta sẽ so sánh chuỗi tên đăng nhập và chuỗi mật khảu có đúng không, nếu đúng thì thành công và sai thì thất bại.
Bảng ví dụ dưới đây a sẽ có giá trị là 'abc' và b là 'efg'.
Operator | Description | Example |
---|---|---|
= | So sánh hai chuỗi bằng nhau hay không | [ $a = $b ] => false |
!= | So sánh hai chuỗi khác nhau hay không | [ $a != $b ] => true. |
-z | Kiểm tra chiều dài chuỗi có bằng 0 hay không (chuỗi rỗng) | [ -z $a ] => false |
-n | Kiểm tra chiều dài chuỗi có lớn hơn 0 hay không | [ -n $a ] => true |
str | Kiểm tra chuỗi str có khác rỗng hay không | [ $a ] => true |
6. File Test Operators - toán tử kiểm tra file
Hầu hết linux được sử dụng làm server nên việc xử lý file là rất thường xuyên, nhất là khi bạn dùng VPS.
Bạn sẽ cần một số toán tử đặc biệt dùng để kiểm tra file như kiểm tra định dạng, đường dẫn, kích thước file ... Khi sử dụng các toán tử này bạn phải chú ý đến quyền của file có hợp lệ hay không.
Bảng ví dụ dưới đây file sẽ có tên là test
, kích thước là 100mb
, và có đầy đủ quyền read, write, execute.
Operator | Description | Example |
---|---|---|
-b file | Kiểm tra có phải là file khối đặc biệt | [ -b $file ] => false. |
-c file | Kiểm tra có phải file là file ký tự đặc biệt | [ -c $file ] => false. |
-d file | Kiểm tra file có phải là một thư mục | [ -d $file ] => false |
-f file | Kiểm tra có phải là một file thông thường | [ -f $file ] => true. |
-g file | Kiểm tra file có được thiết lập group ID (SGID) | [ -g $file ] => false. |
-k file | Kiểm tra file có được thiết lập sticky bit | [ -k $file ] => false. |
-p file | Kiểm tra file có phải là file named pipe | [ -p $file ] => false. |
-t file | Kiểm tra trạng thái của file có đang mở bởi một terminal hay không | [ -t $file ] => false. |
-u file | Kiẻm tra file có được thiết lập User ID (SUID) | [ -u $file ] => false. |
-r file | Kiểm tra user có quyền đọc file hay không | [ -r $file ] => true. |
-w file | Kiểm tra user có quyền write trên file hay không | [ -w $file ] => true. |
-x file | Kiểm tra user có quyền execute file không | [ -x $file ] => true. |
-s file | Kiểm tra kích thước file có lớn hơn 0 hay không | [ -s $file ] => true. |
-e file | Kiểm tra file có tồn tại hay không | [ -e $file ] => true. |
7. Lời kết
Như vậy là mình đã giới thiệu xong các toán tử thường dùng trong Unix/Linux, các toán tử này thường được sử dụng rất nhiều nên khi bạn lập trình nhiều sẽ tự nhớ, bạn không cần phải học thuộc, khi nào quên thì hãy vào bài này để xem lại là ok.