CHƯƠNG 3 - LẬP TRÌNH SHELL LINUX

Màu nền
Font chữ
Font size
Chiều cao dòng

CHƯƠNG 3 - LẬP TRÌNH SHELL LINUX


Mục đích
 Cung cấp kiến thức về lập trình shell linux


Nội dung
• Giải thích về shell Linux
• Cú pháp viết tập tin shell


Giới thiệu Shell Linux
•   Máy tính hiểu ngôn ngữ dưới dạng nhị phân.
•   Shell là chương trình thông dịch tiếp nhận các chỉ thị hoặc các lệnh và dịch ra ngôn ngữ máy dưới dạng nhị phân.
•   Shell diễn dịch các tham số dòng lệnh sau đó triệu gọi các hàm của hệ điều hành thực hiện một yêu cầu cụ thể nào đó.
•   Shell thực hiện chuyển đổi các lệnh của người sử dụng thành các lệnh đối với hệ điều hành.


Quá trình thực hiện của Shell
Your command Or Shell Script

Linux Shell
Converted to Binary language by Shell
Now Linux kernel understand your request


Các loại Shell
sh
csh, tcsh, zsh
bash
(Bourne shell) shell nguyên thủy áp dụng cho unix
(C Shell, Z shell) shell sử dụng cấu trúc của C làm ngôn ngữ kịch bản.
(Bourne Again shell) shell chủ yếu của Linux.
rc           Shell mở rộng của csh với nhiều tương thích với ngôn ngữ C hơn.
shell script : Kịch bản cho phép thực hiện một dãy lệnh liên tiếp. Tương tự tập tin bó (batch file) trong MS-DOS.


Tạo Shell script ?
•   Chương trình shell là một tập tin văn bản chứa một số lệnh shell hoặc lệnh của Linux.
•   Chương trình Shell cho phép tự động hóa một công việc , hoặc viết các ứng dụng tương tác đơn giản.
•   Tập tin shell : *.sh. Dùng lệnh cat file.sh hoặc vi file.sh hoặc gedit file.sh để soạn thảo tập tin Shell. (có thể dùng những chương trình soạn thảo khác: emacs,…)


script file
Chương trình shell remount.sh cho phép tự động kết nối lại ổ đĩa CDROM :
#!/bin/sh
umount /dev/cdrom
mount /dev/cdrom /cdrom
exit 0
•   Chú thích trong shell thường bắt đầu bằng ký tự #.
•   #!/bin/sh : chỉ thị yêu cầu shell hiện tại triệu gọi shell sh nằm trong thư mục bin.
•   Shell sh sẽ chịu trách nhiệm thông dịch các lệnh nằm trong tập tin script.
•   #! còn được dùng để triệu gọi một chương trình shell khác mà NSD muốn chạy trước khi script tiếp theo được diễn dịch.
•   exit 0 – script thực thi thành công và thoát khỏi shell sh đã gọi nó


Thực thi shell script
$gedit vidu.sh
#!/bin/bash
echo "Vi du shell"
a=10
b='expr $a + 5' echo "Tong = $b" exit 0
•   Cách 1 :       $chmod u+x vidu.sh
$./vidu.sh
•   Cách 2 :       $/bin/bash ./vidu.sh


CÚ PHÁP NGÔN NGỮ SHELL
Gồm những vấn đề chính sau:
•Biến:kiểu chuỗi, kiểu số, tham số, biến môi trường
•Điều kiện: kiễm tra để trả về true hoặc false
•Cấu trúc điều khiển chương trình:if, elif, for, while, until, case
•Danh sách
•Hàm
•Các lệnh nội tại của shell
•Lấy về kết quả của 1 lệnh


