1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo Cáo LẬP TRÌNH HỆ THỐNG Đề Tài Hệ điều hành Linux

57 579 4

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 57
Dung lượng 1,7 MB

Nội dung

Rc cũng ra đời từ dự án GNU  Chú ý : Tuy bash là shell là shell chuẩn được các nhà phân phối sử dụng phổ biến trong Linux nhưng các ví dụ về lập trình sẽ sử dụng ngôn ngữ và lệnh của

Trang 1

Báo Cáo LẬP TRÌNH HỆ THỐNG

Trang 2

Mục lục

PHẦN I LẬP TRÌNH SHELL 4

I Bash shell 4

1 Sử dụng biến 4

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

3 Danh sách AND (&&) 16

4 Danh sách Or 18

5 Tài liệu here 18

II Ngôn ngữ C shell 19

1 Biến 19

2 Cấu trúc điều kiện If 20

3 Câu lệnh while: 20

4 Nhiều điều kiện - AND/OR 21

5 Câu lệnh foreach: 21

6 Câu lệnh while: 22

7 Switch … case 22

8 Tham số dòng lệnh: 23

III Trình bày sự khác nhau trong cấu trúc điều khiển giữa 2 loại shell này 23

1 Mệnh đề If 23

2 Dạng If … else 24

3 Dạng else - if 24

4 Mệnh đề case 25

5 Mệnh đề for 26

6 Mệnh đề while 26

7 Mệnh đề Until 27

PHẦN II LẬP TRÌNH C TRÊN LINUX 34

A Thư viện liên kết trên Linux 34

a Thư viện liên kết tĩnh 34

b Thư viện liên kết động 42

B Makefile: sử dụng trong biên dịch mã nguồn 50

Vì sao ta phải dùng Makefile? 50

Trang 3

2. 53

3 Ví dụ Demo sử dụng Makefile 55

Trang 4

PHẦN I LẬP TRÌNH SHELL

Các shell trên unix/linux

- Sh ( Bourne) : shell nguyên thủy áp dụng cho Unix

- Csh, Tcsh, zsh : Dòng shell sử dụng cấu trúc lệnh của C làm ngôn ngữ kịch

bản Được tạo ra đầu tiên bởi Bia Joy Là Shell thông dụng thứ hai sau Bash Shell

- Bash : shell chủ yếu của Linux Ra đời từ dự án GNU.bash (viết tắt của

Bourne Again Shell ) có lợi điểm là mã nguồn được công bố rộng rãi Các bạn

có thể tải về và sử dụng miễn phí tại www.gnu.org

- Rc : Shell mở rộng của csh với nhiều tương thích với ngôn ngữ C hơn Rc

cũng ra đời từ dự án GNU

 Chú ý : Tuy bash là shell là shell chuẩn được các nhà phân phối sử dụng phổ biến trong Linux nhưng các ví dụ về lập trình sẽ sử dụng ngôn ngữ và lệnh của shell sh bởi vì shlà shell nguyên thủy, có thể chạy trên cả Unix Bằng lệnh file ta sẽ thấy trong hầu hết các bản Linux hiện nay sh chỉ là liên kết dẫn đến bash mà thôi

Ví dụ : $file / bin / sh

/bin/sh : symbolic link to bash

 Điều này có nghĩa là bash hoàn toàn có thể diễn dịch và điều khiển các lệnh của shell

sh

I Bash shell

 Ở phần này ta sẽ tìm hiểu về :

- Biến: kiểu chuỗi, kiểu số, tham số và biến môi trường

- Điều kiện : kiểm tra luận lý Boolean bằng shell

- Điều kiện chương trình: if, elif, for, while, until, case

1 Sử dụng biến

- Thường thì ta không cần phải khai báo biến trước khi sử dụng Thay vào đó biến sẽ tự động tạo và khai báo khi lần đầu tiên tên biến xuất hiện, chằng hạn như trong phép gán Mặc định tất cả các biến đều được khởi tạo và mang trị kiểu string.Tương tự như HĐH và ngôn ngữ C, cú pháp Shell phân biệt chữ hoa chữ thường, biến mang tên foo, Foo, FOO là 3 biến khác nhau

