Bai giang linux

Chia sẻ bởi Bùi Thị Trang | Ngày 19/03/2024 | 9

Chia sẻ tài liệu: bai giang linux thuộc Công nghệ thông tin

Nội dung tài liệu:

1
Chương 3: Lập trình hệ vỏ (SHELL)
Bao gồm các phần sau:

Linux và Shell
Sử dụng Shell như ngôn ngữ lập trình
Cú pháp ngôn ngữ Shell
Dò lỗi (Debug) của Script
Hiển thị màu sắc
Xây dựng ứng dụng bằng ngôn ngữ Script
2
3.1. Linux và Shell
Khi bắt đầu lập trình trên UNIX hay Linux bằng C hay bằng những ngôn ngữ khác  chúng ta phải tiến hành tiếp cận và tìm hiểu khái niệm SHELL
Do HĐH thường cung cấp các hàm hay dịch vụ để chương trình ứng dụng triệu gọi, nên chúng ta với tư cách là một nhà lập trình  cần phải hiểu tường tận những dịch vụ ấy.
3
Để triệu gọi các hàm hệ thống của hạt nhân, ngoài việc xây dựng các chương trình và biên dịch chúng ra mã nhị phân (file thực thi) để HĐH triệu gọi thì HĐH còn cung cấp cho ta khả năng giao tiếp với hạt nhân (kernel) thông qua trình diễn dịch trung gian.
Trên môi trường MS-DOS  shell chính là tập tin command.com. Chính từ shell này cung cấp các tập lệnh như copy, del, v.v… thành các lời triệu gọi DOS cấp thấp (ngắt 21h).
Ngoài ra, DOS còn cung cấp việc điều khiển tự động hóa HĐH bằng các lệnh bó (batch) trong tập tin .bat nhưng không mạnh bằng Linux.
4
- Hình 3.1 dưới đây là mô hình tương tác giữa Shell, chương trình ứng dụng, hệ X-Window và hạt nhân của HĐH.
Hình 3.1
Tương tác giữa Shell, Applications, X-Window, Kernel
5
Một số Shell thông dụng như sau:







