31
v1.0015106225 1 MÃ NGUỒN MỞ Giảng viên: ThS. Phan Thanh Toàn 1

MÃ NGUỒN MỞ - eldata10.topica.edu.vn

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.00151062251

MÃ NGUỒN MỞ

Giảng viên: ThS. Phan Thanh Toàn

1

Page 2: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

BÀI 6

LẬP TRÌNH SHELL TRONG LINUX

Giảng viên: ThS. Phan Thanh Toàn

2

Page 3: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

MỤC TIÊU BÀI HỌC

• Liệt kê được các lệnh cơ bản của shell.

• Vận dụng ngôn ngữ shell vào viết một số

chương trình đơn giản.

• Vận dụng được ngôn ngữ C trong môi

trường Linux.

3

Page 4: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

CÁC KIẾN THỨC CẦN CÓ

Để hiểu rõ bài này, yêu cầu sinh viên cần có các

kiến thức cơ bản liên quan đến các môn học sau:

• Công nghệ phần mềm;

• Nguyên lí hệ điều hành.

4

Page 5: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

HƯỚNG DẪN HỌC

• Đọc tài liệu và tóm tắt những nội dung chính của

từng bài.

• Luôn liên hệ và lấy ví dụ thực tế khi học đến từng

vấn đê và khái niệm.

• Thực hành trực tiếp trên hệ điều hành Linux và

một số phần mềm mã nguồn mở như Open

office, PHP,…

• Làm bài tập và luyện thi trắc nghiệm theo yêu

cầu từng bài.

5

Page 6: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

CẤU TRÚC NỘI DUNG

Một số lệnh lập trình Shell6.2

Tổng quan về lập trình shell trong Linux6.1

Lập trình C trên Linux6.3

6

Page 7: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.1. TỔNG QUAN VỀ LẬP TRÌNH SHELL TRONG LINUX

6.1.1. Khái niệm về shell

6.1.2. Sử dụng biến

trong lập trình shell

7

Page 8: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.1.1. KHÁI NIỆM VỀ SHELL

• Shell là chương trình thông dịch lệnh của hệ điều hành Linux

Tương tác với người dùng theo từng câu lệnh;

Shell đọc lệnh từ bàn phím hoặc tệp tin;

Nhờ nhân của hệ điều hành Linux để thực thi lệnh.

• Shell script: là chương trình shell, bao gồm một tập các lệnh

User

Shell Applications

Low Level Utilities

Kernel

Hardware

8

Page 9: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.1.1. KHÁI NIỆM VỀ SHELL (tiếp theo)

9

• Soạn thảo và thực thi chương trình shell

Sử dụng trình soạn thảo văn bản để tạo chương trình shell script

Nội dung chương trình bao gồm tập các câu lệnh theo cú pháp lệnh trên Linux

Các câu lệnh trên cùng một dòng được ngăn cách bởi dấu chấm phẩy (;)

Thiết lập quyền thực thi cho tệp shell script

chmod o+x <tên tệp>

Thực thi chương trình

bash <Tên tệp>

sh <Tên tệp>

./<Tên tệp>

Page 10: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.1.1. KHÁI NIỆM VỀ SHELL (tiếp theo)

10

• Ví dụ chương trình shell đơn giản displayInfo.sh

clear

echo “Hello: $USER”

echo “Today is: “; date

echo “Number of user login:”; who | wc –l

echo “Calendar”

• Thiết lập quyền truy cập

chmod 755 displayInfo.sh

• Chạy chương trình shell

./ displayInfo.sh

Page 11: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.1.1. KHÁI NIỆM VỀ SHELL (tiếp theo)

11

• Trong Linux có 2 loại biến

• Xem và truy xuất giá trị của biến

$ <Tên biến>

echo $HOME

echo $USERNAME

Phải có kí hiệu $ trước tên biến

Biến hệ thốngBiến do người dùng

định nghĩa

Tạo ra và quản lí bởi hệ điều

hành Linux;

Tên biến viết hoa.

Tạo ra và quản lí bởi

người dùng;