Dùng biến
•   Shell không cần phải khai báo biến trước khi sử dụng. Biến sẽ được tự động tạo ra và khai báo khi lần đầu tiên biến xuất hiện như trong phép gán.
•   Mặc định tất cả các biến đều nhận giá trị kiểu chuỗi (String).
•   Shell phân biệt chữ hoa chữ  thường. Thông thường tham số dòng lệnh thường cách nhau bằng khoảng trắng.
•   Nếu tham số chứa cả khoảng trắng (ký tự spacebar, tab hoặc ký tự xuống dòng) thì phải bọc trong cặp nháy đơn ' ' hoặc nháy kép " "
•   Lấy về nội dung của biến : $varname
•   Khi gán nội dung cho biến varname=value
  Lưu ý sau dấu = không được có khoảng trắng.
•   Hiển thị nội dung biến : echo $varname
•   Đọc dữ liệu nhập vào : read varname
#!/bin/sh
x=5
y=10
echo “gia tri cua x la: $x”
echo “gia tri cua y la: $y”
echo “hay nhap mot chuoi tu ban phim”
read input
echo “chuoi ban vua nhap la: $input”
exit 0


Biến môi trường
Khi khởi động shell cung cấp một số biến được khai báo và gán giá trị mặc định gọi là biến môi trường.
$HOME    chứa nội dung của thư mục.
$PATH      chứa danh sách các đường dẫn.
$PS1          dấu nhắc hiển thị trên dòng lệnh ($)
$PS2          dấu nhắc hiển thị trên dòng lệnh (>)
$IFS          dấu phân cách các trường trong danh sách chuỗi.
$0               chứa tên chương trình gọi trên dòng lệnh.
$#               Số tham số truyền trên dòng lệnh.
•   Mỗi môi trường đăng nhập chứa một số danh sách biến môi trường dùng cho mục đích riêng.
•   Có thể xem danh sách này bằng lệnh evn
•   Để tạo một biến môi trường mới có thể dùng lệnh export
•   Sử dụng lệnh exit trước khi kết thúc chương trình shell.


Biến tham số (parameter variable)
Dùng để nhận tham số trên dòng lệnh
$1, $2, $3, . . .     : vị trí và nội các tham số trên dòng lệnh theo thứ tự từ trái sang phải
$0     : từ đầu tiên của lệnh được gõ, là tên chương trình shell
$*     : các tham số trên dòng lệnh được lưu thành 1 chuỗi được phân cách bằng ký tự đầu tiên qui định trong IFS
"$@"        : lưu danh sách các tham số dòng lệnh thành chuỗi, không sử dụng phân cách của biến IFS
$#     : Tổng số tham số trên dòng lệnh.
$?     : Lưu mã trả về của lệnh cuối cùng được thực hiện.


Toán tử số học
Operator
Operation
+                  (Addition) Phép cộng
-                   (Subtraction) Phép trừ
/                   (Division) Phép chia
%                  Modulus Operator (Remainder)
Phép chia lấy dư
\* , *
(Multiplication) Phép nhân
Định lượng giá trị biểu thức
•   Lệnh expr được dùng trong việc tính toán các kết quả toán học đổi giá trị từ chuỗi sang số.
•   Ví dụ : 
x="14"
x='expr $x + 1'  
kết quả x = 15
•   Trong các lệnh shell sau, có thể dùng $((…)) thay cho lệnh expr.
x=$(($x + 1))
Ví dụ :
#!/bin/sh y=0
while [“$y” -le 15 ]; do
echo $y y=$(($y+1))‏
done exit 0
Đoạn lệnh trên sẽ liên tục in ra 16 số nguyên (015)‏

So sánh toán học
Toán tử so sánh                      

Giải thích
expr1 -eq expr2         true nếu hai biểu thức bằng nhau
expr1 -ne expr2         true nếu hai biểu thức không bằng
expr1 -gt expr2         true nếu biểu thức expr1> expr2
expr1 -ge expr2         true nếu biểu thức expr1>=expr2
expr1 -lt expr2          true nếu biểu thức expr1<expr2
expr1 -le expr2          true nếu biểu thức expr1<=expr2
! expr                         true nếu expr1 là false (toán tử not)