Chuẩn thường được sử dụng hiện nay là Bash Shell. Thông thường khi cài đặt, trình cài đặt sẽ đặt bash là shell khởi động
Tên shell này có tên là bash được đặt trong thư mục /bin
6
3.2. Sử dụng Shell như ngôn ngữ lập trình
Có hai cách để viết chương trình điều khiển shell
Gõ chương trình trực tiếp ngay dòng lệnh (kể cả các lệnh điều khiển if, for, case, v.v…)
Gộp các câu lệnh vào một tập tin và yêu cầu shell thực thi tập tin này như là một chương trình (Ghi nhớ là phải đặt quyền execute cho tập tin này mới có thể thực thi được)
3.2.1. Điều khiển Shell từ dòng lệnh
Thực hiện ví dụ: Giả sử trên ổ cứng chúng ta có rất nhiều file nguồn .c. Công việc đặt ra là tìm và hiển thị tất cả các file nguồn chứa chuỗi main().
7
Mã nguồn thực thi công việc như sau:
#for file in *
>do
> if grep –l ‘main()’ $file
> then
> more $file
> fi
>done
Trong ví dụ trên, lệnh for…do sẽ kết thúc bằng lệnh done. HĐH sẽ nhận biết được và bắt đầu thực thi tất cả những gì ta gõ vào bắt đầu từ lệnh for (Khi một lệnh chưa hoàn chỉnh thì shell sẽ chuyển thành “>”)
Như trên, file là một biến của shell, trong khi đó * là một tập hợp đại diện cho các tên tập tin sẽ tìm thấy trong thư mục hiện hành.
Một cách khác để thực thi lệnh trên là:
#for file in *; do; if grep –l ‘main()’ $file; then; more $file; fi; done
8
3.2.2. Điều khiển Shell bằng tập tin kịch bản (Script file)
Tiến hành tạo một tập tin bằng lệnh cat như sau:
#cat > first.sh
#!/bin/sh
#Vi du ve Script file
for file in *
do
if grep –l ‘main()’ $file
then
more $file
fi
done
exit 0
Lưu tập tin trên lại và tiến hành thiết lập quyền thực thi cho tập tin trên
#chmod +x first.sh
9
Như ví dụ bên trên thì ta thấy dấu “#” có hai chức năng (Trong đoạn thân chương trình)
#  Chức năng là khai báo đây là dòng chú thích (comment)
#!  Chức năng là chỉ thị yêu cầu shell hiện tại triệu gọi shell sh nằm trong thư mục /bin (Chú ý cặp ký hiệu #!)
Dòng lệnh exit có chức năng yêu cầu Script sau khi thực thi sẽ trả về mã lỗi  Điều này nên được thể hiện trong quá trình lập trình.
Trong UNIX/Linux, không yêu cầu phải đặt phần mở rộng cho tên tập tin cũng như chương trình. Tuy nhiên, có thể sử dụng phần mở rộng là .sh để dễ nhận diện đây là dạng tập tin script của shell (tương tự như tập tin .bat của MS-DOS)
Để biết được một tập tin có phải là Script hay là định dạng khác, ta sử dụng lệnh file
Ví dụ:
#file first.sh
10
3.2.3. Thực thi Script file
Thông thường các chương trình thực thi shell thường được đặt tại /bin. Do đó, để có thể thực thi được các Shell Script thì ta triệu gọi trình Shell với tên tập tin Script làm đối số.
#/bin/sh first.sh
Tuy nhiên, để thực hiện lệnh trên một cách ngắn ngọn ta có thể sử dụng theo phương cách như sau:
#first.sh
Cũng có thể lệnh trên không thực hiện thành công và ta sẽ nhận được câu thông báo lỗi “Command Not Found”  Nguyên nhân do biến môi trường PATH thường không chứa đường dẫn tới vị trí thư mục hiện hành.
#PATH=$PATH:.
- Hoặc cũng có thể thực hiện tự động (mỗi lần login) bằng cách đưa dòng PATH=$PATH:. vào cuối của tập tin .bash_profile của người dùng.
Lập trình Shell
Sử dụng hệ soạn thảo vi để soạn thảo
Bắt đầu bằng dòng lệnh
#!/bin/bash
3. Tên tệp thường lưu có phần mở rộng
.sh
4. kết thúc bằng
exit 0
5. Để thực hiện lệnh ta thay đổi quyền truy cập file
chmod 755 tên file
./tên file
11
12
Cú pháp ngôn ngữ Shell
1. Sử dụng biến
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 (biến lúc này chứa giá trị kiểu chuỗi)
Chú ý sự phân biệt chữ HOA/thường. Ví dụ: foo, Foo, FOO là ba biến khác nhau.
Để lấy nội dung của tên biến  sử dụng dấu “$”
Ví dụ:
#xinchao=Hello
#echo $xinchao
Hello
#xinchao=“I am here”
#echo $xinchao
I am here
Chú ý sau dấu “=“, không được có bất kỳ khoảng trắng nào khác. Nếu gán nội dung chuỗi có chứa khoảng trắng  hãy dùng dấu “”.
13
Sử dụng lệnh read để đọc giá trị nhập liệu do người dùng nhập vào (như hàm readln() trong ngôn ngữ Pascal hoặc scanf() trong ngôn ngữ C++)
Ví dụ:
#read yourname
Nguyen Van An
#echo $yourname
Nguyen Van An