Tên biến viết thường.

Page 12: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.1.1. KHÁI NIỆM VỀ SHELL (tiếp theo)

12

• Một số biến của hệ thống

BASH_VERSION: Tên version của shell;

HOME: Tên thư mục home của người sử dụng;

LOGNAME: Tên đăng nhập của người sử dụng;

OSTYPE: Tiểu hệ điều hành;

PATH: Thiết lập đường dẫn cho hệ thống;

PWD: Thư mục hiện hành của người sử dụng.

• Định nghĩa biến của người dùng

Cú pháp: <Tên biến> = <giá trị>

Chú ý:

Không cần khai báo biến trong shell;

Tên biến phân biệt chữ hoa và chữ thường;

Tên biến phải bắt đầu bằng kí tự;

Không sử dụng kí tự đặc biệt trong tên biến

Biến không gán giá trị có giá trị là NULL;

Không sử dụng kí tự đặc biệt trong tên biến.

Page 13: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.1.1. KHÁI NIỆM VỀ SHELL (tiếp theo)

13

Ví dụ:

Max=100

Min= 10

Nhiet_do = 35

Hiển thị giá trị của biến

Cú pháp: echo $<Tên biến>

Ví dụ:

echo $max

echo $nhiet_do

Chú ý: không được để khoảng trắng ở hai bên toán tử gán (=)

Page 14: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2. MỘT SỐ LỆNH LẬP TRÌNH SHELL

6.2.1. Các lệnh cơ bản

6.2.2. Cấu trúc lập trình

trong shell

14

Page 15: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.1. CÁC LỆNH CƠ BẢN

• Lệnh echo

Cú pháp: echo [tùy chọn] [string, variable]

Lệnh echo hiển thị thông tin ra thiết bị chuẩn, thông tin hiển thị có thể là một hằng

xâu kí tự, giá trị một biến hoặc một biểu thức.

Ví dụ: echo “Hello”, $myname

Một số kí tự đặc biệt

\b: Kí tự backspace (xóa lùi);

\n: Kí tự dòng mới;

\r: Kí tự về đầu dòng;

\t: Kí tự tab.

• Các phép toán số học

Để thực hiện các biểu thức số học sử dụng lệnh expr theo cú pháp sau:

expr <Biểu thức số học>

Các toán tử: +, -, *, /, %

Ví dụ: expr 3+2

15

Page 16: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.1. CÁC LỆNH CƠ BẢN (tiếp theo)

16

• Các dấu ngoặc

Dấu nháy kép “”:

Các hằng xâu kí tự được đặt trong cặp ngoặc kép;

Ví dụ: echo “Hello $myname”

Lệnh này sẽ hiển thị lời chào với tên được lưu trong biến myname.

Dấu nháy đơn ‘’: Các biến đặt trong cặp nháy đơn sẽ bị vô hiệu hóa

Ví dụ: echo “Hello $myname”

Lệnh này sẽ hiển thị dòng thông báo: Hello myname.

• Trạng thái kết thúc câu lệnh

Linux mặc định trả về:

Trạng thái 0 nếu lệnh kết thúc thành công;

Khác 0 nếu lệnh có lỗi.

Kiểm tra trạng thái kết thúc lệnh: $?

Page 17: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.1. CÁC LỆNH CƠ BẢN (tiếp theo)

17

• Lệnh đọc dữ liệu từ bàn phím

Cú pháp: read <Tên biến>

Lệnh đọc dữ liệu từ bàn phím và lưu vào biến được chỉ định bởi tên biến.

Ví dụ:

echo “Enter Your name:”

read name

echo “Hello: $name”

• Các tham số dòng lệnh

Một chương trình shell có nhiều tham số dòng lệnh, người sử dụng có thể truy

cập và lấy giá trị từ các tham số dòng lệnh của chương trình Shell

Tên lệnh: $0

Các tham số của chương trình: $1, $2,…

Số các tham số: $#

Ví dụ: “echo your program: $0”

Page 18: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.2. CẤU TRÚC LẬP TRÌNH TRONG SHELL