- Bên trong Script của Shell, bạn có thể lấy về nội dung của biến bằng cách

Trang 5

lệnh echo Khi gán nội dung cho biến bạn không cần sử dụng ký tự $ Ví dụ

trên dòng lệnh, bạn có thể gán nội dung và hiển thị biến như sau :

$ xinchao = hello

$echo $xinchao Hello

$ xinchao = “I am here”

$echo $xinchao

I am here

$ xinchao =12+1

$echo $xinchao 12+1

Lưu ý : sau dấu = không được có khoảng trắng Nếu gán nội dung chuỗi có khoảng trắng cho biến, cần bao bọc chuỗi bằng dấu “ “

1.1 Các ký tự đặc biệt

1.1.1 Các ký tự chuyển hướng vào/ ra

Ký hiệu Ý nghĩa

> Đầu ra hướng tới

>> Nối vào nội dung của

< Lấy đầu vào từ <

<< Đầu vào là ở đây

2> Đầu ra báo lỗi sẽ hướng vào

2>> Đầu ra báo lỗi hướng và ghi thêm vào

1.1.2 Các ký tự kiểm soát tiến trình

• Dấu & ( ampersand) : đặt một tiến trình vào chế độ chạy nền Với & chương trình sẽ tự chạy và shell quay ngay về tương tác với người dùng, trả lại dấu nhắc ngay Tiến trình nền có nhiều cách để kiểm soát

• Dấu ( ; ) Dùng để nhóm một số lệnh lại, phân cách bởi ;

• Dấu ` ` (backqoutes) Dấu thay thế

Bất kỳ lệnh nào xuất hiện trong dấu nháy sẽ được thực hiện trước và kết quả của lệnh đó sẽ thay thế đầu ra chuẩn (stdout) trước khi lệnh trong dòng lệnh thực hiện

• Pipeline

Trang 6

Shell cho phép kết quả thực thi một lệnh, kết hợp trực tiếp đầu vào của lệnh khác mà không cần xử lý trung gian

cmd & Đặt lệnh cmd chạy nền

cmd1 ; cmd2 Chạy cmd1 trước sau đó chạy cmd2

(cmd) Thực hiện cmd trong một shell con

`cmd` Đầu ra cmd sẽ thay cho đầu ra của lệnh trong dòng lệnh

Cmd1\cmd2 Nối đầu ra của cmd1 vào đầu vào của cmd2

echo "message : $myvar"

echo 'message : $myvar'

echo "message :\$myvar"

echo Enter some text

Trang 7

Cách chương trình làm việc: Biến myvar được tạo ra và khởi gán giá trị

chuỗi Hi there Nội dung của biến sau đó được hiển thị bằng lệnh echo trong các trường hợp bọc chuỗi bằng dấu nháy kép, nháy đơn và dấu hiển thị đắc biệt Tóm lại nếu muốn

thay thế nội dung biến trong một chuỗi cần bọc chuỗi bằng nháy kép Nếu muốn hiển thị toàn bộ nội dung của chuỗi,hãy dùng nháy đơn

1.2 Biến môi trường

Khi trình shell khởi động nó cung cấp sẵn một số biến được khai báo và gán giá trị mặc định Chúng được gọi là các biến môi trường Các biến này thường được viết hoa để phân biệt với các biến do người dùng tự định nghĩa ( thường là ký tự không hoa ) Nội dung các biến này thường tùy vào thiết lập của hệ thống sử dụng Danh shell của các biến môi trường là khá nhiều, nhưng nhìn chung nên nhớ một số biến môi trường chủ yếu sau:

Biến môi trường Ý nghĩa

$HOME Chứa nội dung của thư mục chủ

$PATH Chứa danh shell các đường dẫn

$PS1 Dấu nhắc hiển thị trên dòng lệnh Thường là $user

$SP2 Dấu nhắc thứ cấp, thông báo người dùng nhập thêm thông tin trước khi