#read yourname
Nguyen Van Ba
#echo “Hello” $yourname
Hello Nguyen Van Ba
14
Dấu bọc chuỗi (quoting)
Dấu nháy kép được dùng trong trường hợp chuỗi của người dùng nhập vào có khoảng trắng. Tuy nhiên, bên trong dấu nháy kép, ký hiệu “$” vẫn có hiệu lực.
Dấu nháy đơn có hiệu lực mạnh hơn. Nếu như tên biến có ký tự “$” đặt trong chuỗi có dấu nháy đơn  nó sẽ bị vô hiệu hóa. Nếu muốn hiển thị dấu “$” sử dụng dấu “” trong chuỗi.
Ví dụ 3-1: variables.sh
Tóm lại, nếu muốn thay thế nội dung biến trong một chuỗi  dấu nháy kép. Còn nếu muốn hiển thị toàn bộ nội dung chuỗi  dấu nháy đơn.
15
Biến môi trường (Environment Variable)
Khi trình shell khởi động đã tự động cung cấp một số biến được khai báo và gán giá trị mặc định  BIẾN MÔI TRƯỜNG
Các biến môi trường này thường được viết hoa để phân biệt với các biến do người dùng định nghĩa. Một số biến môi trường chủ yếu sau:
16
Biến tham số (Parameter Variable)
Mục đích là để tiếp nhận tham số trên dòng lệnh cho việc xử lý
Một số biến môi trường dưới đây:
17
Ví dụ sau sẽ cho thấy được sự khác nhau của hai biến $* và $@
#IFS=“^”
#set foo bar bam
#echo “$@”
foo bar bam
#echo “$*”
foo^bar^bam
#unset IFS
#echo “$*”
foo bar bam
Lệnh set thiết lập 3 tham số dòng lệnh là foo bar bam. Những tham số này ảnh hưởng đến biến môi trường $* và $@
Biến $# sẽ chứa số tham số dòng lệnh:
#echo “$#”
3
- Tham khảo Ví dụ 3-2: try_variables.sh
18
2. Điều kiện
Khả năng kiểm tra điều kiện và đưa ra quyết định rẽ nhánh thích hợp tùy theo điều kiện luận lý đúng hay sai là nền tảng cơ bản của tất cả các ngôn ngữ lập trình
Lệnh test hoặc []
Sử dụng lệnh [] hoặc test để kiểm tra điều kiện boolean (True or False)
Lệnh [] trông đơn giản dễ hiểu, thường được dùng nhiều và rộng rãi hơn lệnh test
Cách sử dụng hai lệnh trên là tương đương nhau
if test –f hello.c if [ -f hello.c ]
then then
… …
fi fi
 Chú ý là phải đặt khoảng trắng giữa lệnh [] và biểu thức kiểm tra
19
Lệnh test có điều kiện trong đó cho phép kiểm tra một trong 3 kiểu sau:
So sánh chuỗi (Cần tham khảo thêm)



So sánh toán học (Cần tham khảo thêm)



So sánh điều kiện trên tập tin (Cần tham khảo thêm)
20
3. Cấu trúc điều khiển
Shell cung cấp cho ta cấu trúc điều khiển tương tự các ngôn ngữ lập trình khác (và thậm chí còn mạnh và uyển chuyển hơn)
Lệnh if
- Chức năng: Kiểm tra điều kiện đúng hay sai để thực thi biểu thức thích hợp. Đây là lệnh được sử dụng nhiều nhất trong các chương trình (dù đó là chương trình lớn hay nhỏ)
Cấu trúc:
if <điều kiện>
then

else