• Cấu trúc rẽ nhánh

Cấu trúc rẽ nhánh là cấu trúc có 1/1 nhóm lệnh được thực hiện hoặc bỏ qua tùy

thuộc vào giá trị của một biểu thức điều kiện.

Cú pháp:

if <điều kiện>

then

Khối lệnh

fi

Khối lệnh được thực hiện nếu điều kiện có giá trị đúng (giá trị khác 0).

Ví dụ

if cat $1

then

echo “\n Tệp tin $1 đã tồn tại trên hệ thống”

fi

18

Page 19: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.2. CẤU TRÚC LẬP TRÌNH TRONG SHELL (tiếp theo)

19

• Cấu trúc rẽ nhánh đầy đủ

Cú pháp

if <điều kiện> then

Khối lệnh 1

else

Khối lệnh 2

fi

• Lệnh test

Lệnh test được sử dụng để kiểm tra một biểu thức là đúng hay sai;

Trả về 0 nếu biểu thức đúng;

Trả về khác 0 nếu biểu thức sai;

Cú pháp: test <biểu thức>;

Biểu thức có thể là: số nguyên, các kiểu tệp, xâu kí tự.

Page 20: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.2. CẤU TRÚC LẬP TRÌNH TRONG SHELL (tiếp theo)

• Lệnh lặp for: Trong Linux lệnh for có thể thực hiện theo một số dạng sau

Cú pháp:

for {tên biến} in {danh sách giá trị}

do

Khối lệnh

done

for (expr1; expr2; expr3)

do

Khối lệnh

done

Trong đó: expr1, expr2, expr3 là các biểu thức.

20

Page 21: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.2. CẤU TRÚC LẬP TRÌNH TRONG SHELL (tiếp theo)

21

• Ví dụ: Chương trình shell sumofinteger.sh để tính tổng 1+2+…+10

$tong

tong=0

for((i=1;i<=10;i++))

do

tong=`expr $tong + $i`

done

echo "Gia tri cua tong la: $tong"

exit 0

Thực thi chương trình: ./ sumofinteger.sh .sh

Kết quả hiển thị: Gia tri cua tong la: 55

Page 22: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.2. CẤU TRÚC LẬP TRÌNH TRONG SHELL (tiếp theo)

• Cấu trúc lặp while

Cú pháp:

while <điều kiện>

do

Khối lệnh

done

Lệnh lặp while sẽ thực hiện khối lệnh cho đến khi điều kiện sai thì kết thúc lặp.

Ví dụ: Chương trình shell hiển thị các giá trị từ 1*1 đến 1*n, chương trình kết hợp

với lệnh if để kiểm tra số lượng đối số của chương trình.

22

Page 23: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.2.2. CẤU TRÚC LẬP TRÌNH TRONG SHELL (tiếp theo)

23

if [ $# -eq 0 ]

then

echo “Error: Number missing from command line argument”

echo “Syntax: $0 number”

exit 1

fi

n = $1

i=1

while [ $i –le 10 ]

do

echo “$n * $i = `expr $i * $n`”

i = `expr $i + 1`

done

Page 24: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.3. LẬP TRÌNH C TRÊN LINUX

6.3.1. Trình biên dịch gcc 6.3.2. Công cụ GNU make

6.3.3. Làm việc với tệp tin

24

Page 25: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.3.1. TRÌNH BIÊN DỊCH GCC

• Hệ điều hành Linux đã đi kèm với trình biên dịch cho ngôn ngữ lập trình C.

• Tên trình biên dịch C là gcc.

• Gcc cho phép người lập trình kiểm tra trình biên dịch theo 4 giai đoạn:

Tiền xử lí;

Biên dịch;

Tập hợp;

Liên kết.

• Gcc hỗ trợ biên dịch các chương trình C như: C chuẩn, ANSI C, C++.

• Cấu trúc chương trình C đơn gian gồm các phần:

Tệp tiêu đề;

Hàm main().

25

Page 26: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.3.1. TRÌNH BIÊN DỊCH GCC tiếp theo)

26