lệnh thực hiện Thường là dấu >

$IFS Dấu phân cách các trường hợp trong danh shell chuỗi

$0 Chứa tên chương trình gọi trên dòng lệnh

$# Số tham số truyền trên dòng lệnh

$$ Mã tiến trình của shell script thực thi

Mỗi môi trường mà user đăng nhập chứa một số danh shell biến môi trường dùng cho mục đích riêng Có thể dùng lệnh export của shell

1.3 Biến tham số (parameter variable)

- Nếu cần tiếp nhận tham số trên dòng lệnh để xử lý, có thể dùng thêm các biến môi trường sau:

Biến tham số Ý nghĩa

$1,$2,$3 Vị trí và nội dung của các tham số trên dòng lệnh theo thứ

tự trái – phải

Trang 8

S* Danh shell của tất cả các tham số trên dòng lệnh Chúng

được lưu trong một chuỗi duy nhất phân cách bằng ký tự đầu tiên quy định trong biến $IFS

S@ Danh shell các tham số được chuyển thành chuỗi Không

sử dụng dấu phân cách của biến IFS

Ví dụ sau sẽ minh họa một số cách đơn giản xử lý và truy xuất biến môi trường

- Ví dụ: Try_var.sh

#!/bin/bash salutation="Hello"

echo $salutation echo "The program $0 is now running"

echo "The second parameter was $2"

echo "The first parameter was $1"

echo "The parameter list was $*"

echo "The user's home directory is $HOME"

echo "Please enter a new greeting"

read salutation echo $salutation echo "The script is now complete"

exit 0

Lưu tên tập là try_var.sh, đổi thuộc tính thực thi x cho tập tin bằng lệnh :

$chmod+x try_var.sh Khi chạy try_varsh từ dòng lệnh,bạn sẽ nhận được kết quả của kết xuất như

sau :

$./try_var.sh foo bar baz

Hello The program./try_var.sh is now running

Trang 9

The first parameter was foo The parameter list was foo bar baz The user‟s home directory is/home/xyz Please enter a new greeting

echo $myvar echo "message : $myvar"

echo 'message : $myvar' echo "message :\$myvar"

echo Enter some text read myvar

echo '$myvar' now equals $myvar exit 0

Kết xuất khi thực thi script :

Hi there Message : Hi there Message: $myvar Message: $myvar Enter some text Hello world

$myvar now equals Hello World

Cách chương trình làm việc: Biến myvar được tạo ra và khởi gán giá trị

chuỗi Hi there Nội dung của biến sau đó được hiển thị bằng lệnh echo trong

Trang 10

các trường hợp bọc chuỗi bằng dấu nháy kép, nháy đơn và dấu hiển thị đắc biệt \ Tóm lại nếu muốn thay thế nội dung biến trong một chuỗi cần bọc chuỗi bằng nháy kép Nếu muốn hiển thị toàn bộ nội dung của chuỗi,hãy dùng nháy đơn

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

2.1 Lệnh if

- Lệnh If tuy đơn giản nhưng được sử dụng nhiều nhất If kiểm tra điều kiện đúng hoặc sai để thực thi biểu thức thích hợp

If condition Then

If [$timeofday = “yes” ]; then

Echo” Good morning”

Trang 11

- Trong ví dụ If_control.sh ở trên có rất nhiều phát sinh Tất cả các câu trả lời khác với “yes” đều có nghĩa là “no” Chúng ta có thể khắc phục điều này bằng cách sử dụng cấu trúc điều khiển elif Mệnh đề này cho phép kiểm tra điều kiện lần thứ 2 bên trong else Script dưới đây có thể hoàn chỉnh hơn, có thể in

ra thông báo lỗi nếu người dùng nhập không đúng “yes” hoặc “no”

Ví dụ: Elif_control.sh

#!/bin/bash Echo “Is it morning? Please answer yes or no”

Fi Exit 0

Chú ý : Tương tự như ví dụ if_control.sh nhưng ta sử dụng them elif để kiểm