fi
Tham khảo Ví dụ 3-3: if_control.sh
21
Lệnh elif
- Chức năng: Cũng tương tự như if  kiểm tra điều kiện đúng hay sai để thực thi biểu thức thích hợp. Lệnh này cho phép kiểm tra điều kiện lần thứ 2 bên trong else
Tham khảo Ví dụ 3-4: elif_control.sh
Vấn đề phát sinh với các biến
Xét lại Ví dụ 3-4 ta sẽ thấy nếu như ta không nhập giá trị cho biến timeofday là “yes” hoặc “no” lúc thông báo đầu tiên (chỉ việc gõ Enter) thì lúc này xem như ta đã tạo chuỗi rỗng cho biến timeofday
Lúc này dòng if đầu tiên sẽ trở thành if [ =“yes” ]  shell lúc này sẽ không biết so sánh chuỗi “yes” với cái gì???  Lỗi: “[: =: unary operator expected”
Tham khảo Ví dụ 3-5: elif_control2.sh
22
Lệnh for
Chức năng: Để thực hiện việc lặp lại một số lần công việc với các giá trị xác định.
Cấu trúc:
for in
do

done
23
Lệnh while
Chức năng: Có chức năng như lệnh for nhưng nhằm đáp ứng được việc lặp trong một tập hợp lớn hoặc số lần lặp không biết trước.
Cấu trúc:
while <điều kiện> do

done
24
Lệnh until
Chức năng: Có chức năng như lệnh while nhưng điều kiện 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
Cấu trúc:
until <điều kiện>
do

done
Tham khảo Ví dụ 3-10: until_user.sh
Cách thực hiện lệnh như sau:
#./until_user.sh minhkhai (với minhkhai là tên người dùng đăng nhập vào hệ thống.
25
Lệnh case
Chức năng: Có chức năng là cho phép ta so khớp nội dung của biến với một mẫu chuỗi (pattern) nào đó. Khi một mẫu được so khớp thì tương ứng sẽ được thực hiện.
Cấu trúc:
case in
mẫu chuỗi [ | mẫu chuỗi] ...) ;;
mẫu chuỗi [ | mẫu chuỗi] ...) ;;
...
esac
Tham khảo Ví dụ 3-11: case1.sh
Tham khảo Ví dụ 3-12: case2.sh
Tham khảo Ví dụ 3-13: case3.sh
26
3.3.4. Danh sách thực thi lệnh
Shell cung cấp cho ta cú pháp danh sách AND và OR để có thể kết nối các lệnh lại với nhau theo thứ tự kiểm tra trước khi ra một quyết định nào đó
Danh sách AND
- Chức năng: Cho phép thực thi một chuỗi lệ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ấu trúc:
&& && ...
Tham khảo Ví dụ 3-14: and_list.sh
27
Danh sách OR
- Chức năng: Cũng như lệnh AND là thực thi một dãy các lệnh NHƯNG nếu có một lệnh trả về là TRUE thì việc thực thi dãy lệnh sẽ dừng lại
Cấu trúc:
|| || ...
Kết quả cuối cùng của danh sách OR chỉ đúng (TRUE) khi có một trong các trả về TRUE
Khác với “&&” là gọi lệnh tiếp theo khi các lệnh trước đó là TRUE còn với “||” thì gọi lệnh tiếp theo trong chuỗi lệnh khi lệnh trước đó là FALSE
Tham khảo Ví dụ 3-15: or_list.sh
28
3.3.5. Hàm (Function)
Shell cho phép ta tự tạo lập các hàm hay thủ tục để triệu gọi bên trong Script
Ta có thể gọi các script con khác bên trong script chính  tuy nhiên việc này thường làm tiêu tốn tài nguyên và không hiệu quả bằng triệu gọi hàm
Cấu trúc:
tên hàm() {


. . .

}
Tham khảo Ví dụ 3-16: my_function.sh
29
Biến cục bộ và biến toàn cục
- Khai báo biến cục bộ (chỉ có hiệu lực bên trong hàm)  dùng từ khoá local. Do vậy, nếu không có từ khóa trên thì biến chỉ được hiểu là toàn cục (global)
- Phạm vi lưu trữ của biến toàn cục không còn hiệu lực khi hàm kết thúc
- Biến toàn cục được nhìn thấy và có thể thay đổi bởi tất cả các hàm trong cùng script.
Tham khảo Ví dụ 3-17: function2.sh
Hàm và cách truyền tham số
- Shell không cung cấp chức năng khai báo tham số cho hàm.
- Việc truyền tham số cho hàm tương tự truyền tham số trên dòng lệnh
- Ví dụ: Truyền tham số cho foo()  foo “tham số 1”, “tham số 2”, ...
Tham khảo Ví dụ 3-18: get_name.sh
30
3.3.6. Các lệnh nội tại của Shell
Ngoài các lệnh điều khiển được giới thiệu bên trên, shell còn cung cấp cho ta một số lệnh nội tại khác (built-in) ~ các lệnh nội trú của MS-DOS
Lệnh break
- Chức năng: Thoát khỏi vòng lặp for, while hoặc until bất kể điều kiện thoát của các lệnh này có diễn ra hay không.
- Tham khảo Ví dụ 3-19: break.sh
Lệnh continue
- Chức năng: Thường được dùng bên trong vòng lặp, lệnh này yêu cầu vòng lặp quay ngược lại thực hiện bước lặp kế tiếp mà không cần thực thi các khối lệnh còn lại
- Tham khảo Ví dụ 3-20: continue.sh
31
3.3.6.3. Lệnh :
- Chức năng: Là một lệnh rỗng (NULL). Đôi lúc lệnh này được dùng với ý nghĩa logic là TRUE. Việc dùng lệnh “:” sẽ thực thi nhanh hơn việc so sánh true. Như “while :” sẽ nhanh hơn “while true”
- Ghi chú: Một số shell phiên bản cũ sử dụng lệnh “:” như là một chú thích lệnh ~ như “#”
- Tham khảo Ví dụ 3-21: colon.sh
Lệnh . (thực thi)
- Chức năng: Dùng để thực thi một script bên trong shell hiện hành. Đồng thời khi thực thi chính lệnh “.” sẽ giữ nguyên những thay đổi về môi trường mà các biến tác động lên (do khi thực thi một script, shell sẽ lưu lại toàn bộ biến môi trường và tạo ra môi trường mới - sub shell - để script có thể hoạt động và các thông số của biến môi trường sẽ được khôi phục lại khi script chấm dứt - bằng lệnh exit())
- Tham khảo Ví dụ 3-22: dot_command.sh
32
Lệnh eval
- Chức năng: Cho phép thực hiện một lệnh động phụ thuộc vào biến
- Ví dụ 1:
$ foo=10
$ x=foo
$ y=‘$’$x
$ echo $y
 Kết quả in ra là $foo
