Bài giảng Hệ điều hành Unix-Linux - Chương 8: Lập trình Shell
Chương trình shell
Chương trình shell là một tập hợp các câu lệnh viết trong một file text
Nó giống chương trình .bat trong MSDOS nhưng có sức mạnh lớn hơn
nhiều
Chương trình shell có thể nhận dữ liệu từ người dùng, từ file và in kết quả
ra màn hình
Có thể dùng để tạo ra một lệnh riêng cho mình
Shell giúp tiết kiệm thời gian để làm các công việc hàng ngày
Các bước để tạo ra một chương trình shell
Sử dụng một chương trình soạn thảo text để tạo ra mộtfile chương
trình
Thay đổi thuộc tính của file vừa tạo ra thêm thuộc tính khả thi:
chmod +x ./script.sh
Có thể chạy luôn chương trình bằng lệnh: sh script.sh
i giá trị của các tham số vị trí bằng cách dịch trái giá trị của danh sách các biến $1 <--- $2, $2 <--- $3, $3 <--- $4, ... Ví dụ echo “Giá trị của tham số thứ nhất là: $1” shift echo “Giá trị của tham số thứ 2 là: $1” Kết quả trả về khi truyền vào cho chương trình tham số: 3 6 5 ? 13Unix operating system - Nguyen Tri Thanh - Sep-10 Giá trị logic trong shell Ngược với C hay các ngôn ngữ lập trình thông dụng, trong shell giá trị 0 nghĩa là true còn giá trị khác 0 là false Giá trị logic là một giá trị quan trọng trong các cấu trúc ñiều khiển Giá trị logic trong bc 14Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc chương trình shell Là một tập hợp các lệnh và các cấu trúc ñiều khiển Mỗi lệnh ñược viết trên 1 dòng Chú thích trong chương trình là phần nằm sau dấu # Dòng chú thích ñầu tiên trong file chương trình shell sẽ báo cho hệ thống chọn shell (chương trình) nào ñể thực hiện chương trình (ngầm ñịnh là shell hiện tại) #!/bin/bash #!/usr/bin/perl #!/bin/csh #!/bin/rm ñiều gì sẽ xảy ra??? 15Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc ñiều khiển if ðiều kiện if ñược sử dụng ñể ñưa ra các quyết ñịnh trong chương trình shell Nếu ñiều kiện ñược cung cấp là ñúng thì các lệnh trong ñó ñược thực thi ðiều kiện là một phép so sánh giữa 2 giá trị, một lệnh kiểm tra hay kết quả trả về của 1 chương trình Cấu trúc if ñiều_kiện then #Khối ệnh sẽ ñược thực hiện nếu ñiều_kiện là ñúng fi Ví dụ: if cat $1 then echo -e "\n\nFile $1, found and successfully echoed" fi Trong linux các lệnh thường trả về trạng thái thành công hay lỗi, nếu thành công thì trả về giá trị 0, nếu bị lỗi thì sẽ trả về mã lỗi khác 0 16Unix operating system - Nguyen Tri Thanh - Sep-10 Lệnh test hay [] ðược dùng ñể kiểm tra xem một biểu thức ñúng (0) hay sai (0) Cú pháp test biểu_thức [ biểu_thức ] Ví dụ: if test $1 -gt 0 then echo "$1 number is positive" fi if [ $1 -lt 0 ] then echo "$1 number is negative" fi 17Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử số học trong chương trình shell 18Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán so sánh chuỗi Sử dụng toán tử so sánh chuỗi trong toán tử [[ ]] if [[ $1 != "-c" ]] ; then echo "The first argument must be -c!" fi if [[ -z $2 ]]; then echo “Missing the second argument!” fi Ví dụ 19Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử kiểm tra file/thư mục Chương trình hiển thị nội dung của 1 file nếu nó khác rỗng if [[ -f $1 ]] ; then if [[ -s $1 ]]; then cat $1 fi fi Ví dụ 20Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử logic Chương trình hiển thị nội dung của 1 file nếu nó khác rỗng if [[ -n $1 ]] ; then if [ -s $1 –a –f $1 ]; then cat $1 fi fi Ví dụ 21Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc rẽ nhánh if … else … fi Nếu ñiều kiện ñúng thì thực hiện khối lệnh thứ nhất, nếu không thì thực hiện khối lệnh thứ 2 if test $1 -gt 0 then echo "$1 number is positive" else echo "$1 number is negative" fi Ví dụ if ñiều_kiện ; then Khối_lệnh_1 else Khối_lệnh_2 fi 22Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc if …then … else … fi ña mức Rất hiệu quả khi phải kiểm tra nhiều trường hợp/giá trị của 1 biến if [ $1 -gt 0 ]; then echo "$1 is positive" elif [ $1 -lt 0 ]; then echo "$1 is negative" elif [ $1 -eq 0 ]; then echo "$1 is zero" else echo "Opps! $1 is not number, give number" fi Ví dụ if ñiều_kiện_1 ; then Khối_lệnh_1 elif ñiều_kiện_2 ; then Khối_lệnh_2 … else Khối_lệnh_n fi 23Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lựa chọn Cấu trúc case expr in pattern1 ) Khối lệnh 1 ;; pattern2 ) Khối lệnh 2 ;; … * ) Khối lệnh n ;; esac expr ñược ñem ñi so sánh với từng pattern, nếu nó bằng nhau thì các lệnh tương ứng sẽ ñược thi hành Dấu ;; là tương ñương với lệnh break của C, tạo ra ñiều khiển nhảy tới dòng ñầu tiên sau mã esac Không như từ khoá switch của C, lệnh case của bash cho phép ta kiểm tra giá trị của expr dựa vào pattern, nó có thể chứa các kí tự ñại diện *, ? Biểu thức *) có ý nghĩa như nhãn default trong lệnh switch của C 24Unix operating system - Nguyen Tri Thanh - Sep-10 Ví dụ lệnh case Lệnh read var sẽ ñọc giá trị nhập vào từ bàn phím, sau khi ấn Enter và lưu giữ vào biến var echo; echo "Hit a key, then hit return." read Keypress case "$Keypress" in [a-z] ) echo "Lowercase letter";; [A-Z] ) echo "Uppercase letter";; [0-9] ) echo "Digit";; * ) echo "Punctuation, whitespace, or other";; esac # Allows ranges of characters in [square brackets]. 25Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp for Lặp ñi lặp lại 1 số lần một khối lệnh nào ñó for i in 1 2 3 4 5 do echo "Welcome $i times" done Ví dụ for variable in danh_sách do # Khối lệnh thao tác với giá trị của $variable done In ra bảng nhân của 1 số n=$1 for i in 1 2 3 4 5 6 7 8 9 10 do echo "$n * $i = `expr $i \* $n`" done 26Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp for Lặp ñi lặp lại 1 số lần một khối lệnh nào ñó for (( i = 0 ; i <= 5 ; i++ )) do echo "Welcome $i times" done Ví dụ for (( expr1; expr2; expr3 )) do # Thực hiện khối lệnh cho ñến khi expr2 có giá trị TRUE done 27Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp while Lặp ñi lặp lại một khối lệnh nào ñó trong khi biểu thức ñiều kiện có giá trị TRUE n=$1 i=1 while [ $i -le 10 ] do echo "$n * $i = `expr $i \* $n`" i=`expr $i + 1` done Ví dụ while ñiều_kiện do #Khối lệnh ñược thực hiện khi ñiều_kiện là TRUE done 28Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp until Lặp ñi lặp lại một khối lệnh nào ñó trong khi biểu thức ñiều kiện có giá trị FALSE until [[ "$var1" = end ]] do echo "Input variable #1 " echo "(end to exit)" read var1 echo "variable #1 = $var1" done Ví dụ until ñiều_kiện do #Khối lệnh ñược thực hiện khi ñiều_kiện là FALSE done 29Unix operating system - Nguyen Tri Thanh - Sep-10 ðường ống (Pipe) ðường ống là cách ñể ñưa ñầu ra của một chương trình thành dữ liệu ñầu vào của một chương trình khác mà không cần qua một file trung gian ðường ống thực chất là một vùng bộ nhớ tạm thời, nơi lưu trữ ñầu ra của một lệnh và sau ñó chuyển chúng cho ñầu vào của lệnh thứ hai Lệnh_1 | Lệnh_2 ls | sort ls | sort | less 30Unix operating system - Nguyen Tri Thanh - Sep-10 Thay thế biến (variable substitution) Thao tác và mở rộng biến 31Unix operating system - Nguyen Tri Thanh - Sep-10 Ví dụ option=$1 var=${option:-”20”} echo $var option=$1 var=${option:=”20”} echo $var Kết quả trả về khi $1 không xác ñịnh và $1 có giá trị là 10? 32Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử string (tiếp) 33Unix operating system - Nguyen Tri Thanh - Sep-10 Ví dụ về các toán tử pattern -matching #!/bin/bash myfile=/usr/src/linux/Documentation/ide.txt echo ‘${myfile##*/}=’ ${myfile##*/} echo ‘basename $myfile =’ $(basename $myfile) echo ‘${myfile%/*}=’ ${myfile%/*} echo ‘dirname $myfile =’ $(dirname $myfile) Lệnh thứ 2 xoá xâu matching “*/” dài nhất trong tên file và trả về tên file. Lệnh thứ 4 làm khớp tất cả mọi thứ sau “/”, bắt ñầu từ cuối biến, bỏ tên file và trả về ñường dẫn của file Kết quả của tập lệnh này $ ./pattern.sh ${myfile##*/} = ide.txt basename $myfile = ide.txt ${myfile%/*} = /usr/src/linux/Documentation dirname $myfile = /usr/src/linux/Documentation 34Unix operating system - Nguyen Tri Thanh - Sep-10 Thay thế lệnh Dùng ñể gán kết quả trả về của 1 lệnh làm tham số cho 1 lệnh khác hay cho 1 biến Câu lệnh cần lấy kết quả ñược bao trong cặp (`… `) rm `cat danh_sach_file_can_xoa.txt` script_name=`basename $0` echo "The name of this script is `basename $0`." textfile_listing=`ls *.txt` echo $textfile_listing 35Unix operating system - Nguyen Tri Thanh - Sep-10 ðịnh hướng lại các thiết bị ñầu vào/ra chuẩn Hầu hết tất cả các lệnh hiển thị kết quả ñầu ra ra màn hình, và lấy dữ liệu ñầu vào từ bàn phím Có thể gửi kết quả ñầu ra ra file cũng như ñọc ñầu vào từ file bằng cách sử dụng ñịnh hướng lại (redirect) Ghi kết quả của 1 lệnh ra 1 file (thay vì màn hình) Lệnh > tên_file_ñầu_ra ls > danh_sach_file ðịnh hướng ñầu vào Lệnh < tên_file_ñầu_vào cat < a.txt sort a.sorted.txt tr “[a-z]” “[A-Z]” b.txt 36Unix operating system - Nguyen Tri Thanh - Sep-10 ðịnh hướng ñầu vào vào khối lệnh ðưa dữ liệu vào 1 khối lệnh Có thể lấy dữ liệu từ 1 file filename=“dulieu.txt” name=“” while `true` do read name # ðọc từ file thay vì từ bàn phím echo $name if [[ "$name" = Smith ]] then break fi done <"$filename" 37Unix operating system - Nguyen Tri Thanh - Sep-10 Thủ tục / hàm trong chương trình shell ðịnh nghĩa hàm function_name(){ #Nội dung hàm } Muốn hàm trả về giá trị ta dùng lệnh return Trong hàm có thể truy cập biến toàn cục Muốn tạo biến cục bộ trong hàm ta dùng từ khóa local Gọi hàm bằng cách sử dụng tên hàm Có thể truyền tham số cho hàm Khi gọi hàm truyền theo tham số Trong hàm truy cập các tham số thông qua các biến vị trí function1(){ echo “This is the first argument $1” } function1 ARGUMENT 38Unix operating system - Nguyen Tri Thanh - Sep-10 Danh sách lệnh ðể chạy tuần tự một dãy lệnh trên 1 dòng lệnh ta phân cách giữa các lệnh dấu ; Danh sách lệnh AND Các lệnh ñược phân cách nhau bởi dấu && Lệnh ñằng sau chỉ ñược thực hiện khi tất cả các lệnh trước nó ñều trả về giá trị TRUE cat a.txt && rm a.txt Danh sách lệnh OR Các lệnh ñược phân cách bởi dấu || Lệnh sau chỉ ñược thực hiện khi tất cả các lệnh ñứng trước nó trả về giá trị FALSE cat a.txt || touch a.txt Danh sách lệnh AND và OR có thể thay thế cho cấu trúc if - then
File đính kèm:
- Bài giảng Hệ điều hành Unix-Linux - Chương 8 Lập trình Shell.pdf