Hôm nay lên mạng tìm được chút tài liệu về shell script để viết app cho E6 post lên cho anh em nào quan tâm thì đọc tìm hiểu để viết app cho E6
Phần 1: Getting started with Shell Programming
1.Viết shell script như thế nào ?
Bước 1 : Trình soạn thảo để viết code nên dùng Notepad++ vì ct này hỗ trợ rất tốt cho việc viết code shell và lưu file shell dưới dạng file của linux. Sau khi dowload về cài ra máy cần chọn Settings>Preferrence>New Document>Format: Unix (Để file tạo ra dưới dạng file của unix). Chuyển sang soạn thảo với shell bạn chọn Language>Shell
Bước 2 : viết shell script
Cấu trúc một chương trình shell script như sau :
command … lệnh
command…
exit 0 thoát
Chú ý : lệnh exit 0 sẽ được mô tả kỹ trong phần Exit status
2.Biến trong shell
Trong linux shell thì có 2 kiểu biến :
Biến hệ thống (system variable) : được tạo bởi Linux. Kiểu biến này thường được viết bằng ký tự in hoa.
Biến do người dùng định nghĩa.
Định nghĩa biến :
Cú pháp : tên biến=giá trị
Một số quy định về biến trong shell :
(1)Tên bắt đầu bằng ký tự hoặc dấu gạch chân (_).
(2)Không được có khoảng trắng trước và sau dấu bằng khi gán giá trị cho biến
(3)Biến có phân biệt chữ hoa chữ thường
(4)Bạn có thể khai báo một biến có giá trị NULL như sau :
var01= hoặc var01=””
(5)Không dùng ?, * để đặt tên biến.
3.Sử dụng biến
Để truy xuất giá trị biến, dùng cú pháp sau :
ví dụ :
echo $n
4.Lệnh echo
Dùng để hiển thị dòng văn bản, giá trị biến …
Các option :
-n : không in ký tự xuống dòng.
-e : cho phép hiểu những ký tự theo sau dấu \ trong chuỗi
\a : alert (tiếng chuông)
\b : backspace
\c : không xuống dòng
\n : xuống dòng
\r : về đầu dòng
\t : tab
\\ : dấu \
ví dụ : echo –e “một hai ba \a\t\t bốn \n”
5.Tính toán trong Shell
Sử dụng expr
Cú pháp : expr op1 phép toán op2
Ví dụ :
expr 2 – 1
expr 10 / 2
expr 20 % 3
expr 10 \* 3
echo `expr 6 + 3`
z=`epxr $z + 3`
Sử dụng let
Ví dụ :
let “z += 3”
let “z=$m*$n”
Sử dụng $((...))
ví dụ :
z=$(($m*$n))
chú ý :
epxr 20 % 3 : 20 mod 3
epxr 10 \* 3 : phép toán nhân , sự dụng \* chứ không phải * để phân biệt với ký tự thay thế.
Dòng cuối trong ví dụ trên được sử dụng rất nhiều trong shell, khi một lệnh được đặt giữa 2 dấu `` (không phải dấu nháy đơn ‘ ’ ) thì shell sẽ thực thi lệnh đó.
Ví dụ : a=`epxr 10 \* 3`
a sẽ có giá trị là 10 x 3 = 30
in kết quả ra màn hình : echo $a
6.Một vài thông tin về dấu ngoặc kép
Có 3 loại dấu sau :
“ : Nháy kép :bất cứ gì nằm trong dấy nháy kép được xem là những ký tự riêng biệt
‘ :Nháy đơn :những gì nằm trong dấu nháy đơn có ý nghĩa không đổi
` :Nháy ngược :thực thi lệnh
Ví dụ :
echo “hôm nay là `date`” sẽ in ra ngày tháng hôm nay vì date nằm trong dấu nháy ngược `
7.Trạng thái Exit
Mặc định trong Linux, khi một lệnh hoặc script thực thi , nó trả về 2 loạI giá trị để xác định xem lệnh hoặc script đó có thực thi thành công không.
(1). Nếu lệnh thực thi thành cônggiá trị trả về là 0 (zero)
không thành công(2). Nếu giá trị trả về khác 0 (nonzero)
Giá trị đó gọI là Exit status
Vậy làm thế nào để biết được giá trị trả về của một lệnh hay 1 script ? Rất đơn giản, chỉ cần sử dụng biến đặc biệt có sẵn của shell : $?
Ví dụ :
nếu bạn xoá 1 file không tồn tạI trên đĩa cứng
sẽ in ra màn hình một giá trị khác 0# echo $?
8.Lệnh read – đọc giá trị nhập từ bàn phím , file …
Dùng để lấy dữ liệu nhập từ bàn phím và lưu vào biến
Cú pháp : read var1 var2 var3 … varN
read không có tham số giá trị sẽ được chứa trong biến $REPLY
ví dụ :
var=”$REPLY”
Bình thường thì dấu \ cho phép xuống dòng để nhập tiếp dữ liệu trong read. Nếu read –r thì sẽ không có ý nghĩa đó.'
Ví dụ :
second line
# echo “$var” kết quả : first line second line
Nhưng vớI tham số r thì sao ?
# read –r var # nhập vào : first line \
# echo “$var” kết quả : first line \
Lệnh read có thể dùng để đọc file. Nếu file chứa nhiều hơn 1 dòng thì chỉ có dòng thứ nhất được gán cho biến . Nếu read vớI nhiều hơn 1 biến (read var1 var2 …) thì read sẽ dựa vào biến $IFS để gán dữ liệu cho các biến. Mặc định thì $IFS là khoảng trắng.
Ví dụ :
Nếu file có nhiều hơn 1 dòng
Khi đó, mỗI biến sẽ chứa 1 chuỗI được cách biệt bởI khoảng trắng ($IFS) chứ không phảI 1 dòng, biến cuốI cùng sẽ được chứa toàn bộ phần còn lạI của dòng.
Vậy làm thế nào để đọc toàn bộ file ? Có thể giảI quyết bằng vòng lặp không ??
do
echo $line
done < data_file
Sử dụng $IFS (Internal File Separator ) để tách một dòng input của read, nếu bạn không muốn mặc định là khoảng trắng thì làm như thế nào ? Xem đoạn script sau :
echo “liet ke tat ca user ”
OIFS=$IFS; IFS=: # backup lạI IFS và gán giá trị mới. Ví file /etc/passwd dùng : để tách biệt
# các trường vớI nhau nên gán IFS là :
while read name passwd uid gid fullname ignore
do
echo “$name $fullname”
done < /etc/passwd # I/O redirection
IFS=$OIFS # trả lạI IFS ban đầu
Nếu đặt IFS ngay trong vòng lặp thì không cần backup IFS
while IFS=: read name passwd uid gid fullname ignore
do
echo “$name $fullname”
done < /etc/passwd
IFS vẫn không đổi
9.Tham số lệnh
Giả sử ta có script tên myself , để thực thi script này ta cần truyền vào 2 tham số như sau :
$ myself one two
Trong đó
myself là tên script
one : tham số thứ nhất truyền vào script
two : tham số thứ hai
Trong shell, bạn truy xuất đến những tham số như sau :
myself là $0
one là $1
two là $2
Và biến $# (có sẵn trong shell) sẽ cho giá trị 2 (có 2 tham số one và two). Bạn có thể lấy tất cả các tham số bằng cách sử dụng biến $@ hoặc $*
10.Redirection
Hầu hết tất cả lệnh đều cho xuất kết quả ra màn hình hoặc lầy dữ liệu từ bàn phím nhưng vớI Linux bạn còn có thể xuất dữ liệu vào file và đọc dữ liệu từ file.
Ví dụ :
ls > filename # in kết quả lệnh ls vào file có tên filename.
Có 3 ký hiệu redirection là >, >> và <
(1). Ký hiệu >
cú pháp : linux-command > filename
Xuất output của lệnh ra file. Nếu file tồn tạI thì nó sẽ ghi đè còn nếu file chưa có thì tạo file mớI
(2). Ký hiệu >>
cú pháp : linux-command >> filename
Xuất output của lệnh vào cuốI file nếu file đã tồn tạI, còn nếu file chưa tồn tạI thì tạo file mới.
(3). Ký hiệu <
cú pháp : linux-command < filename
lấy dữ liệu cho linux-command từ filename thay vì từ bàn fím.
11.Pipe
Cú pháp : command 1 | command 2
Output của command 1 sẽ là dữ liệu vào của command 2
Ví dụ :
$who | grep root
MFUNs (còn tiếp ...)

| < Lùi | Tiếp theo > |
|---|
- 09/10/2009 17:02 - Ming A1200 Increase FM Presets
- 09/10/2009 17:01 - Ming A1200 Install MPKG
- 09/10/2009 17:00 - Ming A1200 Modify Volumetable
- 09/10/2009 16:59 - Ming A1200 Auto Network Time and Voicemail bug fix
- 09/10/2009 16:58 - Ming A1200 Overview
- 03/10/2008 13:13 - Shell script - Viết ứng dụng shell Phần 3
- 03/10/2008 13:11 - Shell script - Viết ứng dụng shell phần 2
MF me 



