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
38 trang |
Chia sẻ: Mr Hưng | Lượt xem: 904 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu 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 DOWNLOAD ở trên
1Unix operating system - Nguyen Tri Thanh - Sep-10
Hệ ñiều hành UNIX-Linux
Chương 8. Lập trình Shell
2Unix operating system - Nguyen Tri Thanh - Sep-10
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ột file 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
Các chương trình shell nên ñặt ñuôi là .sh
3Unix operating system - Nguyen Tri Thanh - Sep-10
Trình soạn thảo văn bản trong Linux
• Trình soạn thảo vim
4Unix operating system - Nguyen Tri Thanh - Sep-10
Trình soạn thảo văn bản trong Linux
• Trình soạn thảo của mc
5Unix operating system - Nguyen Tri Thanh - Sep-10
Cá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
6Unix operating system - Nguyen Tri Thanh - Sep-10
Cá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
7Unix operating system - Nguyen Tri Thanh - Sep-10
Sử 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)
8Unix operating system - Nguyen Tri Thanh - Sep-10
Quy 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
Tìm các biến hợp lệ và khong hợp lệ:
no=10
new_variable=“Test”
number= 10
1stnumber=10
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
echo $new_variable
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
Tùy chọn: -n không hiển thị ký hiệu xuống dòng, -e hiển thị các ký tự ẩn ñặc
biệt sau trong chuỗi
9Unix operating system - Nguyen Tri Thanh - Sep-10
Trí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
10Unix operating system - Nguyen Tri Thanh - Sep-10
Tí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 `
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”
11Unix operating system - Nguyen Tri Thanh - Sep-10
Tham 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ý
rm test.txt
ls –a /usr/local
myshell 10 30
Truy cập các tham số dòng lệnh thông qua các biến hệ thống $1, , $9
echo $1 # hiển thị 10
echo $2 # hiển thị 30
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 $@"
12Unix operating system - Nguyen Tri Thanh - Sep-10
Tham 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 $*
Dùng lệnh shift
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
$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
Các file đính kèm theo tài liệu này:
- bai_giang_8_2688.pdf