tra trường hợp người dùng không nhập “no” Thông báo lỗi được in ra và mã lỗi trả về bằng lệnh exit là 1 Trường hợp hoặc “yes” hoặc “no” được nhập vào, mã lỗi trả về sẽ là 0

2.3 Lệnh For

- Sử dụng for để lặp lại một số lần với các giá trị xác định Phạm vi lặp có thể nằm trong một tập hợp chuỗi chỉ định tường minh bởi chương trình hay là kết quả trả về từ một biến hoặc biểu thức khác

Cú pháp:

For variable in values

Do

Statements

Trang 12

do

if [ -d "$file" ]; then break;

fi done echo first directory fred was $file exit 0

2.4 Lệnh Case

- Lệnh Case có cách sử dụng hơi phức tạp hơn các lệnh đã học Cú pháp của lệnh case như sau :

Case variable in Pattern[ | partten]….) statement ; ; Pattern[ | partten]….) statement ; ; …

Esac

- Mặc dù nhìn khá khó hiểu , nhưng lệnh case rất linh động Case cho phép thực hiện so khớp nội dung của biến với một chuỗi mẫu pattern nào đó Khi một mẫu được so khớp thì lệnh statement tương ứng sẽ được thực hiện Hãy lưu ý đặt dấu ;; phía sau mỗi mệnh đề so khớp pattern, shell dùng dấu hiệu này để nhận dạng mẫu pattern so khớp tiếp theo mà biến cần thực hiện

Trang 13

- Việc cho phép so khớp nhiều mẫu khác nhau làm case trở nên thích hợp cho việc kiểm tra nhập liệu của người dùng

Sau đây là ví dụ : case1.sh

#!/bin/bash

echo "Is it morning? Please answer yes or no"

read timeofday

case "$timeofday" in "yes") echo "Good Morning";;

"no" ) echo "Good Afternoon";;

"y" ) echo "Good Morning";;

"n" ) echo "Good Afternoon";;

* ) echo "Sorry, answer not recognised";;

esac exit 0

- Cách thực hiện: Sauk hi người dùng nhập vào câu trả lời, lệnh case sẽ lấy nội

dung của biến $timeofday so sánh với từng chuỗi Khi gặp chuỗi thích hợp nó

sẽ thực thi lệnh sau dấu ) và kết thúc (không tiếp tục so khớp với các mẫu khác) Ký tự đại diện * cho phép so khớp với mọi loại chuỗi * thường được xem như trường hợp so sánh đúng cuối cùng nếu các mẫu so sánh trước đó thất bại Bạn có thể xem * là mệnh đề default trong lệnh switch của C hay case….else của Pascal

- Ngoài cách trên, ta có thể kết hợp chung các mẫu so khớp với nhau khiến cho

case ngắn gọn hơn như sau: case2.sh

#!/bin/bash echo "Is it morning? Please answer yes or no"

read timeofday case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning";;

"n*" | "N*" ) echo "Good Afternoon";;

* ) echo "Sorry, answer not recognised";;

esac

Trang 14

exit 0

 Script trên sử dụng nhiều mẫu so khớp trên một dòng so sánh của lệnh case Các mẫu này có ý nghĩa tương tự nhau và yêu cầu thực thi cùng một lệnh nếu điều kiện đúng xảy ra Cách viết này thực tế thường dùng và dễ đọc hơn cách viết thứ nhất Mặc dù vậy hãy tìm hiểu case ở ví dụ sau, case sử dụng lệnh exit để trả về mã lỗi cho từng trường hợp so sánh mẫu đồng thời case sử dụng cách so sánh tắt bằng ký tự đại diện

Ví dụ: Case3.sh

#!/bin/bash echo "Is it morning? Please answer yes or no"

read timeofday case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning"

echo "Up bright and early this morning?"

;;

"[nN]*" ) echo "Good Afternoon"

;;

* ) echo "Sorry, answer not recognised"

echo "Please answer yes or no"

exit 1 ;;

esac exit 0

- Cách thực hiện : Trong trường hợp “no” ta dùng ký tự đại diện * thay thế cho

