PDA

View Full Version : Cơ bản về Shell trên linux - [Tutorial]



Joker
11-04-2011, 10:07 PM
mới đây mình có nhập môn nghiên cứu lập trình shell trên linux, mới đọc ebook được mấy ngày và giờ muốn viết thành tut căn bản và dễ hiểu cho các bạn mới học như mình dễ làm quen :D

(bộ tut này tớ tổng hợp từ nhiều nguồn cả tài liệu tiếng anh lẫn tiếng việt với những ví dụ cụ thể nhất cho các bạn dễ tiếp cận.)

1 shell là gì ?

Shell là một chương trình thông dịch lệnh của một hệ điều hành, cung cấp cho người dùng khả năng tương tác với hệ điều hành bằng cách gõ từng lệnh ở chế độ dòng lệnh, đồng thời trả lại kết quả thực hiện lệnh lại cho người sử dụng. Shell cung cấp tập hợp các lệnh đặc biệt mà từ đó có thể tạo nên chương trình, khi đó được gọi là shell script. Ngoài các lệnh đơn giản của hệ thống Unix shell còn bổ sung thêm các cấu trúc phức tạp như điều khiển rẽ nhánh,vòng lặp. Trong MS-DOS thì shell chính là COMMAND.COM, trong Linux thì có nhiều loại shell khác nhau như sh, zsh, bash, csh... trong đó phổ biến nhất vẫn là bash shell (shell mặc định cho rất nhiều distro khác nhau).

có lẽ phần giới thiệu chỉ nên để ngắn gọn vậy thôi , bắt tay vào viết script đầu tiên ...

2. Hello world.

ở Tutorial này tớ sẽ cùng với các bạn làm việc với Bourne shell (mấy loại còn lại cũng không biết khác nhiều lắm không vì mới học mà :-P )
Script đầu tiên sẽ in ra màn hình câu "Hello World". Bạn có thể sử dụng một trình soạn thảo bất kì (tớ dùng gedit ) để gõ các dòng lệnh sau và lưu thành file (ở đây tớ đặt tên là shell).

+ ví dụ 1


#!/bin/sh
# in ra 1 dong
echo "Hello world"

Mặc định, file shell này chưa có quyền thực thi, tiến hành chmod cho file để có thể thực thi, các bạn đánh lệnh :
(bạn phải cd đến đúng thư mục chứa file shell trước khi đánh lệnh bênh dưới, VD ở bên máy tớ là cd /root/Desktop)


chmod u+x shell

bây giờ run thủ chương trình đầu tiên :D bạn chỉ cần đánh lệnh :


./shell

ok.

Giải thích :
_ Dòng đầu tiên là dòng đặc biệt, dùng để xác định loại shell được sử dụng và gọi chương trình thông dịch tương ứng.
_ Dòng thứ 2 bắt đầu bằng dấu # (cái này ý nghĩa khác ở dòng 1 nha) để chỉ 1 chú thích.
_ Dòng thứ 3 sử dụng echo để in ra màn hình 1 xâu ký tự, ngoài ra nó còn được sử dụng để in ra giá trị của biến. cấu trúc lệnh echo như sau :
echo [-n][xâu]
tham số được đặt trong [] ám chỉ việc tham số này có thể có hoặc không .
-n ở đây nếu có chương trình sẽ không bị ngắt xuống dòng sau khi in ra xâu.
ngoài ra bên trong xâu ký tự các bạn còn có thể sử dụng 1 số ký tự đặc biệt khác như :
\b lùi lại 1 ký tự (backspace tương tự như ở ngôn ngữ C).
\c khoong xuống dòng (giống -n).
\n xuống dòng.
\t in ra ký tự tab.
\\ in ra ký tù \.
\0n in ra ký tự có số n (số thập phân) trong bảng mã ASCII.

+ ví dụ 2

các bạn mở file mới hoặc có thể chép đè lên file shell cũ sau đó đánh script dưới đây vào :


#!/bin/sh
echo "file dang thuc thi : $0"
echo "so tham so : $#"
echo "cac tham so : $@"
echo "ten nguoi dung : $USER"
echo "noi dung file : " `cat $0`

run thử đoạn shell script trên với lệnh sau rồi xem kết quả:


./shell alo 123

(shell là tên file shell, alo 123 là tham số truyền vào.)
* nếu là file mới bạn lại phải chmod lại quền thực thi cho file nếu bạn chép đè nên file cũ thì việc đó chỉ cần làm 1 lần.

