HCM, Khoa KH & KTMTBài thực hành 2 Môn: Hệ điều hành Phương-Duy Nguyễn Email: duynguyen@cse.hcmut.edu.vn Ngày 6 tháng 2 năm 2015 1 Lập trình Bash Shell Điều khiển rẽ nhánh Trong môi trườ
Trang 1Đại học Bách Khoa TP HCM, Khoa KH & KTMT
Bài thực hành 2 Môn: Hệ điều hành
Phương-Duy Nguyễn Email: duynguyen@cse.hcmut.edu.vn
Ngày 6 tháng 2 năm 2015
1 Lập trình Bash Shell
Điều khiển rẽ nhánh Trong môi trường Bash, điều khiển rẽ nhánh cho phép người lập trình quyết định một thao tác được thực thi hay không, quyết định này phụ thuộc vào kết quả đánh giá biểu thức Trong phần này, chúng ta xem xét sử dụng hai lệnh rẽ nhánh có điều kiện là if và case
Lưu ý việc sử dụng các khoảng trắng cần thiết dấu đóng mở ngoặc và trong biểu thức
• Cú pháp rẽ nhánh if
i f [ c o n d i t i o n a l e x p r e s s i o n ]
then
s t a t e m e n t 1
s t a t e m e n t 2
e l s e
s t a t e m e n t 3
s t a t e m e n t 4
f i
Trang 2• Ví dụ với if sử dụng biến
1 #! / b i n / b a s h
2 T1=" f o o "
3 T2=" bar "
4 i f [ "$T1" = "$T2" ] ; then
5 echo e x p r e s s i o n e v a l u a t e d a s true
6 e l s e
7 echo e x p r e s s i o n e v a l u a t e d a s f a l s e
• Cú pháp rẽ nhánh case
case e x p r e s s i o n in
p a t t e r n 1 )
s t a t e m e n t s ; ;
p a t t e r n 2 )
s t a t e m e n t s ; ;
esac
Vòng lặp for, while và until Các cấu trúc lặp cho phép thực thi một khối các câu lệnh lặp đi lặp lại cho đến khi điều kiện dừng thỏa mãn Có nhiều lệnh lặp khác nhau tương ứng với các điều kiện dừng khác nhau Để dễ hình dung trong phần này, các lệnh lặp được tiếp cận thông qua các minh họa ví dụ thay vì các định nghĩa cú pháp cứng nhắc
• Vòng lặp for
1 #! / b i n / b a s h
2 f o r i in ‘ s e q 1 1 0 ‘ ;
• Vòng lặp while
1 #! / b i n / b a s h
3 while [ $COUNTER − l t 10 ] ; do
4 echo The c o u n t e r i s $COUNTER
Trang 3• Vòng lặp until
1 #! / b i n / b a s h
3 u n t i l [ $COUNTER − l t 10 ] ; do
Hàm Giống như trong các ngôn ngữ khác, hàm dùng để gom nhóm các đoạn mã nguồn function name ( ) {
commands
}
Ví dụ về việc khai báo và gọi thực thi hàm
1 #! / b i n / b a s h
2 # F i l e name : s c r i p t s h
3 main ( ) {
4 echo H e l l o World !
5 }
Có thể kiểm tra hoạt động của thủ tục main() trong script trên bằng cách gõ lệnh sau:
source script.sh && main
Áp dụng tương tự cho các hàm khác trong script
Lưu ý: Chỉ cần gọi "source script.sh" ở lần chạy đầu tiên
• Tham số: hàm sẽ gán các tham số truyền vào theo thứ tự vị trí là các giá trị $1,
$2, và cứ thế tiếp tục
• Kết quả trả về: không giống hàm ở các ngôn ngữ khác, hàm trong bash script trả về giá trị biểu diễn trạng thái của nó là thực thi thành công hay bị lỗi Để trả
về giá trị cho hàm thực hiện lời gọi, các biến toàn cùng cỏa thể
• Mặc dù hàm trong bash script có lệnh return nhưng giá trị trả về chỉ là số nguyên giống như đối với lệnh exit Giá trị trả về được lưu trong biến $? Biến toàn cục được sử dụng để truyền giá trị từ một hàm trong bash script:
– Gán giá trị biến toàn cục –
1 #! / b i n / b a s h
2 # F i l e name : s c r i p t s h
3 function myfunc ( ) {
Trang 45 }
6 myfunc
7 echo $ m y r e s u l t
Thực hành các lệnh đã học: ls, cat, find, grep, file, echo, export
Các lệnh trên có thể được cài đặt như sau:
• Debian: sudo apt-get install ls cat find grep file echo export
• Centos/Red Hat: su root; yum install ls cat find grep file echo export
Tìm hiểu lệnh awk Đây là một trong những lệnh được dùng phổ biến, với khả năng
rút trích thông tin Xem ví dụ sau:
1 echo ab mn i j | awk ’ { p r i n t $1 } ’ ## Output i s " ab "
2 echo ab mn i j | awk ’ { p r i n t $3 } ’ ## Output i s " i j "
Sinh viên tự tìm hiểu thêm về cách dùng awk qua lệnh man
Tìm hiểu lệnh ifconfig Đây là một trong những lệnh được dùng phổ biến để xem
thông tin cấu hình thiết bị mạng của hệ thống Xem ví dụ sau:
1 i f c o n f i g
2 e t h 0 Link encap : E t h e r n e t HWaddr 0 0 : 0D: 5 6 : 0 C: 8D: 1 0
3 i n e t addr : 1 9 2 1 6 8 0 1 B c a s t : 1 9 2 1 6 8 0 2 5 5 Mask : 2 5 5 2 5 5 2 5 5 0
4 i n e t 6 addr : f e 8 0 : : 2 0 d : 5 6 f f : f e 0 c : 8 d10 /64 Scope : Link
5 UP BROADCAST RUNNING MULTICAST MTU: 1 5 0 0 M e t r i c : 1
6 RX p a c k e t s : 2 5 3 3 3 9 e r r o r s : 0 dropped : 0 o v e r r u n s : 0 frame : 0
7 TX p a c k e t s : 4 2 3 7 2 9 e r r o r s : 0 dropped : 0 o v e r r u n s : 0 c a r r i e r : 0
8 c o l l i s i o n s : 0 t x q u e u e l e n : 1 0 0 0
9 RX b y t e s : 3 6 1 5 0 0 8 5 ( 3 4 4 MiB) TX b y t e s : 4 9 6 7 6 8 4 9 9 ( 4 7 3 7 MiB)
10 Base a d d r e s s : 0 x e c c 0 Memory : f e 4 e 0 0 0 0 −f e 5 0 0 0 0 0
11 l o Link encap : L o c a l Loopback
12 i n e t addr : 1 2 7 0 0 1 Mask : 2 5 5 0 0 0
13 i n e t 6 addr : : : 1 / 1 2 8 Scope : Host
14 UP LOOPBACK RUNNING MTU: 1 6 4 3 6 M e t r i c : 1
15 RX p a c k e t s : 1 0 9 3 9 4 e r r o r s : 0 dropped : 0 o v e r r u n s : 0 frame : 0
16 TX p a c k e t s : 1 0 9 3 9 4 e r r o r s : 0 dropped : 0 o v e r r u n s : 0 c a r r i e r : 0
17 c o l l i s i o n s : 0 t x q u e u e l e n : 0
18 RX b y t e s : 1 2 3 7 2 3 8 0 ( 1 1 7 MiB) TX b y t e s : 1 2 3 7 2 3 8 0 ( 1 1 7 MiB) Sinh viên tự tìm hiểu thêm về cách dùng ifconfig qua lệnh man
Trang 52 Bài tập
BT1 Dùng kỹ thuật đã học, hiện thực script sysinfo.sh trích xuất các thông tin của
hệ thống về CPU, bộ nhớ, thiết bị mạng Yêu cầu:
• Chương trình được thực thi trên môi trường máy ảo MT13-tinyLinux
• Chương trình được hiện thực và gọi thực thi trong file sysinfo.sh
• Chương trình xuất kết quả ra file output.txt cùng thư mục với file chương trình File kết quả tuân theo định dạng sau
– CPU core(s): xx – Total mem: xxxxxx – IP: xxx.xxx.xxx.xxx – NETMASK: xxx.xxx.xxx.xxx – MTU: xxxx
Trang 6Revision History