tất cả ký tự n và N Điều này có nghĩa là nx hay Nu…đều có nghĩa là „no‟ Ở

ví dụ trên ta đã thấy cách đặt nhiều lệnh trong cùng một trường hợp so khớp

Exit 1 cho biết người dùng không chọn yes và no Exit 0 biết người dùng đã

chọn yes , no theo yêu cầu:

 Có thể không cần đặt ;; ở mẫu so khớp cuối cùng trong

Trang 15

 lệnh case (phía trước esac) , vì không còn mẫu so khớp nào cần thực hiện nữa

Không như C yêu cầu phải đặt lệnh break ở mỗi mệnh đề case, shell không đòi hỏi

điều này, nó biết tự động chấm dứt khi lệnh case tương ứng đã tìm được mẫu thỏa mãn

- Để làm case trở nên mạnh mẽ và so sánh được nhiều trường hợp hơn, có thể giới hạn các ký tự so sánh theo cách sau : [yy] | [Yy] [Ee] [Ss] , khi đó y, Y hay yes, YES…đều được xem là yes Cách này đúng hơn là dùng ký tự thay thế toàn bộ * trong trường hợp [nN]*

Ví dụ : password.sh

#!/bin/sh Echo “enter password”

Read trythis While [“$trythis” !- “secret”]; do

Echo “ sorry, try again”

Ready trythis Done

Exit 0

Kết xuất của script

$./password.sh Enter password Abc

Sorry, try again Secret

$

Trang 16

Lệnh while liên tục kiểm tra nội dung biến $trythis , yêu cầu nhập lại

dữ liệu bằng lệnh read một khi $trythis vẫn chưa bằng với chuỗi “secret”

Lệnh until tương tự lệnh while nhưng điều kiện kiểm tra bị đảo ngược lại Vòng lặp sẽ bị dừng nếu điều kiện kiểm tra là đúng

Ví dụ sau sử dụng lệnh until để chờ user đăng nhập

Ví dụ until_user.sh

#!/bin/sh Echo “Locate for user…”

Until who | grep “$1” > dev/null

Do

Sleep 60 Done

Echo –e\\a Echo “***** $1 has just logged in ******”

Exit 0 Lệnh who đọc danh shell các user đăng nhập vào hệ thống, chuyển danh shell này cho grep bằng cơ chế đường ống ( | ) Lệnh grep lọc ra tên user theo biến môi trường $1 hiện có nội dung là chuỗi xyz Một khi lệnh grep lọc

ra dữ liệu , nó sẽ truyền ra vùng tập tin rỗng/dev/null và trả lại giá trị null, lệnh until kết thúc

3 Danh sách AND (&&)

Trang 17

- Danh shell AND cho phép thực thi một chuỗi cạnh kề nhau, lệnh sau chỉ thực hiện khi lệnh trước đã thực thi và trả về mã lỗi thành công Cú pháp sử dụng

như sau : Statement1 && statement2 && statement3 &&…

- Bắt đầu từ bên trái statement1 sẽ thực hiện trước, nếu trả về true thì statement2 tiếp tục được gọi Nếu statement2 trả về false thì shell chấm dứt danh shell AND và ngược lại statement3 sẽ được gọi ….Toán tử && dùng

để kiểm tra kết quả trả về của statement trước đó Kết quả trả về của AND sẽ

là true nếu tất cả các lệnh statement đều được gọi thực thi Ngược lại là false

- Ví dụ sau dùng lệnh toauch file_one (để kiểm tra file_one tồn tại hay chưa, nếu chưa thì tạo mới) tiếp đến rm file_two Sau cùng danh shell AND sẽ kiểm tra xem các file có đồng thời tồn tại hay không để đưa ra thông báo thích hợp

Ví dụ and.sh

#!/bin/bash touch file_one

rm -f file_two

if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo "there"

then echo -e "in if"

else echo -e "in else"

fi exit 0

 Chạy thử script trên bạn sẽ nhận được kết quả như sau :

$./and_list.sh Hello

In else