33
- Ví dụ 2:
$ foo=10
$ x=foo
$ eval y=‘$’$x
$ echo $y
Kết quả in ra là 10
- Ví dụ 3: Giả sử tập tin run chứa các lệnh:
$ L1=./input_timer.exe
$ L2=./count_ctrl2.exe
$ eval ‘$L’$1
34
Dùng các lệnh sau để thực hiện lệnh có sẵn theo số thứ tự:
$ ./run 1
$ ./run 2
- Ví dụ 4: Có thể tạo lập thư mục với tên động mà không cần đến eval:
$ mkdir “/backups/$(date “+%F %H.%M.%S”)”
 Thư mục mới với tên dạng /backups/2005-05-23 08.30.25 được tạo lập.
35
3.3.6.6. Lệnh exec
- Chức năng: Dùng để gọi một lệnh bên ngoài khác. Thông thường lệnh exec sẽ gọi một shell phụ khác với shell mà script đang thực thi.
- Mặc định thì exec sẽ triệu gọi lệnh exit khi kết thúc lệnh  Do đó nếu ta gọi lệnh exec ngay từ dòng lệnh thì sau khi thực thi lệnh xong (do gọi tiếp lệnh exit) ta sẽ bị thoát ra khỏi shell hiện hành và quay trở về màn hình đăng nhập.
- Tham khảo Ví dụ 3-23: exec_demo.sh
3.3.6.7. Lệnh exit n
- Chức năng: Dùng để thoát ra khỏi shell đang gọi và trả về mã lỗi n
- Tương tự như trên nếu như ta gọi exit ngay từ dòng lệnh thì ta sẽ thoát ra khỏi shell hiện hành và quay về màn hình đăng nhập.
- Mã lỗi: tham khảo thêm trong giáo trình.
- Tham khảo Ví dụ 3-24: test_exists.sh
36
3.3.6.8. Lệnh export
- Chức năng: Do khi thực thi một shell thì các biến môi trường đều được lưu lại. Như vậy, khi khai báo và sử dụng các biến trong một script thì các biến này chỉ có giá trị của shell triệu gọi script đó.
 Do vậy, lệnh export được đề cập ở đây cho phép các biến có thể thấy được tất cả các script trong shell phụ hay các script được triệu gọi từ shell khác.
