Friday, February 11, 2011

Tóm tắt Linux Shell Programming

Tạo file script 

* Soạn thảo file text, đặt tên file shellfile (có đuôi bất kỳ), dòng đầu tiên có dòng sau: #!/bin/sh, sau đó là các lệnh Shell hoặc các lệnh Linux. 
* Chạy các lệnh sau để có thể chạy được chmod +x shellfile , sau đó có thể chạy bằng lệnh ./shellfile 

Ý nghĩa các ký tự

* Bắt đầu bằng dấu '#'- ký hiệu rằng dòng đấy là comment. 
* Dấu ngoặc đơn 'a' sẽ in nguyên văn đoạn text trong ngoặc. 
* Dấu "a", sẽ in nguyên văn đoạn text, trong đó biến có thể được thay giá trị. 

Các biến 

* Biến không cần phải khai báo trước, bắt đầu bằng chữ cái (ví dụ là var), khi tham chiếu thì thêm dấu $ ở trước, ví dụ $var. (gán var=2; thì khi echo $var, sẽ cho kết quả là 2). 

* có thể dùng biến và nối với ký tự như sau: ${var}nd thì kết quả trả về 2nd. 

Pipes, redirection and backtick 

* pipes (|) gửi đầu ra output (stdout) của một tiến trình sang đầu vào (stdin) của mộ tiến trình khác. 

grep "hello" file.txt | wc -l

* redirection: ghi đầu ra output của mọt chương trình ra một file khác hoặc nối vào file khác 
> ghi ra file, nếu nó đã tồn tại thì ghi đè nó 
>> Nối vào file cũ nếu đã tồn tại hoặc nếu chưa có thì tạo ra file mới và ghi dữ liệu vào đó. 

* Backtick 
Đầu ra của một chương trình được sử dụng làm tham số cho chương trình khác (không phải như đầu vào stdin như ở trên) cho một lệnh khác. Bạn cũng có thể dùng đầu ra output như là biến, tham số của chương trình khác. 

Lệnh 

find . -mtime -1 -type f -print 

sẽ tìm tất cả các file được thay đổi trong vòng 24 giờ qua (-mtime -2 sẽ là 48). Nếu bạn muốn nén lại thành một file để lưu trữ thì lệnh có thể được sử dụng như: 

tar xvf file.tar infile1 infile2 ... 

Bạn có thể gộp hai lệnh đó và dùng dấu (`), không phảit dấu ngoặc đơn ('): 

#!/bin/sh 
# Sử dụng dấu (`) không phải dấu ('): 
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print` 

Lệnh có cấu trúc 

* Lệnh "if": kiểm tra điều kiện đúng : 

if ....; then 
    .... 
    elif ....; then 
    .... 
    else 
    .... 
fi 

* Lệnh "test" thường được viết như " [ ] ". Lưu ý là phải có dấu cách sau và trước dấu "[ ]". 

Ví dụ: 

[ -f "somefile" ] : Test if somefile is a file. 
[ -x "/bin/ls" ] : Test if /bin/ls exists and is executable. 
[ -n "$var" ] : Test if the variable $var contains something 
[ "$a" = "$b" ] : Test if the variables "$a" and "$b" are equal 

Gõ lệnh "man test" để có thêm các tham số. 

* Gõ tắt bằng các dấu && và ||: 

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors" 

Dấu && được sử dụng như điều kiện và. Trong ví dụ trên : "Nếu /etc/shadow tồn tại và (AND) lệnh echo sẽ được thực hiện". Toán tử OR ) cũng được sử dụng như ví dụ sau: 

#!/bin/sh 
mailfolder=/var/spool/mail/james 
[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; } 
echo "$mailfolder has mail from:" 
grep "^From " $mailfolder 

Nếu có thư thì hiện các thư, còn không thì thông báo là không đọc được và kết thúc. 

* Lệnh Case: kiểm tra thoả mãn (using shell wildcards such as * and ?). 

case ... in 
    ...) do something here;; 
esac

Ví dụ chúng ta có thể viết một chương trình smartzip có thể giải nén một cách tự động với các dạng: 

#!/bin/sh 
ftype=`file "$1"` 
case "$ftype" in 
    "$1: Zip archive"*) 
    unzip "$1" ;; 
    "$1: gzip compressed"*) 
    gunzip "$1" ;; 
    "$1: bzip2 compressed"*) 
    bunzip2 "$1" ;; 
*) error "File $1 can not be uncompressed with smartzip";; 
esac

Ở đây $1 là tham số (có thể đến $9, $* là tất cả các tham số) ví dụ 
smartzip articles.zip. 

* Lệnh select được sử dụng để tương tác lựa chọn các phương án khác nhau: 

select var in ... ; do 
    break 
done 
.... now $var can be used .... 

Ví dụ: 

#!/bin/sh 
echo "What is your favourite OS?" 
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do 
    break 
done 
echo "You have selected $var" 

Chương trình sẽ in ra màn hình: 

What is your favourite OS? 
1) Linux 
2) Gnu Hurd 
3) Free BSD 
4) Other 
#? 1 
You have selected Linux 

* Lệnh while-loop 

while ...; do 
    .... 
done 

* Lệnh for-loop 

for var in ....; do 
    .... 
done 

Nguồn : http://vkopensource.blogspot.com/

No comments:

Post a Comment