- Cách chương trình làm việc : Lệnh touch và rm đảm bảo rằng file_one tồn tại

và file_two không có Trong danh shell biểu thức if, && sẽ gọi lệnh [-f file_one ] trước Lệnh này thành công vì touch đã tạo sẵn file_one Lệnh echo tiếp tục được gọi luôn trả về trị true nên theo lệnh tiếp theo [-f file_two] thi hành Do file_two không tồn tại nên echo “there” không được gọi Toàn bộ

Trang 18

biểu thức trả về giá trị false (vì các lệnh trong danh shell không được thực thi hết) Do if nhận trị false nên echo trong mệnh đề else của lệnh if được gọi

 Cách chương trình làm việc: File_one đầu tiên được loại bỏ để đảm bảo lệnh if tiếp theo không tìm thấy nó Lệnh [-f file_one ] trả về false vì file_one không tồn tại Lệnh echo tiếp theo trong chuỗi danh shell OR sẽ được gọi in ra hello Do echo luôn trả về true nên echo tiếp theo không được gọi Bởi vì trong danh shell OR có một lệnh trả về true nên toàn bộ biểu thức sẽ là true Kết quả cuối cùng là echo trong if được gọi để in ra chuỗi “in if”

5 Tài liệu here

- Unix và Linux cung cấp cơ chế tự động hóa mô phỏng việc nhập hõ vào từ bàn phím bằng tài liệu here ( here document) Ta để sẵn các phím hay chuỗi cần gõ trong một tập tin và chuyển hướng tập tin này cho lệnh cần thực thi

Nó sẽ tiếp nhận và đọc nội dung tập tin như những gì đã gõ từ bàn phím

- Ví dụ, khi gõ lệnh cat , nó sẽ chờ nhập dữ liệu gõ vào từ bàn phím Nếu khi

script thực thi không có mặt người dùng ở đó thì sao? Quá trình tự động của

Trang 19

script sẽ dừng lại chờ đến khi ta xuất hiện để gõ dữ liệu vào Cơ chế tài liệu

here giúp thực hiện tự động nhập liệu như sau : ví dụ cat_here

#! /bin/bash cat > test.txt <<!YOURLABEL!

Hello This is here document

!YOURLABEL!

 Kết quả khi thực thi cat_here.sh, tệp test.txt được tạo ra Với nội dung là chuỗi Hello

This is…ta không cần phải dùng tay nhập dữ liệu cho lệnh cat

 Tài liệu here yêu cầu đặt cú pháp ở giữa nhãn bắt đầu và nhãn kết thúc Trong ví dụ trên nhãn bắt đầu là !YOURLABEL! ( Lưu ý đến ký tự << ở đầu dùng để cho biết nơi bắt đầu của tài liệu here) ,nhãn kết thúc là !YOURLABEL! Dấu ! hai bên nhãn YOURLABEL chỉ để dễ dàng nhận ra nhãn mà thôi, trong trường hợp nội dung dữ liệu của chuỗi YOURLABEL thì cặp ! ! cũng dùng để phân biệt riêng tên nhãn của người dùng

II Ngôn ngữ C shell

Cấu trúc C Shell: C Shell cung cấp ngôn ngữ dòng lệnh tương tự như ngôn ngữ lập trình

C Ngôn ngữ C shell chứa cấu trúc: nhập và xuất, toán tử điều kiện, quản lý tập tin và định nghĩa biến Nếu bạn đã làm quen với các ngôn ngữ lập trình cấp thấp, thì lập trình shell sẽ rất đơn giản

1 Biến

Lệnh cơ bản để khai báo biến trong C shell là set Ví dụ:

set name = "Henri"

=> sẽ khởi tạo biến name chứa giá trị "Henri"

set users = (George Frank Mary Heloise Hartsell)

=> sẽ khởi tạo biến có kiểu dữ liệu wordlist (mảng chuỗi), bây giờ chúng ta có thể truy cập giá trị này bằng index của chúng

@ count = 0

=> khởi tạo biến kiểu integer

Trang 20