- Lệnh export có chức năng như khai báo biến toàn cục
- Tham khảo Ví dụ 3-25: export2.sh
- Tham khảo Ví dụ 3-26: export1.sh
3.3.6.9. Lệnh expr
- Chức năng: Ước lượng giá trị đối số truyền cho nó như là một biểu thức và thường được dùng trong việc tính toán kết quả toán học đổi từ chuỗi sang số. Chú ý: Biểu thức có lệnh expr đặt trong cặp dấu “` `”
37
3.3.6.10. Lệnh printf
- Chức năng: Tương tự như lệnh printf của thư viện C
- Danh sách các ký tự đặc biệt dùng chung với dấu “”, gọi là chuỗi thoát





- Định dạnh số và chuỗi bằng ký tự %
38
3.3.6.11. Lệnh return
- Chức năng: Trả về giá trị của hàm
- Nếu lệnh không có tham số thì sẽ trả về mã lỗi của lệnh vừa thực hiện
3.3.6.12. Lệnh set
- Chức năng: Dùng để thiết lập giá trị cho các biến môi trường như $1, $2, $3,... Ngoài ra, lệnh này còn có chức năng loại bỏ những khoảng trắng không cân thiết và đặt nội dung của chuỗi truyền cho nó vào các biến tham số
#set This is parameter
#echo $1
This
#echo $3
parameter
- Tham khảo Ví dụ 3-27: set_use.sh
39
3.3.6.13. Lệnh shift
- Chức năng: Di chuyển nội dung các tham số môi trường $1, $2, $3, v.v... xuống một vị trí. (Do ta chỉ có tối đa 9 tham số $1..$9)
- Nếu gọi tham số $10 thì sẽ được hiểu là $1 và “0”
- Tham khảo Ví dụ 3-28: using_shift.sh
3.3.6.14. Lệnh trap
- Chức năng: Dùng để bẫy một tín hiệu (signal) do hệ thống gửi đến Shell trong quá trình thực thi script
- Tín hiệu ở đây thông thường là một thông điệp của hệ thống gởi đến chương trình yêu cầu hay thông báo một công việc nào đó mà hệ thống sẽ thực hiện. Ví dụ: Ngắt INT thường được gởi khi nhấn CTRL+C


