Trang chủ EDA | Doman - Hosting | Siêu thị trực tuyến

UNIX – C Shell Scripts

UNIX – C Shell Scripts

Gửi bàigửi bởi admin » Thứ 6 18 Tháng 7, 2008 10:09 am

Scripting là gì?

Khi làm việc trên Unix, chúng ta thường thực hiện các công việc lặp đi, lặp lại, các công việc triệu gọi nhiều dòng lệnh và cấu trúc phức tạp. May mắn, Unix shell đưa ra một khả năng giải quyết các vấn đề này bao gồm: khả năng lên lịch cho các công việc chạy sau khi người dùng đăng xuất, gán bí danh cho các lệnh và viết các chương trình tùy chọn bằng lệnh shell…
Khi bạn muốn dùng cách đơn giản để thực hiện các công việc phức tạp. Khi bạn muốn thực thi một chuỗi lệnh lặp đi lặp lại...Trong trường hợp này, bạn có thể sử dụng shell script. Tất cả shell script thì đơn giản là tập tin chứa một chuỗi lệnh shell. UNIX cho phép bạn nhập vào tên của script ở dấu nhắc dòng lệnh - nơi mà mỗi lệnh trong script sẽ được thực thi theo thứ tự.

Trình thông dịch:

Mỗi shell có một ngôn ngữ riêng - tập các lệnh mà shell hiểu. Một vài lệnh làm việc bất chấp shell, nhưng phổ biến chỉ có thể thực thi trong shell xác định. Dòng đầu tiên trong script của bạn phải xác định trình thông dịch được sử dụng. Ví dụ:
#!/bin/ksh
Khi một script được thực thi, shell đọc #! có nghĩa là: sử dụng shell hoặc trình thông dịch sau để thực thi phần còn lại của script. Trong ví dụ này, sử dụng Korn shell. Kỹ thuật này cho phép người dùng làm việc với Korn shell, thậm chí họ đang làm việc trong C shell.

Các loại trình thông dịch:

Có một vài trình thông dịch có sẵn trên hầu hết hệ thống UNIX như C shell (/bin/csh), Bourne shell (/bin/sh) và Korn shell (/bin/sh). Các trình thông dịch phổ biến khác được biết như perl (/usr/local/bin/perl hoặc /usr/bin/perl). Mỗi trình thông dịch có điểm mạnh và yếu: bạn sẽ phải quyết định chọn cái phù hợp nhất cho công việc của mình.

Tạo script:

Khởi động trình soạn thảo, xác định trình thông dịch trên dòng đầu tiên. Sau đó gõ một vài lệnh đơn giản, mỗi lệnh được đặt theo thứ tự mà bạn muốn nó thực thi trước hay sau. Khi hoàn tất, thoát khỏi trình soạn thảo, lưu script của bạn vào một tập tin. Bước cuối cùng bạn cần thực hiện trước khi chạy chương trình là thêm quyền thực thi vào file đó, bằng lệnh chmod. Sau đó gõ tên tập tin ở dấu nhắc và nhấn enter.

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.

Kết xuất:

Lệnh đưa kết xuất ra màn hình là echo. Mặc định echo sẽ kết thúc kết xuất bằng ký tự xuống dòng. Bạn có thể ngăn chặn điều này bằng cách thêm cờ -n giữa lệnh echo và các tham số của nó. Ví dụ:
#!/bin/csh
echo "Hello World!"
echo "How are you today?"
Sẽ kết xuất như sau:
Hello World!
How are you today?
Nhưng script:
#!/bin/csh
echo -n "Good morning, "
echo "Beatrice."
sẽ kết xuất như thế này:
Good morning, Beatrice.

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

Điều khiển chương trình:

if...then
Cho phép người dùng thực thi một lệnh hoặc một nhóm lệnh chỉ khi điều kiện phù hợp. Cấu trúc như sau:
if (condition(s)) then
command(s)
endif
Đ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.
if...then...else
Cấu trúc này cho phép người dùng xác định nhóm lệnh "default" - thực thi nếu điều kiện sau từ khóa if là false, ngược lại nhóm lệnh giữa điều kiện if và từ khóa else sẽ thực thi.
if (condition(s)) then
command group 1
else
command group 2
endif

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
if (-z $file_to_remove) then
rm $file_to_remove
endif
=> kiểm tra file có tên chứa trong biến có chiều dài là 0 hay không, nếu đúng là xóa file đó đi.
Toán tử Ý nghĩa
-d tập tin là thư mục?
-e tập tin tồn tại?
-f plain file?
-o quyền chủ sở hữu?
-r quyền đọc?
-w quyền ghi?
-x quyền thực thi?
-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).

Câu lệnh foreach:

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 nhà của bạn.
#!/bin/csh
foreach dudfile(/home/users1/hansel/*)
if (-z $dudfile || $dudfile == "core") then
rm $dudfile
endif
end

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

Tạo script cho phép giao tiếp với chương trình:

Trong C shell, có hai thứ chúng ta cần quan tâm là: đầu tiên nhận input từ người dùng trong quá trình thực thi, kỹ thuật thứ hai là biến tham số - nhận tham số từ dòng lệnh, vào lúc gọi script.

Input lúc thực thi:

Nếu bạn muốn người dùng có thể trả lời các hỏi từ chương trình trong lúc nó chạy, bạn sẽ cần khởi tạo các biến để nắm giữ giá trị input đó. Thay vì khởi tạo chuỗi cho biến, khởi tạo nó giữ một biến đặc biệt $<. Ví dụ:
set uinput = $<
=> gán mọi thứ mà người dùng nhập vào cho biến uinput và chúng ta có thể tham chiếu đến giá trị biến sau đó. Ví dụ:
#!/bin/csh
echo "Please input your name: "
set uname = $<
echo "Why, Good Morning, $uname!"

Tham số dòng lệnh:

Nếu bạn muốn script của bạn chạy giống như các lệnh UNIX khác - cho phép người dùng chuyển vào tên tập tin hoặc chuỗi, thì bạn sẽ cần sử dụng khả năng tham số của C shell. Trong C shell có biến đặc biệt là argv. Biến này có kiểu dữ liệu wordlist, mỗi từ trên dòng lệnh là một phần tử trong mảng. Ví dụ chúng ta đã viết script wrap cho phép thực hiện một số chức năng trên file, chúng ta gọi script với cấu trúc:
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

Chọn lựa từ danh sách:

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)
case [Gg]eorge:
cat /messages/George
breaksw
case [Mm]ary:
cat /messages/Mary
breaksw
case [Ss]andy:
cat /messages/Sandy
breaksw
default:
cat /messages/Goodbye
exit 1
endsw

Chú thích:

Nếu bạn muốn xem lại chương trình hoặc chia sẽ chương trình cho người khác, bạn có thể sẽ khám phá ra rằng: rất khó đọc code không có chú thích. Để chèn vào câu chú thích, đơn giản sử dụng ký hiệu # - mọi thứ theo sau nó trên cùng dòng sẽ được xem như chú thích. Ví dụ:
if (-e $file_to_remove) then # checks to see if the file exists

(Nguồn từ http://www.cims.nyu.edu/~ytang/c_script.html)
Hình đại diện của thành viên
admin
Quản trị viên
 
Bài viết: 211
Ngày tham gia: Thứ 4 05 Tháng 3, 2008 12:00 am

Quay về Các ngôn ngữ khác

Ai đang trực tuyến?

Đang xem chuyên mục này: Không có thành viên nào đang trực tuyến1 khách

cron