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

 

pdf38 trang | Chuyên mục: Linux | Chia sẻ: dkS00TYs | Ngày: 07/10/2014 | Lượt xem: 620 | Lượt tải: 2download
Tóm tắt nội dung Bài giảng Hệ điều hành Unix-Linux - Chương 8: Lập trình Shell, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdfBài giảng Hệ điều hành Unix-Linux - Chương 8 Lập trình Shell.pdf
Tài liệu liên quan