Giải thích :
_Dòng 1 : đọc lại ví dụ trên .
_Dòng 2,3,4,5 : Sử dụng các tham biến môi trường :
$0 : ở đây là tham biến chứa tên file.
$1... : chứa giá trị các tham số người dùng nhập vào.
$# : tham biến chứa số các tham số người dùng nhập vào.
$@ : liệt kê các tham số .
$USER : là tham biến môi trường chứa tên người dùng hiện tại.
_Dòng 6 : cat là 1 lệnh shell của hệ thống ỏ đây các bạn chú ý dấu `` khi muốn thực hiện 1 lệnh shell của hệ thống ta đặt nó + các tham số trong dấu ``. lệnh cat có tác dụng đọc 1 file và trả về nội dung file đó cat $0 nghĩa là đọc nội dung chính file đang thực thi.

____ Bên trên là 2 ví dụ khá đơn giản để in ra màn hình 1 chuỗi, in ra giá trị 1 số biến môi trường, và cách sử dụng lệnh hệ thống trong shell script.


Biến

Cũng như bất cứ ngôn ngữ lập trình nào, shell có thể sử dụng biến tuy nhiên không cần khai báo và định nghĩa kiểu ở ví dụ trên chúng ta đã sử dụng các biến được định nghĩa sẵn để in ra (0,1,#,@ ... ) .Với 1 biến chúng ta có thể gán và lấy giá trị của biến đó , VD 1 chúng ta có 1 biến với tên ten_bien, việc gán và lấy giá trị làm như sau :

ten_bien=<giá trị được gán ở đây có thể là 1 số, xâu hay 1 biến khác>
$ten_bien sẽ trả về giá trị mà biến này đang chứa( xem lại ví dụ 2 ).

* khi gán giá trị để ý khoảng cách giữa tên biến, dấu = và giá trị gán cho biến (bắt buộc phải liền nhau VD : ten_bien=0)
* chỉ khi lấy giá trị của biến chúng ta mới sử dung dấu $ ở trước tên biến.

Để làm quen với cách sử dụng biến chúng ta cùng thực hiện VD dưới đây.

+ Ví dụ 3:


#!/bin/sh
strPath=`pwd`
echo -n "Nhap vao ten cua ban : "
read name
echo "chao $name ban dang thuc thi file $0 o thu muc $strPath"

run thử đoạn script trên rồi tự rút ra cách sử dụng biến trong shell .

Giải thích :
+ dòng 2 : khai báo 1 biến strPath và gán cho nó giá trị của câu lệnh pwd (trả về thư mục chứa file thực thi)
+ dòng 4 : lệnh read được dùng để đọc giá trị người dùng nhập vào từ bàn phím sau đó gán cho biến name.

end . ở Tutorial 1 này chúng ta đã hiểu được shell là gì, thực thi lệnh hệ thống trong shell, vào ra trong shell (read/echo) và hiểu cách khai báo sử dụng 1 biến trong shell. ở Tutorial 2 tớ sẽ đi tiếp đến cấu trúc các lệnh rẽ nhánh, vòng lặp trong shell sẽ kèm theo nhiều ví dụ hơn cho dễ hiểu :D.


Lần đầu tiên viết tut ... các anh, chị và các bạn cho ý kiến ... để tớ rút kinh nghiệm và hoàn thiện bộ tut sao cho dễ hiểu nhất và dễ tiếp cận .
p/s : có sai chỗ nào các bạn sửa dùm :D

Joker

Joker
11-04-2011, 10:29 PM
Tutorial 2 ( lấy chỗ cho bài 2 :-P)

Joker
11-04-2011, 10:31 PM
Tutorial 3 ( lấy chỗ cho bài 3 :-P)

qhhqnavy
10-06-2011, 11:00 PM
Sao không thấy anh hai viết gì cho mấy bài Tutorial 2, Tutorial 3 vậy ????

tetuongrua
11-06-2011, 11:43 AM
sao không viết tiếp đi bạn.mình cũng đang muốn tìm hiểu.cám ơn bạn nhiều.

panfider1
23-06-2011, 03:41 PM
câu lệnh if
if [ $# -ge 2 ]; then
### do somethings
else
### do other things
fi
câu lệnh for
for file in *;do
### somthing happen here;
done