Bài giảng Hệ điều hành UNIX-Linux - Chương 7: Lập trình Shell - Đặng Thu Hiền

Chương trình shell

n  Chương trình shell là một tập hợp các câu lệnh được viết trong một file

text

n  Nó giống chương trình .bat trong MSDOS nhưng có sức mạnh lớn hơn

nhiều

n  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

n  Có thể dùng để tạo ra một lệnh riêng cho mình

n  Shell giúp tiết kiệm thời gian

n  Các bước để tạo ra một chương trình shell

n  Sử dụng một chương trình soạn thảo text để tạo ra một file chương trình

n  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

n  Có thể chạy luôn chương trình bằng lệnh: sh script.sh

n  Các chương trình shell nên đặt đuôi là .sh

pdf 41 trang yennguyen 2940
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ điều hành UNIX-Linux - Chương 7: Lập trình Shell - Đặng Thu Hiền", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Hệ điều hành UNIX-Linux - Chương 7: Lập trình Shell - Đặng Thu Hiền

Bài giảng Hệ điều hành UNIX-Linux - Chương 7: Lập trình Shell - Đặng Thu Hiền
1 
Hệ điều hành UNIX-Linux 
Chương 7. Lập trình Shell 
Đặng Thu Hiền 
Khoa Công nghệ thông tin 
Trường Đại học Công nghệ 
Đại học Quốc gia Hà Nội 
2 
Chương trình shell 
n  Chương trình shell là một tập hợp các câu lệnh được viết trong một file 
text 
n  Nó giống chương trình .bat trong MSDOS nhưng có sức mạnh lớn hơn 
nhiều 
n  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 
n  Có thể dùng để tạo ra một lệnh riêng cho mình 
n  Shell giúp tiết kiệm thời gian 
n  Các bước để tạo ra một chương trình shell 
n  Sử dụng một chương trình soạn thảo text để tạo ra một file chương trình 
n  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 
n  Có thể chạy luôn chương trình bằng lệnh: sh script.sh 
n  Các chương trình shell nên đặt đuôi là .sh 
Trình soạn thảo văn bản trong Linux 
n  Trình soạn thảo vim 
3 
Cấu trúc chương trình shell 
n  Là một tập hợp các lệnh và các cấu trúc điều khiển 
n  Mỗi lệnh được viết trên 1 dòng 
n  Chú thích trong chương trình là phần nằm sau dấu # 
n  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 
16 
Các loại shell 
n  Muốn xem các loại shell có trong hệ thống ta sử dụng 
lệnh: cat /etc/shells 
n  Muốn xem shell hiện tại: echo $SHELL 
n  Phần này chỉ đề cập đến lập trình shell trong bash 
4 
Các ký hiệu đặc biệt trong shell 
5 
Khi đặt tên 
biến cần 
tránh xung 
đột với các 
ký tự đặc 
biệt này 
Sử dụng biến trong shell 
n  Biến hệ thống được Linux tạo ra và quản lý (CHỮ IN 
HOA) 
n  Biến người dùng: được người dùng tạo ra và quản lý 
(chữ thường) 
6 
Danh sách một số biến hệ thống 
7 
Quy tắc đặt tên biến 
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ố 
n  Biến được khởi tạo khi ta gán giá trị cho biến 
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 
n  Biến trong Linux phân biệt chữ HOA thường 
n  Tìm các biến hợp lệ và không hợp lệ: 
n  no=10 
n  new_variable=“Test” 
n  number= 10 
n  1stnumber=10 
8 
Truy cập và xoá biến 
n  Truy cập giá trị của một biến ta dùng ký tự $ trước 
tên biến, xóa 1 biến sử dụng lệnh unset var 
n  echo $new_variable 
n  Lệnh echo [tùy chọn] [chuỗi, biến] dùng để hiển 
thị văn bản hoặc giá trị của biến ra màn hình 
n  Tùy chọn: 
n  -n không hiển thị ký hiệu xuống dòng, 
n  -e hiển thị các ký tự ẩn đặc biệt sau trong chuỗi 
9 
Trích dẫn (quoting) 
n  Trích dẫn là cách bao quanh một chuỗi bằng cặp dấu nháy 
n  Cho phép một số ký tự đặc biệt giữ nguyên như các ký tự 
bình thường 
n  Có 2 loại trích dẫn mạnh (‘ ’) và trích dẫn yếu (“  ”) 
n  Trích dẫn mạnh bảo toàn toàn bộ các ký tự trong chuỗi 
n  echo ‘Giá trị của tham số đầu tiên là: $var’ 
 → Giá trị của tham số đầu tiên là: $var 