- Tham khảo Ví dụ 3-29: use_trap.sh
40
3.3.6.15. Lệnh unset
- Chức năng: Loại bỏ biến khỏi môi trường Shell
- Lệnh unset rất ít được sử dụng
- Ví dụ:
#!/bin/sh
foo=“Hello World”
echo $foo
unset foo
echo $foo
- Kết quả chương trình sẽ in ra chuỗi rỗng (do lúc này biến foo không tồn tại nữa)
41
3.3.7. Lấy về kết quả của một lệnh
Khi viết các lệnh cho script, đôi lúc ta thường có nhu cầu lấy về kết quả hay xuất kết quả cho lệnh tiếp theo. Tương tự như việc ta gọi thực thi một lệnh và muốn lấy kết quả trả về của lệnh làm nội dung lưu trữ vào biến
Ví dụ 3-30: use_command.sh
3.3.7.1. Ước lượng toán học
Việc sử dụng lệnh expr bên trên theo đánh giá là thường thực thi chậm và không hiệu quả. Các shell mới hiện tại cung cấp cho ta cú pháp $((...)) dùng để ước lượng biểu thức bên trong (...) thay cho lệnh expr  Cách này hiệu quả hơn nhiều so với lệnh expr
Ví dụ 3-31: evaluate.sh
42
3.3.7.2. Mở rộng tham số
Kỹ thuật dưới đây dùng để thực thi cấu trúc mảng:
1_tmp = “Hello”
2_tmp = “There”
3_tmp = “World”
for i in 1 2 3
do
echo ${i}_tmp
done
Kết quả là nội dung 3 biến 1_tmp, 2_tmp, 3_tmp được đưa ra màn hình.
43
- Một số phương pháp mở rộng và thay thế tham số dùng xử lý chuỗi:
${param:-default} Nếu param=null, kết quả là default
${#param} Độ dài của param (số ký tự)
${param%word} Loại bỏ chuỗi con ngắn nhất bên phải param so khớp với word (param không thay đổi)
${param%%word} Loại bỏ chuỗi con dài nhất bên phải param so khớp với word (param không thay đổi)
44
${param#word} Loại bỏ chuỗi con ngắn nhất bên trái param so khớp với word (param không thay đổi)
${param##word} Loại bỏ chuỗi con dài nhất bên trái param so khớp với word (param không thay đổi)
Ví dụ: Đổi tên tập tin hàng loạt:
for filename in t*.vb
do
mv $filename ${filename%.vb}.txt
done
45
- Ví dụ 3-32: param_expansion.sh
Ví dụ 3-33: giftojpg.sh
46
3.3.8. Tài liệu HERE
Trên UNIX/Linux cung cấp cơ chế tự động hóa mô phỏng việc nhập liệu gõ vào từ bàn phím bằng tài liệu here (Here Document)
Ta chỉ cầ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ì ta gõ vào từ bàn phím.
Tham khảo Ví dụ 3-34: cat_here.sh
Tham khảo Ví dụ 3-35: auto_edit.sh
47
3.4. Dò lỗi (Debug) của Script
Do script là lệnh văn bản được shell thông dịch nên việc dò lỗi không khó như các chương trình biên dịch nhị phân
Quá trình dò lỗi thì shell sẽ in ra số thứ tự của dòng gây lỗi. Ta cũng có thể thêm vào lệnh echo để in ra nội dung của các biến có khả năng gây lỗi cho chương trình
- Ta có thể dùng set để đặt một số tùy chọn cho shell hoặc đặt thêm tham số khi gọi shell thực thi script
48
3.5. Hiển thị màu sắc
Mục đích chính là scrips có hỗ trợ cho phép ta hiển thị được tất cả màu sắc lên màn hình mà không cần phải có sự hỗ trợ của ngôn ngữ biên dịch như C/C++
3.5.1. Màu chữ
Thông thường khi thực hiện lệnh ls -l ta sẽ thấy
* tập tin thực thi được hiển thị bằng màu xanh lá cây
* tập tin nén có màu đỏ
* tập tin thông thường màu trắng xám
* tên file hình ảnh (gif, jpg, v.v...) màu hồng
* v.v...
Ví dụ: #echo –e “33[35mHello Color 33[0m”  Hello Color
#echo –e “33[32m Green 33[34m Blue”  Green Blue
Tham khảo các mã điều khiển thêm trong giáo trình (p.113)
49
Ví dụ: In ra văn bản với các màu khác nhau
#for color in 30 31 32 33 34 35 36 37
#do
# echo –e “33[${color}m This is color text”
#done
#echo –e “33[0m”
3.5.2. Thuộc tính văn bản (đọc thêm p.114)
Ví dụ:
#echo –e “33[33;1m This is bold and red text 33[0m”
 This is bold and red text
3.5.3. Màu nền (đọc thêm p.114)
Ví dụ:
#echo –e “33[42;31m Red and Green 33[0m”
 Red and Green
50
3.6. Xây dựng một ứng dụng bằng ngôn ngữ Script
Xây dựng chương trình quản lý đĩa CD (chương trình được thực thi bằng ngôn ngữ của Shell. Tham khảo Ví dụ 3-36: cd_app.sh
3.6.1. Phân tích yêu cầu
- Chương trình phải có khả năng chèn vào một tuyển tập CD mới
- Tạo được danh sách mới các bài hát
- Sửa đổi cập nhật mới các bài hát
- Xóa các bài hát cũ
- Liệt kê danh sách các bài hát đang có trong bộ sưu tập
3.6.2. Thiết kế ứng dụng
- Xây dựng menu dễ dàng cho việc lựa chọn
- Lưu trữ dữ liệu ở dạng văn bản
- Lựa chọn cách lưu thông tin về CD trong một tập tin và có quan hệ với thông tin về tên bài hát được lưu trong tập tin khác (do đây là cách tuân thủ theo mô hình quan hệ CSDL).
51

Chân thành cảm ơn
Các anh/chị đã tham dự bài giảng.

Bộ phận Multi-media đã hỗ trợ chúng tôi trong quá trình thuyết giảng.
Kết thúc chương 3
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...

Người chia sẻ: Bùi Thị Trang
Dung lượng: | Lượt tài: 1
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)