Lập trình Shell (Phần 2)
Chào các bạn, trong phần trước chúng ta đã tìm hiểu khái niệm bash script là gì, cách hoạt động, cú pháp khai báo biến và tham số, cũng như viết một câu lệnh điều kiện như thế nào. Hy vọng các bạn cảm thấy hứng thú để chúng ta tiếp tục phần 2 trong bài hôm nay. Phần này mình xin giới thiệu đến các ...
Chào các bạn, trong phần trước chúng ta đã tìm hiểu khái niệm bash script là gì, cách hoạt động, cú pháp khai báo biến và tham số, cũng như viết một câu lệnh điều kiện như thế nào. Hy vọng các bạn cảm thấy hứng thú để chúng ta tiếp tục phần 2 trong bài hôm nay. Phần này mình xin giới thiệu đến các bạn cách sử dụng vòng lặp, các trình thay thế, và cách khai báo function trong shell như thế nào.
Vòng lặp
Như các bạn thừa biết, vòng lặp để lặp đi lặp lại một hoặc nhóm câu lệnh nào đó cho đến khi gặp điều kiện dừng vòng lặp lại. Có rất nhiều loại vòng lặp trong bash script.
Vòng lặp for
Các bạn tạo file test.sh như phần trước và cấp quyền execute cho nó bằng lệnh chmod +x test.sh.
Ví dụ ta cần tính giai thừa của 5, cú pháp như sau:
#!/bin/bash number=5 result=1 for ((i=1; i<=$number; i++)) do result=$(($result * $i)) done echo $result
Sau khi chạy lệnh > ./test.sh kết quả trả về là 120 = 5!
Vòng lặp for với khoảng số
Để lặp số dùng vòng lặp for, trong shell còn có một cách viết khách cách thông thường đó là dùng khoảng số:
kq=1 for number in {1..5} do kq=$(($kq * $number)) done echo $kq
Kết quả trả về cũng là 120
Chưa hết, trong shell các bạn còn biết nó có thể in kết quả của một command line nào đó ra file hoặc hiển thị trên terminal. Ví dụ muốn in ra danh sách các file, thư mục trong thư mục hiện tại ta dùng vòng lặp for như sau:
for i in $(ls) do echo $i done
Các bạn có thể chạy thử để thấy cả đống thư mục và file trong thư mục đang chạy test.sh được list ra.
Vòng lặp while
Vẫn trong bài toán tính giai thừa của 5, với while ta làm như sau:
# Tính giai thừa của 5 kq=1 i=1 while [ $i -le 5 ] do kq=$(($kq * $i)) ((i++)) done echo $kq
Trong đó : -le là kiểm tra xem biến i <= 5
Cũng không khó hiểu lắm về thuật toán vì nó khá giống các ngôn ngữ lập trình khác, chỉ khó nhớ cái cú pháp viết, các bạn cần chú ý vì viết sai là sẽ báo lỗi ngay.
Các trình thay thế trong shell
Hiểu đơn giản đó là cách để bạn có thể xử lý các ký tự đặc biệt, ví dụ:
a=10 b=20 echo -e "Value of a is $a and value of b is $b"
Kết quả in ra sẽ là
Value of a is 10
and value of b is 20
Vậy -e cho phép bạn hiểu ký tự là ký tự xuống dòng. Bỏ -e để thấy sự khác biệt. Tương tự với bạn có thể thao tác với các ký tự đặc biệt khác.
Thay thế lệnh
Hãy xem qua ví dụ sau
DATE=`date` echo "Date is $DATE"
Kết quả : Date is Thứ sáu, 14 Tháng 9 năm 2018 05:50:00 +07
Từ ví dụ bạn có thể thấy cú pháp `command` (dấu nháy dưới phím Esc) cho phép bạn lấy kết quả của 1 command gán vào 1 biến.
Trình thay thế biến
Các bạn xem ví dụ sau:
#!/bin/sh echo ${var:-"Variable is not set"} echo "1 - Value of var is ${var}" echo ${var:="Variable is not set"} echo "2 - Value of var is ${var}" unset var echo ${var:+"This is default value"} echo "3 - Value of var is $var" var="Prefix" echo ${var:+"This is default value"} echo "4 - Value of var is $var" echo ${var:?"Print this message"} echo "5 - Value of var is ${var}"
Kết quả
Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set
3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix 5 - Value of var is Prefix
Việc thực hiện thay thế giá trị của biến được thể hiện trong bảng sau đây:
Mẫu | Mô tả |
---|---|
${var} | Thay thế giá trị của var |
${var:-word} | Nếu var là null hoặc unset, thì word được thay thế cho var. Giá trị của var không thay đổi. |
${var:=word} | Nếu var là null hoặc unset, var được thiết lập là giá trị của word . |
${var:?message} | Nếu var là null hoặc unset, message được in là lỗi. Lệnh này kiểm tra xem các biến có được thiết lập đúng không. |
${var:+word} | Nếu var được thiết lập, word được thay thế cho var. Giá trị của var không thay đổ |
Function
cũng như các ngôn ngữ lập trình khác, shell cũng cho phép khai báo function để thực hiện một nhóm các lệnh và trả về cho chúng ta kết quả có thể sử dụng tùy từng mục đích. Syntax khá đơn giản:
function_name () { list of commands }
Ví dụ :
said () { echo "Hello Phuc" } said
Kết quả: Hello Phuc
Cách sử dụng có vẻ khá giống javascript đúng không? Truyền tham số cho function thì hơi khác một chút, bạn phải làm như sau:
said () { echo "Hello $1 $2" } said Phuc Phuong
Kết quả: Hello Phuc Phuong
Vậy làm sao chúng ta có thể return kết quả từ một hàm đây:
sum () { a=$(($1 + $2)) return $a } sum 10 20 ret=$? echo "value is $ret"
Kết quả: value is 30
Gọi một function trong một function khác cũng khá đơn giản
number_one () { echo "This is the first function" number_two } number_two () { echo "This is now the second function" } number_one
Kết quả:
This is the first function
This is now the second function
Kết luận
Trên đây là tất cả những kiến thức còn lại của shell script mà mình muốn chia sẻ với các bạn trong bài này, đó là những kiến thức cơ bản cũng như thường dùng nhất với shell, hy vọng sẽ giúp các bạn phần nào trong công việc mỗi khi phải tự viết một file bash. Cảm ơn các bạn!