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

1

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

2

Trình soạn thảo văn bản trong Linux

3

n  Trình soạn thảo vim

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 #

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

n  Dòng chú thích đầu tiên trong file chương trình shell

Các loại shell

lệnh: cat /etc/shells

n  Muốn xem các loại shell có trong hệ thống ta sử dụng

n  Muốn xem shell hiện tại: echo $SHELL

4

n  Phần này chỉ đề cập đến lập trình shell trong bash

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

5

Sử dụng biến trong shell

HOA)

n  Biến hệ thống được Linux tạo ra và quản lý (CHỮ IN

(chữ thường)

6

n  Biến người dùng: được người dùng tạo ra và quản lý

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

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

n  Truy cập giá trị của một biến ta dùng ký tự $ trước

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

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

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ố

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

n  Biến $0 trả lại tên chương trình

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 $*

dịch trái giá trị của danh sách các biến n  $1 <--- $2, $2 <--- $3, $3 <--- $4, ...

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

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

n  Ví dụ

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

trúc điều khiển

15

n  Giá trị logic là một giá trị quan trọng trong các cấu

Điều khiển luồng trong shell

n

if – Thi hành mọ(cid:0)t hoạ(cid:0)c nhiê(cid:0)u câu lẹ(cid:0)nh nê(cid:0)u có điê(cid:0)u kiẹ(cid:0)n là true hoạ(cid:0)c false.

n  for – Thi hành mọ(cid:0)t hoạ(cid:0)c nhiê(cid:0)u câu lẹ(cid:0)nh trong mọ(cid:0)t

sô(cid:0) cô(cid:0) đi(cid:0)nh lâ(cid:0)n.

n  while – Thi hành mọ(cid:0)t hoạ(cid:0)c nhiê(cid:0)u câu lẹ(cid:0)nh trong khi

mọ(cid:0)t điê(cid:0)u kiẹ(cid:0)n nào đó là true hoạ(cid:0)c false.

n  until – Thi hành mọ(cid:0)t hoạ(cid:0)c nhiê(cid:0)u câu lẹ(cid:0)nh cho đê(cid:0)n khi

mọ(cid:0)t điê(cid:0)u kiẹ(cid:0)n nào đó trơ(cid:0) thành true hoạ(cid:0)c false.

n  case – Thi hành mọ(cid:0)t hoạ(cid:0)c nhiê(cid:0)u câu lẹ(cid:0)nh phu(cid:0)

thuọ(cid:0)c vào giá tri(cid:0) cu(cid:0)a biê(cid:0)n.

n  select – Thi hành mọ(cid:0)t hoạ(cid:0)c nhiê(cid:0)u câu lẹ(cid:0)nh dư(cid:0)a trên

mọ(cid:0)t khoa(cid:0)ng tuy(cid:0) cho(cid:0)n cu(cid:0)a ngu(cid:0)ơ(cid:0)i dùng.

16

n  Các câ(cid:0)u trúc điê(cid:0)u khiê(cid:0)n luô(cid:0)ng bao gô(cid:0)m:

Cấu trúc điều khiển if

trong chương trình shell

n  Điều kiện if được sử dụng để đưa ra các quyết định

trong đó được thực thi

n  Nếu điều kiện được cung cấp là đúng thì các lệnh

kiểm tra hay kết quả trả về của 1 chương trình

n  Điều kiện là một phép so sánh giữa 2 giá trị, một lệnh

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

n  Cấu trúc

Cấu trúc điều khiển if

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

n  Ví dụ:

Lệnh test hay []

hay sai (<>0)

n  Được dùng để kiểm tra xem một biểu thức đúng (0)

n  test biểu_thức hoặc [ biểu_thức]

n  Cú pháp

if test $1 -gt 0

then

echo "$1 number is positive"

fi

if [ $1 -gt 0 ]

then

echo "$1 number is positive"

fi

19

n  Ví dụ:

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

21

n  Sử dụng toán tử so sánh chuỗi trong toán tử [[ ]]

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ó khác rỗng if [[ -f $1 ]] ; then

if [[ -s $1 ]]; then cat $1 fi

fi

23

n  Ví dụ: Chương trình hiển thị nội dung của 1 file nếu

Các toán tử logic

nó khác rỗng

if [[ -n $1 ]] ; then if [ -s $1 –a –f $1 ]; then cat $1 fi fi

24

n  Ví dụ: Chương trình hiển thị nội dung của 1 file nếu

Cấu trúc rẽ nhánh if …else …fi

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  Nếu điều kiện đúng thì thực hiện khối lệnh thứ nhất,

if test $1 -gt 0 then

echo "$1 number is positive"

else

echo "$1 number is negative"

fi

25

n  Ví dụ

Cấu trúc if …then …else … fi đa mức

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

n  Rất hiệu quả khi phải kiểm tra nhiều trường hợp/giá

Cấu trúc lựa chọn

n  expr được đem đi so sánh với từng

case expr in pattern1 )

Khối lệnh 1 ;;

pattern, nếu nó bằng nhau thì các lệnh tương ứng sẽ được thi hành

pattern2 )

Khối lệnh 2 ;;

… * )

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

Khối lệnh n ;;

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

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].

sau khi ấn Enter và lưu giữ vào biến var

28

n  Lệnh read var sẽ đọc giá trị nhập vào từ bàn phím,

Cấu trúc lặp for

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

n  Lặp đi lặp lại 1 số lần một khối lệnh nào đó

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

n=$1 for i in 1 2 3 4 5 6 7 8 9 10 do

echo "$n * $i = `expr $i \* $n`"

done

30

Cấu trúc lặp while

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  Lặp đi lặp lại một khối lệnh nào đó trong khi biểu

n=$1 i=1 while [ $i -le 10 ] do echo "$n * $i = `expr $i \* $n`" i=`expr $i + 1` done

31

n  Ví dụ

Đườ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

vào từ file bằng cách sử dụng định hướng lại (redirect)

n  Có thể gửi kết quả đầu ra ra file cũng như đọc đầu

n  Lệnh > tên_file_đầu_ra n  ls > danh_sach_file

n  Ghi kết quả của 1 lệnh ra 1 file (thay vì màn hình)

Lệnh < tên_file_đầu_vào

n  cat < a.txt n  sort < a.txt > a.sorted.txt n  tr “[a-z]” “[A-Z]” < a.txt > b.txt

33

n  Định hướng đầu vào:

Định hướng đầu vào vào khối lệnh

n  Đưa dữ liệu vào 1 khối lệnh

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"

34

n  Có thể lấy dữ liệu từ 1 file

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

trúc if - then

38

n  Danh sách lệnh AND và OR có thể thay thế cho cấu

Các toán tử so sánh chuỗi

Ý nghĩa

Toán tử

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)

15

Các toán tử so sánh số học

Ý nghĩa

Toán tử

-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

15