Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 52 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
52
Dung lượng
117,62 KB
Nội dung
ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN o Tài liệu hướng dẫn thực hành HỆ ĐIỀU HÀNH Biên soạn: ThS Phan Đình Duy ThS Nguyễn Thanh Thiện KS Trần Đại Dương KS Trần Hồng Lộc MỤC LỤC BÀI LẬP TRÌNH TRONG MÔI TRƯỜNG SHELL .1 2.1 Mục tiêu 2.2 Nội dung thực hành 2.3 Sinh viên chuẩn bị .1 2.4 Hướng dẫn thực hành 2.5 Bài tập ôn tập .47 NỘI QUY THỰC HÀNH Sinh viên tham dự đầy đủ buổi thực hành theo quy định giảng viên hướng dẫn (GVHD) (6 buổi với lớp thực hành cách tuần 10 buổi với lớp thực hành liên tục) Sinh viên phải chuẩn bị nội dung phần “Sinh viên viên chuẩn bị” trước đến lớp GVHD kiểm tra chuẩn bị sinh viên 15 phút đầu buổi học (nếu khơng có chuẩn bị sinh viên bị tính vắng buổi thực hành đó) Sinh viên làm tập ôn tập để cộng điểm thực hành, tập ôn tập GVHD kiểm tra sinh viên có yêu cầu buổi học liền sau thực hành Điểm cộng tối đa khơng điểm cho thực hành Bài LẬP TRÌNH TRONG MƠI TRƯỜNG SHELL 2.1 Mục tiêu Bài thực hành giúp sinh viên: Làm quen tìm hiểu cách sử dụng ngơn ngữ shell để lập trình Thực hành lập trình số cầu trúc điều khiển shell Viết số chương trình đơn giản ngơn ngữ shell 2.2 Nội dung thực hành Thực hành lệnh tương tác với hệ điều hành Linux thơng qua shell Tìm hiểu thực hành ngôn ngữ shell 2.3 Sinh viên chuẩn bị Đọc phần hướng dẫn thực hành trước nhà Viết lại đoạn code phần 2.4 theo hướng dẫn 2.4 Hướng dẫn thực hành 2.4.1 Sử dụng shell ngơn ngữ lập trình Shell sử dụng ngơn ngữ lập trình Có hai cách để viết chương trình điều khiển shell Cách thứ gõ chương trình từ dịng lệnh, cách đơn giản Tuy nhiên thành thạo gộp lệnh vào tệp để chạy (chúng tương đương với cách DOS gọi tệp *.bat), cách hiệu tận dụng triệt để tính tự động hóa shell 2.4.1.1 Điều khiển shell từ dịng lệnh Chúng ta bắt đầu với ví dụ đơn giản sau Giả sử đĩa cứng có nhiều file mã nguồn c, bạn muốn truy tìm hiển thị nội dung tệp nguồn chứa chuỗi main() Thay dùng lệnh grep để tìm file sau quay lại dùng lệnh more để hiển thị file, ta dùng lệnh điều khiển shell tự động sau: $ for file in * if grep -l 'main( ) ' $file then more $fỉle fi done Khi gõ lệnh chưa hoàn chỉnh từ dấu nhắc shell, shell chuyển dấu nhắc thành >, shell chờ nhập đầy đủ lệnh trước thực tiếp Shell tự động hiểu lệnh bắt đầu kết thúc Trong ví dụ lệnh for kết thúc done Khi gõ xong done, shell bắt đầu thực thi tất gõ vào for Ở đây, file biến shell, * tập hợp đại diện cho tên tệp tìm thấy thư mục hành Bất tiện việc điều khiển ngôn ngữ shell từ dịng lệnh khó lấy lại khối lệnh trước để sửa đổi thực thi lần Nếu ta nhấn phím up/down shell trả lại khối lệnh sau: $ for file in * ; ; if grep -1 'main( )’ $file; then ; more $file; fi; done Đây cách shell Linux thường làm phép thực thi nhiều lệnh lúc dòng lệnh Các lệnh cách dấu (;) Ví dụ: $ mkdir myfolđer; cd myfolder; tạo thư mục myfolder lệnh mkdir sau chuyển vào thư mục lệnh cd Chỉ cần gõ Enter lần để thực thi hai lệnh lúc Tuy nhiên sửa chữa khối lệnh không dễ dàng dễ gây lỗi Chúng thuận tiện kết hợp khoảng vài ba lệnh Để dễ bảo trì, bạn đưa lệnh vào tập tin yêu cầu shell đọc nội dung tập tin để thực thi lệnh Những tập tin gọi tập tin kịch (shell script) 2.4.1.2 Điều khiển shell tập tin kịch (script file) Trước hết bạn dùng lệnh $cat > first.sh hay trình soạn thảo vi hay emacs (hoặc mc) hay gedit để soạn nội dung tập tin first.sh sau: # !/bin/ sh # first.sh # Script tìm thư mục hành chuỗi mang nội dung # main( ), nội dung fìle hiển thị hình tìm thấy for file in * if grep -l 'main( ) ' $file then more $fỉle fi done exit Khơng thích C, dịng thích (comment) ngơn ngữ shell bắt đầu ký tự # Tuy nhiên, có thích đặc biệt #!/bin/sh Đây thực khơng phả i thích Cặp ký tự #! thị yêu cầu shell triệu gọi shell sh nằm thư mục /bin Shell sh chịu trách nhiệm thông dịch lệnh nằm tập tin script tạo Có thể định #!/bin/bash làm shell thơng dịch thay cho sh, Linux thật sh bash Tuy nhiên nêu, hệ Unix sử dụng shell sh làm chuẩn, thói quen tốt cho lập trình viên sử dụng shell sh Khi tiếp cận với UNIX, ta cảm thấy quen thân thuộc với shell Nên chạy script shell phụ (như gọi sh chẳng hạn), thay đổi mơi trường mà script gây không ảnh hưởng đến môi trường làm việc Chỉ thị #! cịn dùng để gọi chương trình ta muốn chạy trước script dịch Lệnh exit bảo đảm script sau thực thi trả mã lỗi, cách mà hầu hết chương trình nên làm, mã lỗi trả dùng đến trường hợp thực tương tác trực tiếp từ dòng lệnh Tuy nhiên, việc nhận biết mã trả đoạn script sau thực thi lại thường có ích bạn triệu gọi script từ script khác Trong đoạn chương trình trên, lệnh exit trả 0, cho biết script thực thi thành cơng khỏi shell gọi Mặc dù lưu tập tin script với tên sh, UNIX Linux không bắt buộc điều Hiếm Linux sử dụng phần đuôi mở rộng tập tin làm dấu hiệu nhận dạng, tên tệp script tùy ý Tuy sh cách nhận tập tin script shell cách nhanh chóng 2.4.1.3 Thực thi script Chúng ta vừa tạo tập tin script first.sh, gọi thực thi theo hai cách Cách đơn giản gọi trình shell với tên tập tin script làm đối số Ví dụ: $ /bin/sh first.sh Cách gọi bình thường, quen thuộc ta gọi first.sh từ dòng lệnh, tương tự lệnh Linux thông thường Để làm điều này, trước hết cần chuyển thuộc tính thực thi (x) cho tập tin script lệnh chmod sau: $ chmod +x first.sh Sau triệu gọi script theo cách thứ hai tiện lợi hơn: $ first.sh Có thể lệnh không thực thành công ta nhận thơng báo lỗi 'command not found' (khơng tìm thấy lệnh) Điều xảy biến mơi trường PATH thường khơng chứa đường dẫn hay vị trí thư mục hành Để khắc phục, ta thêm vào biến môi trường PATH đường dẫn thư mục hành sau: $ PATH=$PATH: Nếu muốn Linux tự động nhớ thư mục hành đăng nhập bạn thêm lệnh PATH=$PATH : vào cuối tệp bash_profile (file triệu gọi lúc hệ thống đăng nhập - tương tự autoexec.bat DOS) Tuy nhiên cách ngắn gọn đơn giản mà ta thường làm định rõ dấu thư mục hành / lệnh Ví dụ: $ / first.sh Lưu ý: Đối với tài khoản root, không nên thay đổi biến môi trường PATH (bằng cách thêm dấu định ) cho phép truy tìm thư mục hành Điều khơng an tồn dễ tạo lỗ hổng bảo mật Ví dụ, quản trị hệ đăng nhập quyền root, triệu gọi chương trình Linux mà họ tưởng thư mục quy định /bin, biến PATH cho phép tìm thư mục hành nhà quản trị thực thi chương trình thay chương trình Linux /bin Vì vậy, nên tạo thói quen đặt dấu / trước tập tin để ám truy xuất thư mục hành Một bạn tin first.sh chạy tốt, di chuyển đến thư mục khác thích hợp thư mục hành Nếu lệnh script dành cho mục đích riêng bạn, bạn tạo thư mục /bin thư mục chủ (home) mà nhà quản trị quy định cho người dùng, sau thêm đường dẫn vào biến mơi trường PATH Nếu muốn script gọi người dùng khác, đặt vào thư mục /usr/1ocal/bin Thơng thường, phép script if [ "$timeofdayl" ="yes"] Trong trường hợp chuỗi nhập vào null, shell diễn dịch biểu thức thành: if [" "="yes "] script chạy tốt Elif_control.sh sửa lại hồn chỉnh sau: Ví dụ 2-5: elif_control2.sh #!/bin/sh echo -n "Is it morning? Please answer yes or no: " read timeofday if [ "$timeofday" = "yes" ]; then echo "Good morning" elif [ "$timeofday" = "no" ]; then echo "Good afternoon" else echo "Sorry, $timeofday not recognized Enter yes or no" exit fi exit Hãy kiểm tra lại elif_controi2.sh cách nhấn Enter shell đưa câu hỏi Script chạy bảo đảm chuẩn 35 Lệnh echo thường xuống hàng sau đưa thơng báo Có thể dùng lệnh printf thay cho echo Một vài shell cho phép lệnh echo -e dịng, chúng khơng phải phổ biến để bạn sử dụng 2.4.4.4 Lệnh for Sử dụng for để lặp lại số lần với giá trị xác định Phạm vi lặp nằm tập hợp chuỗi định tường minh chương trình kết trả từ biến biểu thức khác Cú pháp: for variable in values statemens done Ví dụ sau in giá trị chuỗi tập hợp: Ví dụ 2-6: for_loop.sh #!/bin/sh for foo in bar fud 13 echo $foo done 36 exit Kết kết xuất $./ for_loop.sh bar fud 13 foo biến dùng vòng lặp for để duyệt tập hợp gồm phần tử (cách khoảng trắng) Mặc định shell xem tất giá trị gán cho biến kiểu chuỗi 13 xem chuỗi tương tự chuỗi bar fud Điều xảy bạn thay lệnh for foo in bar fud 13 thành for foo in “bar fud 13” Hãy nhớ lại, dấu nháy kép cho phép coi tất nội dung bên nháy kép biến chuỗi Kết kết xuất sử dụng dấu nháy kép, lệnh echo gọi lần để in chuỗi "bar fud 13" for thường dùng để duyệt qua danh sách tên tập tin Bằng cách dùng ký tự đại diện * (wildcard) ví dụ first.sh, ta thấy cách for tìm kiếm tập tin kết hợp với lệnh grep Ví dụ sau cho thấy việc mở rộng biến thành tập hợp sử dụng lệnh for Giả sử bạn muốn in tất tệp *.sh có ký tự f Ví dụ 2-7: for_loop2.sh 37 #!/bin/sh for file in $(ls f*.sh); lpr $file done Ví dụ cho thấy cách sử dụng cú pháp $ (command) Danh sách phần tử lệnh for cung cấp kết trả lệnh ls f* bọc cặp lệnh mở rộng biến $ ( ) Biến mở rộng nằm dấu bao $ (command) xác đinh lệnh command thực thi xong 2.4.4.5 Lệnh while Mặc dù lệnh for cho phép lặp tập hợp giá trị biết trước, trường hợp tập hợp lớn số lần lặp khơng biết trước, for khơng thích hợp Ví dụ: for foo in 10 11 12 13 14 15 16 echo $foo done Lệnh while cho phép thực lặp vô hạn điều kiện kiểm tra Cú pháp while sau: while condition 38 statements done Ví dụ sau cho thấy cách while liên tục kiểm tra mật (password) người dùng chuỗi secret chấp nhận Ví dụ 2-8: password.sh #!/bin/sh echo "Enter password" read trythis while [ "$trythis" != "secret" ]; echo "Sorry, try again" read trythis done exit Kết script $./password.sh Enter password: abc Sorry, try again secret #gõ $ 39 Mặc dù để password hiển thị nhập liệu rõ ràng không thích hợp, ta chủ yếu minh họa lệnh while Lệnh while liên tục kiểm tra nội dung biến $trythis, yêu cầu nhập lại liệu lệnh read $trythis chưa với chuỗi "secret" Bằng cách sử dụng biến đếm biểu thức so sánh tốn học, while hồn tồn thay for trường hợp tập liệu lớn Hãy theo dõi ví dụ sau: Ví dụ 2-9: while_for.sh #!/bin/sh foo=1 while [ "$foo" -le 16 ] echo "Here $foo" foo=$(($foo+1)) done exit Lưu ý, cú pháp $( ( ) ) shell “ksh” khởi xướng Cú pháp dùng để đánh giá ước lượng biểu thức Với shell cũ khác thay cú pháp lệnh expr Tuy nhiên 40 expr không hiệu Bất nào, nên dùng $ ( ( ) ) thay cho expr Script while_for.sh sử dụng lệnh [ ] để kiểm tra giá trị biến $foo nhỏ hay 16 hay khơng Nếu cịn, lệnh lặp while in tổng cộng dồn biến $foo 2.4.4.6 Lệnh until Cú pháp lệnh until sau: until condition statements done Lệnh until tương tự lệnh while điều kiện kiểm tra bị đảo ngược lại Vòng lặp bị dừng điều kiện kiểm tra Ví dụ sau sử dụng lệnh until để chờ user đăng nhập: Ví dụ 2-10: until_user.sh #!/bin/sh echo "Locate for user " until who | grep "$1" > /dev/null sleep 60 done echo -e \\a echo "***** $1 has just logged in *****" 41 exit Để thử lệnh này, chạy ngồi hình console, dùng hai hình ảo (Alt+F1 Alt+F2), hình dùng chạy script until_user.sh, hình dùng đăng nhập với tên user muốn kiểm tra Nếu chế độ đồ họa, bạn mở hai cửa sổ terminal dễ hình dung Hãy chạy until_user.sh từ sau: $./until_user.sh xyz Locate for user Script rơi vào vòng lặp chờ user tên xyz dăng nhập Hãy nhập từ hình khác (với user tên xyz), ta thấy hình đưa thơng báo cho thấy vịng lặp until chấm dứt * * * * * xyz has just logged in * * * * * Cách chương trình làm việc: Lệnh who lọc danh sách user đăng nhập vào hệ thống, chuyển danh sách cho grep chế đường ống ( | ) Lệnh grep lọc tên user theo biến mơi trường $1 có nội dung chuỗi xyz Một lệnh grep lọc liệu, chuyển vùng tập tin rỗng /dev/null trả lại giá trị null, lệnh until kết thúc 42 2.4.4.7 Lệnh case Lệnh case có cách sử dụng phức tạp lệnh học Cú pháp lệnh case sau: case variable in pattern [ | partten] ) statements;; pattern [ | partten] ) statements;; esac Mặc dù nhìn khó hiểu, lệnh case linh động case cho phép thực so khớp nội dung biến với chuỗi mẫu pattern Khi mẫu so khớp, (lệnh) statement tương ứng thực Hãy lưu ý đặt hai dấu chấm phẩy ;; phía sau mệnh đề so khớp pattern, shell dùng dấu hiệu để nhận dạng mẫu pattern so khớp mà biến cần thực Việc cho phép so khớp nhiều mẫu khác làm case trở nên thích hợp cho việc kiểm tra nhập liệu người dùng Chúng ta xem lại ví dụ 2-4 với phiên viết case sau: Ví dụ 2-11: case1.sh #!/bin/sh echo "Is it morning? Please answer yes or no" 43 read timeofday case "$timeofday" in "yes") echo "Good Morning";; "no" ) echo "Good Afternoon";; "y" ) echo "Good Morning";; "n" ) echo "Good Afternoon";; *) echo "Sorry, answer not recognised";; esac exit Cách thực hiện: Sau người dùng nhập vào câu trả lời, lệnh case lấy nội dung biến $timeofday so sánh với chuỗi Khi gặp chuỗi thích hợp thực thi lệnh đằng sau dấu ) kết thúc (không tiếp tục so khớp với mẫu khác) Ký tự đại diện * cho phép so khớp với loại chuỗi * thường xem trường hợp so sánh cuối mẫu so sánh trước thất bại Bạn xem * mệnh đề default lệnh switch C hay case … else Pascal Việc so sánh thường thực từ mẫu thứ trở xuống bạn đừng đặt * đầu tiên, chuỗi thỏa mãn case Hãy đặt mẫu dễ xảy lên đầu tiên, mẫu có tần số xuất thấp Sau 44 đặt mẫu * để xử lý trường hợp lại Nếu muốn dùng mẫu * đặt xen mẫu khác để theo dõi (debug) lỗi chương trình (như in nội dung biến lệnh case chẳng hạn) Lệnh case ví dụ rõ ràng sáng sủa chương trình sử dụng if Tuy nhiên kết hợp chung mẫu so khớp với khiến cho case ngắn gọn sau: Ví dụ 2-12: case2.sh #!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning";; "n*" | "N*" ) echo "Good Afternoon";; *) echo "Sorry, answer not recognised";; esac exit Ở script sử dụng nhiều mẫu so khớp dòng so sánh lệnh case Các mẫu có ý nghĩa tương tự yêu cầu thực thi lệnh điều kiện xảy Cách viết 45 thực tế thường dùng dễ đọc cách viết thứ Mặc dù vậy, thử tìm hiểu case ví dụ sau case sử dụng lệnh exit để trả mã lỗi cho trường hợp so sánh mẫu đồng thời case sử dụng cách so sánh tắt ký tự đại diện Ví dụ 2-13 case3.sh #!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning" echo "Up bright and early this morning?" ;; [nN]* ) echo "Good Afternoon" ;; *) echo "Sorry, answer not recognised" echo "Please answer yes or no" exit ;; esac 46 exit Cánh thực hiện: Trong trường hợp 'no' ta dùng ký tự đại diện * thay cho tất ký tự sau n N Điều có nghĩa nx hay Nu có nghĩa 'no' Ở ví dụ ta thấy cách đặt nhiều lệnh trường hợp so khớp exit cho biết người dùng không chọn yes no exit cho biết người dùng chọn yes, no theo u cầu : Có thể khơng cần đặt ;; mẫu so khớp cuối lệnh case (phía trước esac), khơng cịn mẫu so khớp cần thực Không C yêu cầu phải đặt lệnh break mệnh đề case, shell khơng địi hỏi điều này, biết tự động chấm dứt lệnh case tương ứng tìm mẫu thoả mãn Để làm case trở nên mạnh mẽ so sánh nhiều trường hợp hơn, giới hạn ký tự so sánh theo cách sau: [yy] | [Yy] [Ee] [Ss] Khi y,Y hay YES, YeS, xem yes Cách dùng ký tự thay toàn * trường hợp [nN]* 2.5 Bài tập ôn tập Chạy tất đoạn lệnh ví dụ phần 2.4 Chụp hình kết chạy file script lưu vào báo cáo 47 Viết chương trình cho phép nhập vào tên mssv Kiểm tra mssv khơng trùng với bắt nhập lại In hình kết Viết chương trình cho phép nhập vào số n Kiểm tra n < 10 bắt nhập lại Tính tổng số từ đến n In kết hình Viết trình cho phép nhập vào chuỗi Kiểm tra chuỗi có tồn file text (ví dụ test.txt) thư mục hay không 48 TÀI LIỆU THAM KHẢO Tài liệu lập trình shell Linux: http://sinhvienit.net/forum/tai-lieu-lap-trinh-shell-linuxunix.211046.html, truy cập ngày 10/1/2019 49 ... TRÌNH TRONG MÔI TRƯỜNG SHELL 2.1 Mục tiêu Bài thực hành giúp sinh viên: Làm quen tìm hiểu cách sử dụng ngơn ngữ shell để lập trình Thực hành lập trình số cầu trúc điều khiển shell Viết số chương trình. .. ngôn ngữ shell 2.2 Nội dung thực hành Thực hành lệnh tương tác với hệ điều hành Linux thông qua shell Tìm hiểu thực hành ngơn ngữ shell 2.3 Sinh viên chuẩn bị Đọc phần hướng dẫn thực hành trước... 2.4 theo hướng dẫn 2.4 Hướng dẫn thực hành 2.4.1 Sử dụng shell ngơn ngữ lập trình Shell sử dụng ngơn ngữ lập trình Có hai cách để viết chương trình điều khiển shell Cách thứ gõ chương trình từ