Ghi chú: lệnh set chỉ được sử dụng cho các biến shell Biến môi trường như DISPLAY, EDITOR phải được khai báo bằng lệnh setenv

2 Cấu trúc điều kiện If

Điều kiện trong dấu ngoặc được tính trước và trả về giá trị 0 (false) hoặc 1 (true) Chỉ khi điều kiện là true các lệnh mới được thực thi

command group 2 end if

3 Câu lệnh while:

Có lúc bạn cần thực thi một lệnh lặp đi lặp lại cho đến khi điều kiện phù hợp Nếu cấu trúc if then không đáp ứng được, bởi vì điều kiện của nó chỉ được tính toán một lần Đặt điều kiện trong foreach cũng không đáp ứng được hoặc khó coi, bởi vì số vòng lặp

vô hạn Chúng ta cần một vòng lặp xoay vòng không hạn định cho đến khi giá trị của điều kiện là false Trong trường hợp này, chúng ta sử dụng câu lệnh while:

while (condition)

statements

end

Trang 21

4 Nhiều điều kiện - AND/OR

- Toán tử AND là && - điều kiện ghép là true nếu cả tất cả điều kiện là true

- Toán tử OR là || và điều kiện ghép sẽ là true nếu một trong tất cả điều kiện là true

Toán tử kiểm tra tập tin:

operator filename

Ví dụ:

Chạy lệnh dựa vào điều kiện tập tin "mail.log" có tồn tại hay không

if (-e mail.log) then

cat new.log >> mail.log

endif

Sử dụng biến thay thế cho tên tập tin:

set file_to_remove = pine-interrupted-mail

-z tập tin có chiều dài là 0?

Để đảo ngược giá trị của toán tử này, sử dụng ! trước toán tử trong dấu ngoặc (ví dụ như

! -z filename)

5 Câu lệnh foreach:

Trang 22

Câu lệnh foreach cho phép bạn thực thi một lệnh hoặc một nhóm lệnh cho mỗi file mà tên của nó phù hợp với mẫu xác định Ví dụ: tạo script xóa file rỗng và file có tên là core trong thư mục home của bạn

vô hạn Chúng ta cần một vòng lặp xoay vòng không hạn định cho đến khi giá trị của điều kiện là false Trong trường hợp này, chúng ta sử dụng câu lệnh while:

Giả sử bạn viết một chương trình menu Người dùng chọn số từ 1 đến 6 Một hành động

sẽ được thực hiện phụ thuộc vào những gì người dùng chọn Chúng ta có thể sử dụng một chuỗi câu lệnh if then else if then else if then , nhưng rất khó coi và khó đọc nếu chúng ta debug chương trình Thay vào đó chúng ta có thể sử dụng chức năng switch case

#!/bin/csh

echo -n "Please enter your first name: "

set uname = $<

switch ($uname)

Trang 23

wrap infile outfile

Trong script này giá trị argv[1] sẽ là infile và giá trị argv[2] sẽ là outfile Chúng ta có thể truy cập các giá trị này như sau:

#!/bin/csh

if (!-e $argv[1]) then

echo "Error: file $argv[1] does not exist."

exit 2

endif

III Trình bày sự khác nhau trong cấu trúc điều khiển giữa

2 loại shell này

 Cấu trúc điều khiển gồm If, Elif , For, While, Until, Case

1 Mệnh đề If

Trang 24

cau_lenh

endif Nếu biểu thức bieu_thuc được đánh giá là Đúng thì (các) câu lệnh cau_lenh sẽ được

thực hiện, còn không thì chương trình sẽ bỏ qua và thực hiện ngay câu lệnh phía sau fi hoặc endif

Nếu chỉ có một câu lệnh được thực hiện trong if thì Csh còn có một dạng đơn giản hơn

else cau_lenh

endif

Dạng này mở rộng dạng đơn giản nói trên ở chỗ: nếu bieu_thuc là Sai thì (các)

câu lệnh cau_lenh sau else sẽ được thực hiện

Trang 25

echo "Co tệp tai_lieu trong thu mục hien thoi" else