So sánh chuỗi
So sánh                                   Kết quả
string1 = string2       true nếu hai chuỗi bằng nhau
string1 != string2      true nếu hai chuỗi không bằng nhau
-n string1                   true nếu string1 không rỗng (null)
-z string1                    true nếu string1 rỗng
Chú ý :            $str1=$str2
khác với          $str1 = $str2


Kiểm tra điều kiện trên tập tin
So sánh                      Kết quả
-d file              true nếu file là thư mục
-e file              true nếu file tồn tại trên đĩa
-f file               true nếu file là tập tin thông thường
-g file              true nếu set group id được thiết lập trên file
-r file               true nếu file cho phép đọc
-s file              true nếu kích thước file khác không
-w file             true nếu file cho phép ghi
-x file              true nếu file được phép thực thi


Biểu thức điều kiện
•   Các script sử dụng lệnh [] hoặc test để kiểm tra điều kiện boolean.
•   Thường được sử dụng để đánh giá một điều kiện trong một câu lệnh điều kiện hay của một câu lệnh lặp.
•   Cú pháp :                test bieuthuc
Hay            [ bieuthuc ]
•   Có thể dùng các toán tử sau với biểu thức điều kiện : toán tử trên xâu ký tự, toán tự trên số nguyên, toán tử trên tập tin, toán tử logic


Toán tử AND
Lệnh sau thực hiện khi lệnh trước đã thực thi và trả về một lỗi thành công.
statements1 && statements2 && statements3 &&. .
Ví dụ : #!/bin/sh
touch file_one
rm -f file_two
if [ -f file_one ] && echo “hello”
&& [ -f file_two ] && echo “there”
then
echo “in if”
fi
exit 0


Toán tử OR
Toán tử OR trả về giá trị true thì ngừng việc thực thi.
Cú pháp :
statements1 || statements2 || statements3. . .


Cấu trúc điều kiện - Lệnh if
Cú pháp:
if condition then
statements else
statements fi
#!/bin/sh
echo “result: 5 + 4 = ”
read num
if [ “$num” -eq 9 ]
then
echo “true”
else
echo “wrong, 5 + 4 = 9”
fi

Cấu trúc điều kiện - Lệnh elif
elif cho phép kiểm tra điều kiện lần thứ hai bên trong else.
#!/bin/sh
echo “Nhap thoi diem trong ngay : ”
read st
if [ $st = “sang” ]; then
echo “Chao buoi sang !”
elif [ $st = ”chieu” ]; then echo “Chao buoi chieu !”
else
fi
echo “Chua xu ly !”
exit 1
exit 0


Lệnh for
Cú pháp:
for variable in values
do
#!/bin/sh
for stVar in 1 2 3 4 5 6
do
statements
done
done
exit 0
echo $stVar


Lệnh while
Cú pháp:
while condition do statements
done
Check condition
True
ACTION
End of the loop
False

• Ví dụ 1:
S=0 i=0
while [ $i  –lt  5 ]
do
i='expr $i + 1'
S='expr $S + $i'
done
echo “Tong = $S”

• Ví dụ 2:
#!/bin/sh
echo “Nhap mat khau:”
read pass
while  [  $pass  !=
"123abc" ]
do
read pass done
exit 0


Lệnh until
Cú pháp:
until
condition
do statements
done
True
Check condition
False
ACTION
End of the loop

Ví dụ: Đếm số tham số của 1 dòng lệnh
until [ $# -eq 0 ]
do
num='expr $num + 1'
echo “The $num argument is $1”
shift done


Lệnh case
Cú pháp:
case value in
pattern1 | pattern11)       command(s);; pattern2) command(s);; pattern3) command(s);; pattern4)       command(s);;
*)                            ;;
esac
#!/bin/sh
echo “is it morning ? yes or no”
read timeofday
case “$timeofday” in
“yes”) echo “good morning”;; “no” ) echo “good afternoon”;; “y” ) echo “good morning”;; “n” ) echo “good afternoon”;;
* )    echo “answer not recognized”;;
esac exit 0