• Ví dụ cách sử dụng gcc với chương trình C đơn giản

Chương trình hello.c

#include <stdio.h>

void main()

{

fprintf(stdout, “Hello World”);

}

Dịch chương trình C gõ lệnh như sau: gcc hello.c –o hello

Chạy chương trình: ./hello

Lệnh gcc hello.c –o hello có tác dụng sử dụng trình biên dịch gcc để biên dịch và

liên kết tệp nguồn hello.c thành tệp thực thi hello.

Page 27: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.3.2. CÔNG CỤ GNU MAKE

• Khi xây dựng chương trình lớn cấu thành từ nhiều tệp tin viết lệnh biên dịch bằng

gcc rất dài và khó.

• GNU make hỗ trợ biên dịch các chương trình C phức tạp cấu thành từ nhiều tệp tin.

• GNU make cho phép tổ chức các lệnh biên dịch chương trình thành một tệp tin.

• GNU make tối ưu quá trình biên dịch.

• Một tệp makefile tạo ra bằng GNU make gồm các thành phần:

Đích;

Một danh sách các thành phần phụ thuộc cần để tạo ra đích;

Một danh sách các câu lệnh để thực thi các thành phần phụ thuộc khi được gọi;

Cú pháp các luật trong file GNUmake như sau:

target: dependency1, dependency1,……

command

command

27

Page 28: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.3.2. CÔNG CỤ GNU MAKE (tiếp theo)

28

• Ví dụ tệp makefile tạo ra chương trình khả thi tên là editor, chương trình được tạo ra

từ các tệp nguồn: editor.c, editor.h, keyboard.h, screen.h, screen.c, keyboard.c.

1. editor : editor.o screen.o keyboard.o

2. gcc -o editor.o screen.o keyboard.o

3. editor.o : editor.c editor.h keyboard.h screen.h

4. gcc -c editor.c

5. screen.o : screen.c screen.h

6. gcc -c screen.c

7. keyboard.o : keyboard.c keyboard.h

8. gcc -c keyboard.c

9. clean:

10. rm *.o

Page 29: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.3.3. LÀM VIỆC VỚI TỆP TIN

• Trong Linux để làm việc với tệp tin ta sử dụng một mô tả file, mỗi mô tả file thực chất

là một số nguyên sử dụng như một chỉ mục (index) để trỏ vào các tệp tin.

• Các thiết bị vào/ra đều có dòng dữ liệu tương ứng, giá trị 0 tương ứng với dòng vào

stdin, giá trị 1 tương ứng với stderr, giá trị 2 tương ứng với dòng ra chuẩn stdout.

Một số hàm thao tác với tệp tin

• Hàm open():

Cú pháp: Có 2 dạng như sau

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

Hàm open() cho phép mở tệp tin trên đĩa.

Chú ý: Cần khai báo sử dụng các tệp tiêu đề

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

29

Page 30: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

6.3.3. LÀM VIỆC VỚI TỆP TIN (tiếp theo)

30

Đối số pathname: là một xâu kí tự xác định đường dẫn của tệp cần mở.

Đối số mode: Chỉ ra chế độ mở tệp tin.

Đối số flag nhận một trong các giá trị O_RDONLY, O_WRONLY hoac O_RDWR

(cho biết tệp tin đã mở ở chế độ nào).

Ý nghĩa cờ

Cờ Ý nghĩa

O_RDONLY Mở file để đọc

O_WRONLY Mở file để ghi

O_RDWR Mở file để đọc và ghi

O_CREAT Tạo file nếu chưa tồn tại

O_EXCL Thất bại nếu file đã tồn tại

O_APPEND Mở file để thêm dữ liệu vào cuối tệp tin

Page 31: MÃ NGUỒN MỞ - eldata10.topica.edu.vn

v1.0015106225

TÓM LƯỢC CUỐI BÀI

Trong bài học này, chúng ta đã tìm hiểu những nội dung

chính sau:

• Tổng quan về lập trình shell trong Linux;

• Một số lệnh lập trình Shell;

• Lập trình C trên Linux.

31