n  ls -l '[Vv]*‘ → ls: [Vv]*: No such file or directory 
n  Trích dẫn yếu vẫn biên dịch các biến trong chuỗi echo 
n  var=2; “Giá trị của biến là: $var” ; 

n  → Giá trị của biến là 2

10 
Tính toán số học trên các biến 
n  Tính toán trong shell được thực hiện với các đối số 
nguyên 
n  Các phép toán gồm có: cộng (+), trừ (-), nhân (*), chia 
(/), mod (%) 
n  Tính toán trên shell có dạng: 
n  `expr ` 
n  Ví dụ 
var1=10 
var2=20 
sum=`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” 
11 
Tham số dòng lệnh 
trong chương trình shell 
n  Là tham số được truyền vào cho chương trình trên dòng 
lệnh 
n  Dùng để thông báo cho chương trình các tùy chọn, file cần 
xử lý 
n  rm test.txt 
n  ls –a /usr/local 
n  myshell 10 30 
n  Truy cập các tham số dòng lệnh thông qua các biến hệ 
thống $1, , $9 
n  echo $1 # hiển thị 10 
n  echo $2 # hiển thị 30 
12 
Tham số dòng lệnh 
trong chương trình shell 
n  Tổng số tham số trả lại qua biến $#, 
n  $* hoặc $@ trả lại toàn bộ tham số 
n  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 $@" 
13 
Tham số dòng lệnh 
trong chương trình shell 
n  Làm sao truy cập các tham số có số thứ tự > 9? 
n  Truy xuất thông qua $@ hay $* 
n  Dùng lệnh shift 
n  shift sẽ gán lạ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 
n  $1 <--- $2, $2 <--- $3, $3 <--- $4, ... 
n  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” 
14 
Giá trị logic trong shell 
n  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 
n  Giá trị logic là một giá trị quan trọng trong các cấu 
trúc điều khiển 
15 
Điều khiển luồng trong shell 
n  Các câu trúc điêu khiên luông bao gôm: 
n  if – Thi hành mọt hoạc nhiêu câu lẹnh nêu có điêu 
kiẹn là true hoạc false. 
n  for – Thi hành mọt hoạc nhiêu câu lẹnh trong mọt 
sô cô đinh lân. 
n  while – Thi hành mọt hoạc nhiêu câu lẹnh trong khi 
mọt điêu kiẹn nào đó là true hoạc false. 
n  until – Thi hành mọt hoạc nhiêu câu lẹnh cho đên khi 
mọt điêu kiẹn nào đó trơ thành true hoạc false. 
n  case – Thi hành mọt hoạc nhiêu câu lẹnh phu 
thuọc vào giá tri cua biên. 
n  select – Thi hành mọt hoạc nhiêu câu lẹnh dưa trên 
mọt khoang tuy chon cua nguơi dùng. 
16 
Cấu trúc điều khiển if 
n  Điều kiện if được sử dụng để đưa ra các quyết định 
trong chương trình shell 
n  Nếu điều kiện được cung cấp là đúng thì các lệnh 
trong đó được thực thi 
n  Đ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 
n  Cấu trúc 
if điều_kiện 
then 
 #Khối lệnh sẽ được thực hiện nếu điều_kiện là đúng 
fi 
17 
Cấu trúc điều khiển if 
n  Ví dụ: 
if cat $1 
then 
 echo -e "\n\nFile $1, found and successfully echoed" 
fi 
n  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 
18 
Lệnh test hay [] 
n  Được dùng để kiểm tra xem một biểu thức đúng (0) 
hay sai (0) 
n  Cú pháp 
n  test biểu_thức hoặc [ biểu_thức] 
n  Ví dụ: 
if test $1 -gt 0 
then 
 echo "$1 number is positive" 
fi 
if [ $1 -gt 0 ] 
then 
 echo "$1 number is positive" 
fi 
19 
Các toán tử số học 
trong chương trình shell 
20 
Các toán tử so sánh chuỗi 
n  Sử dụng toán tử so sánh chuỗi trong toán tử [[ ]] 
21 
Các toán tử kiểm tra file/thư mục 
22 
Các toán tử kiểm tra file/thư mục 
n  Ví dụ: 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 
23 
Các toán tử logic 
n  Ví dụ: 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 
24 
Cấu trúc rẽ nhánh if else fi 
n  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 điều_kiện ; then 
 Khối_lệnh_1 
else 
 Khối_lệnh_2 
fi 
n  Ví dụ if test $1 -gt 0 
then 
 echo "$1 number is positive" 
else 
 echo "$1 number is negative" 
fi 
25 
Cấu trúc if then else  fi đa mức 
n  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 đ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 
26 
Cấu trúc lựa chọn 
n  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 
n  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 
n  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 *, ? 
n  Biểu thức *) có ý nghĩa như nhãn default 
trong lệnh switch của C 
27 
case expr in 
pattern1 ) 

Khối lệnh 1 ;; 
pattern2 ) 

Khối lệnh 2 ;; 
* ) 

Khối lệnh n ;; 
esac 
Ví dụ lệnh case 
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]. 
n  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 
28 
Cấu trúc lặp for 
n  Lặp đi lặp lại 1 số lần một khối lệnh nào đó 
n  for variable in danh_sách 
do 
 # Khối lệnh thao tác với giá trị của $variable 
done 
n  for (( expr1; expr2; expr3 )) 
do 
# Thực hiện khối lệnh cho đến khi expr2 có giá trị TRUE 
done 
29 
Ví dụ vòng lặp for 
n  Ví dụ 
for i in 1 2 3 4 5 
do 
 echo "Welcome $i times" 
done 
n  Hoặc 
for (( i = 0 ; i <= 5 ; i++ )) 
do 
 echo "Welcome $i times" 
done 
n  In ra bảng nhân của 1 
30 
n=$1 
for i in 1 2 3 4 5 6 7 8 9 10 
do 
 echo "$n * $i = `expr $i \* $n`" 
done 
Cấu trúc lặp while 
n  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 
while điều_kiện 
do 
 #Khối lệnh được thực hiện khi điều_kiện là TRUE 
done 
n  Ví dụ 
31 
n=$1 
i=1 
while [ $i -le 10 ] 
do 
 echo "$n * $i = `expr $i \* $n`" 
 i=`expr $i + 1` 
done 
Đường ống (Pipe) 
n  Đườ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 
n  Đườ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 
n  Lệnh_1 | Lệnh_2 
n  ls | sort 
n  ls | sort | less 
32 
Định hướng lại 
các thiết bị đầu vào/ra chuẩn 
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 
n  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) 
n  Ghi kết quả của 1 lệnh ra 1 file (thay vì màn hình) 
n  Lệnh > tên_file_đầu_ra 
n  ls > danh_sach_file 
n  Định hướng đầu vào: Lệnh < tên_file_đầu_vào 
n  cat < a.txt 
n  sort a.sorted.txt 
n  tr “[a-z]” “[A-Z]” b.txt 
33 
Định hướng đầu vào vào khối lệnh 
n  Đưa dữ liệu vào 1 khối lệnh 
n  Có thể lấy dữ liệu từ 1 file 
34 
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" 
Thủ tục / hàm trong chương trình shell 
n  Định nghĩa hàm 
 function_name(){ 
#Nội dung hàm 
} 
n  Muốn hàm trả về giá trị ta dùng lệnh return 
n  Trong hàm có thể truy cập biến toàn cục 
n  Muốn tạo biến cục bộ trong hàm ta dùng từ khóa local 
n  Gọi hàm bằng cách sử dụng tên hàm 
n  Có thể truyền tham số cho hàm 
n  Khi gọi hàm truyền theo tham số 
n  Trong hàm truy cập các tham số thông qua các biến vị trí 
35 
Ví dụ về hàm 
function1(){ 
 echo “This is the first argument $1” 
} 
function1 ARGUMENT 
36 
Danh sách lệnh 
n  Để 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 ; 
n  Danh sách lệnh AND 
n  Các lệnh được phân cách nhau bởi dấu && 
n  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 
n  Ví dụ: cat a.txt && rm a.txt 
37 
Danh sách lệnh 
n  Danh sách lệnh OR 
n  Các lệnh được phân cách bởi dấu || 
n  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 
n  Ví dụ: cat a.txt || touch a.txt 
n  Danh sách lệnh AND và OR có thể thay thế cho cấu 
trúc if - then 
38 
Các toán tử so sánh chuỗi 
15 
Toán tử Ý nghĩa 
str1 = str2 str1 bằng str2 
str1 != str2 str1 khác str2 
-n str str có độ dài lớn hơn 0 (khác null) 
-z str str có độ dài bằng 0 (null) 
Các toán tử so sánh số học 
15 
Toán tử Ý nghĩa 
-eq bằng 
-ge lớn hơn hoặc bằng 
-gt lớn hơn 
-le nhỏ hơn hoặc bằng 
-ne khác 

File đính kèm:

  • pdfbai_giang_he_dieu_hanh_unix_linux_chuong_7_lap_trinh_shell_d.pdf