Khối lệnh { . . . }
Sử dụng cặp {} để bọc khối lệnh :
if [ -f file_one ] {
ls -1
echo “complex block execute “
}
then
#echo “command completed”
fi


function
Shell cung cấp cho NSD tự tạo hàm hay thủ tục để triệu gọi bên trong script.
Cú pháp định nghĩa hàm :
function_name() {
statements
}
Để trả về một giá trị số ta có thể dùng lệnh return :
Ví dụ : sum1() {
return 5
}
Để trả về giá trị chuỗin ta có thể dùng lệnh echo :
Ví dụ : #!/bin/sh
sample_func() {
x=5
echo “Insight sample_func!”
}
echo “Goi su dung ham sample_func”
echo $x
sample_func
# y=$(sample_func)‏
exit 0


Biến toàn cục và biến cục bộ
•   Để khai báo biến cục bộ có hiệu lực trong hàm, dùng từ khóa local.
•   Nếu không có từ khóa local, các biến được xem là biến toàn cụ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 script.
#!/bin/sh
sample_text=”global variable”
fun1() {
local sample_text=”local variable” echo “function fun1 is executing” echo $sample_text
}
echo $sample_text fun1
echo “script ended”
echo $sample_text exit 0


Hàm và cách truyền tham số
•   Truyền tham số cho hàm tương tự như truyền tham số trên dòng lệnh.
•   Ví dụ :
function1() "param1","param2","param3". . .
•    Bên trong hàm sử dụng các biến môi trường: $0, $1, $2 để lấy giá trị các tham số truyền vào


Các lệnh nội tại của shell
Ngoài các lệnh điều khiển, shell cung cấp các lệnh nội tại hữu ích khác.
break :      break để thoát khỏi vòng lặp for, while hay until.
continue : lệnh continue yêu cầu vòng lặp quay 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.
: (lệnh rỗng) lệnh : đôi lúc được dùng với ý nghĩa logic là true.
Ví dụ : while : tương tự như while true.
. ( thực thi) dùng để thực thi một script trong shell hiện hành.
•   eval : Cho phép bạn ước lượng một biểu thức chứa biến.
•   exec : Dùng để gọi một lệnh bên ngoài khác. Thường exec gọi một shell khác với shell mà script đang thực thi.
•   exit n : Thoát khỏi shell nào gọi nó và trả về lỗi n.
•   set : Dùng để áp đặt giá trị cho các tham số.
•   unset : Dùng để loại bỏ biến khỏi môi trường shell
•   shift : Di chuyển nội dung tất cả các tham số môi trường xuống một vị trí.
trap : 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                       Ý nghĩa
HUP (1)     hang up nhận được khi người dùng logout
INT (2)      interupt tín hiệu ngắt được gửi khi người dùng nhấn  ctrl c
QUIT (3)   quit tín hiệu thoát, nhận khi người dùng nhấn ctrl \
ABRT (6)        (abort)  tín  hiệu  chấm  dứt,  nhận  khi  đạt  thời gian quá hạn (timeout)
ALRM (14)    (alarm) tín hiệu thông báo được dùng cho tình huống timeout
TERM (15)     (terminate)  tín  hiệu  nhận  được  khi  hệ  thống yêu cầu shutdown


Mở rộng tham số
•       Shell không cung cấp cấu trúc mảng.
•       Có thể thay thế tên biến, còn gọi là mở rộng tham số.
Ví dụ :       #!/bin/sh
1_tem=“string 1”
2_tem=“string 2”
3_tem=“string 3”
for i in 1 2 3 do echo ${i}_tem
done
exit 0
Kết thúc

Bạn đang đọc truyện trên: Truyen2U.Pro