Tài liệu này dành cho sinh viên, giáo viên khối ngành công nghệ thông tin tham khảo và có những bài học bổ ích hơn, bổ trợ cho việc tìm kiếm tài liệu, giáo án, giáo trình, bài giảng các môn học khối ngành công nghệ thông tin
Trang 1Hệ ñiều hành UNIX-Linux
Chương 8 Lập trình Shell
Trang 2Chươ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ột file chương
trình
Trang 3Trình soạn thảo văn bản trong Linux
• Trình soạn thảo vim
Trang 4Trình soạn thảo văn bản trong Linux
• Trình soạn thảo của mc
Trang 5Các loại shell
Muốn xem các loại shell có trong hệ thống ta sử dụng lệnh: cat /etc/shells
Muốn xem shell hiện tại: echo $SHELL
Phần này chỉ ñề cập ñến lập trình shell trong bash
Trang 6Các ký hiệu ñặc biệt trong shell
Khi ñặt tên biến cần tránh xung ñột với các
ký tự ñặc biệt này
Trang 7Sử dụng biến trong shell
Biến hệ thống ñược Linux tạo ra và quản lý (CHỮ IN HOA)
Biến người dùng: ñược người dùng tạo ra và quản lý (chữ thường)
Trang 8Quy tắc ñặt tên biến
Tên biến phải bắt ñầu với một ký tự chữ cái hoặc dấu gạch dưới (_), tiếp theo
là một hoặc một số ký tự chữ hoặc số
Biến ñược khởi tạo khi ta gán giá trị cho biến
Không thêm các dấu cách vào trước và sau dấu gán, khi gán giá trị cho biến
Biến trong Linux phân biệt chữ HOA thường
Trang 9Trích dẫn (quoting)
Trích dẫn là cách bao quanh một chuỗi bằng cặp dấu nháy
Cho phép một số ký tự ñặc biệt giữ nguyên như các ký tự bình thường
Có 2 loại trích dẫn mạnh (‘ …’) và trích dẫn yếu (“ … ”)
Trích dẫn yếu vẫn biên dịch các biến trong chuỗi
echo “Giá trị của biến là: $var”
Trích dẫn mạnh bảo toàn toàn bộ các ký tự trong chuỗi
echo ‘Giá trị của tham số ñầu tiên là: $var’
→ Giá trị của tham số ñầu tiên là: $var
ls -l '[Vv]*‘
→ ls: [Vv]*: No such file or directory
Trang 10Tính toán số học trên các biến
Tính toán trong shell ñược thực hiện với các ñối số nguyên
Các phép toán gồm có: cộng (+), trừ (-), nhân (*), chia (/), mod (%)
Tính toán trên shell có dạng:
`expr <biểu thức>`
Ví dụ
var1=10var2=20sum=`expr $var1 + $var2 `product=`expr $var1 \* $var2 `echo “Tổng của $var1 và $var2 là: $sum, tích của chúng là $product”
Trang 11Tham số dòng lệnh trong chương trình shell
Là tham số ñược truyền vào cho chương trình trên dòng lệnh
Dùng ñể thông báo cho chương trình các tùy chọn, file cần xử lý
Tổng số tham số trả lại qua biến $#, toàn bộ tham số thông qua $* hay $@,
biến $0 trả lại tên chương trình
echo "Total number of command line argument are $#“
echo "$0 is script name“
echo "$1 is first argument“
echo "$2 is second argument“
echo "All of them are :- $* or $@"
Trang 12Tham số dòng lệnh trong chương trình shell (tiếp)
Làm sao truy cập các tham số có số thứ tự > 9?
Truy xuất thông qua $@ hay $*
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 ?
Trang 13Giá 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
Trang 14Cấ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)
Trang 15Cấ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ả
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
Trang 16echo "$1 number is positive"
fi
if [ $1 -lt 0 ]then
Trang 17Các toán tử số học trong chương trình shell
Trang 18Cá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
Ví dụ
Trang 19Cá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
Ví dụ
Trang 21Cấ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 0then
echo "$1 number is positive"
Khối_lệnh_2fi
Trang 22Cấ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 ]; thenecho "$1 is positive"
elif [ $1 -lt 0 ]; thenecho "$1 is negative"
Trang 23expr ñượ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
Trang 24Ví 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 Keypresscase "$Keypress" in[a-z] ) echo "Lowercase letter";;
[A-Z] ) echo "Uppercase letter";;
Trang 25Cấ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 5do
echo "Welcome $i times"
for i in 1 2 3 4 5 6 7 8 9 10do
echo "$n * $i = `expr $i \* $n`"
done
Trang 26Cấ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"
Trang 27Cấ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=$1i=1while [ $i -le 10 ]do
#Khối lệnh ñược thực hiện khi ñiều_kiện là TRUE
done
Trang 28echo "(end to exit)"
read var1echo "variable #1 = $var1"
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
Trang 29ðườ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
Trang 30Thay thế biến (variable substitution)
Thao tác và mở rộng biến
Trang 31Ví dụ
option=$1var=${option:-”20”}
echo $var
option=$1var=${option:=”20”}
echo $var
Kết quả trả về khi $1 không xác ñịnh và $1 có giá trị là 10?
Trang 32Các toán tử string (tiếp)
Trang 33Ví 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
Trang 35ðị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)
sort < a.txt > a.sorted.txt
tr “[a-z]” “[A-Z]” < a.txt > b.txt
Trang 36ðị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ímecho $name
if [[ "$name" = Smith ]]
thenbreak
fi done <"$filename"
Trang 37Thủ 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”
}
Trang 38Danh 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