echo "Khong tim thay tệp tai_lieu trong thu muc hien thoi"

fi

- Đối với csh (lưu ý phải có ký tự # ở đầu chương trình) :

#

if ( { -f tai_lieu } ) then

echo "Co tệp tai_lieu trong thu muc hien thoi" else

echo "Khong tim thay tệp tai_lieu trong thu muc hien thoi"

cau_lenh

Breaksw case mau2:

cau_lenh

breaksw

default:

cau_lenh

Trang 26

;;

esac

breaksw endsw

Trong đó, mau được so sánh lần lượt với các mẫu mau1, mau2 Nếu có một mẫu trùng khớp thì (các) câu lệnh tương ứng sẽ được thực hiện cho đến khi gặp hai dấu chấm phảy (;;) bash hoặc breaksw (csh) Nếu không có mẫu nào trùng khớp thì (các) câu lệnh trong khối * bash hoặc default (csh) được thực hiện

end

Trang 27

7 Mệnh đề Until

Cú pháp của mệnh đề until giống với mệnh đề while Điểm khác biệt là ở chỗ, mệnh đề while thực hiện vòng lặp chừng nào biểu thức điều kiện còn Đúng, còn mệnh đề until thực hiện vòng lặp chừng nào biểu thức điều kiện còn Sai Cú pháp của nó trong bash như sau :

until bieu_thuc do

cau_lenh

done

IV BÀI TẬP SHELL

Yêu cầu : Viết một chương trình shell tương tác với hệ thống Linux với yêu cầu: chương trình shell tạo một menu lựa chọn cho phép

1 hiển thị tên các nhóm có trong hệ thống và các user tồn tại trong từng nhóm

2 hiển thị tên và mật khẩu của tất cả các user tồn tại trong hệ thống

3 hiển thị thời gian đăng nhập của từng user vào hệ thống

4 hiển thị các thông tin về phần cứng của hệ thống

5 kiểm tra xem các phần mềm: pico, vi, openssh server, gcc, tftp, nfs đã cài đặt trên

hệ thống hay chưa? Nếu phần mềm nào chưa cài thì sẽ tự động cài đặt cho hệ thống

Thực hiện: Dưới đây là script thực hiện yêu cầu trên

#!/bin/bash

until [ "$verify" = n ]

do

echo "Lựa chọn các tính năng theo số thứ tự "

echo "1) hiển thị tên các nhóm có trong hệ thống và các user tồn tại trong từng nhóm "

echo "2) hiển thị tên và mật khẩu của tất cả các user tồn tại trong hệ thống "

echo "3) hiển thị thời gian đăng nhập của từng user vào hệ thống "

echo "4) hiển thị các thông tin về phần cứng của hệ thống "

Trang 28

echo "5) kiểm tra xem các phần mềm: pico, vi, openssh server, gcc, tftp, nfs đã cài đặt trên hệ thống hay chưa? Nếu phần mềm nào chưa cài thì sẽ tự động cài đặt cho hệ thống "

echo "6) Quit"

echo "Please enter your choice"

read pattern

case $pattern in

1) echo "Hiển thị lựa chọn 1"

echo "Danh sách tên nhóm và các user"

cat /etc/passwd | cut -d: -f1,5

# hien thi ten nhom va user trong tung nhom

;;

2) echo " Hiển thị lựa chọn 2"

echo "Tên và mật khẩu các user"

sudo cat /etc/shadow

# login - login name

# password - password in encrypted form, which is 13 to 24 characters long

# Daysince - Days since [month, day, year] that the password was changed

# Daysafter - Days before the password may be changed

# Daysmust - Days after which the password must be changed

# dayswarn - Days before the password will expire ( A warning to the user)

# daysexpire - Days after the password expires that the account is disabled

# daysince - Days since [month, day, year]that the account is disabled

# reserved - Reserved field

;;

3) echo " Hiển thị lựa chọn 3"

echo "Thời gian đăng nhập vào hệ thống của từng user"

last

;;

Ngày đăng: 08/03/2015, 18:46

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w