L nh expr tính các đ i đ u vào nh m t bi u th c. Th ng expr đ c dùng tr ng vi c tính tốn các k t q a toán h c khi đ i giá tr t chu i sang s . Ví d :
x= “12" x= `expr $x + 1`
K t qu x=13. L u ý, c p d u ‘ ‘ b c bi u th c expr không ph i là d u nháy đ n (Ký t này là phím n m d i phím ESC và bên trái phím 1, chung v i phím ~. Các tốn h ng và toán t ph i cách nhau b ng kho ng tr ng. đây $x và 1 cách ký t + kho ng tr ng. N u đ chúng sát nhau, khi di n d ch shell s báo l i bi u th c.
D i đây là m t s bi u th c c l ng mà expr cho phép:
Bi u th c Ý ngh a axprl | expr2 K t qu là expr1 n u expr1 khác 0 ng c l i là
expr2
axprl & expr2 0 n u m t trong hai bi u th c là zero ng c l i k t qu là expr1
exprl = expr2 B ng
exprl >expr2 L n h n
exprl >= expr2 L n h n hay b ng
exprl < expr2 Bé h n
exprl <= expr2 Bé h n hay b ng exprl != expr2 không b ng
41 exprl - expr2 Tr
exprl * expr2 Nhân
exprl / expr2 Chia
exprl % expr2 Modulo (l y s d )
Trong các shell m i sau này l nh expr đ c thay th b ng cú pháp $ ( (. . . ) ) hi u qu h n, và s đ c p cú pháp này ph n sau.
3.6.10. printf
L nh printf c a shell t ng t printf c a th vi n C. M c dù v y, c b n printf c a shell có m t s h n ch sau: không h tr đnh d ng s có d u ch m đ ng (float) b i vì t t c các tính tốn c a shell đ u d a trên s nguyên. D u s \ dùng ch đnh các hi n th đ c bi t trong chu i (xem b ng d i). D u % dùng đnh d ng s và k t xu t chu i. D i đây là danh sách các ký t đ c bi t có th dùng v i d u \, chúng đ c là chu i thoát.
Chu i thoát (escape sequence) ý ngh a
\\ Cho phép hi n th ký t \ trong chu i
\a Phát li ng chng (beep) \b Xóa backspace \f y dòng \n Sang dòng m i \r V đ u dòng \t C n tab ngang \v c n tab d c \ooo Kí t đ n v i mã là ooo nh d ng s và chu i b ng ký t % bao g m Kí t đnh d ng Ý ngh a d S nguyên c Ký t s chu i % hi n th ký hi u % D i đây là m t s ví d v printf
$ printf "Your name %s. It is nice to meet you \n" NV An Your name NV An. It's nice to meet you .
$ printf “%s %d\t %s” “Hi There" “15” "people" Hi There 15 people
Các tham s c a l nh printf cách nhau b ng kho ng tr ng. Chính vì v y nên dùng d u “ “ đ b c các tham s chu i. L nh printf th ng đ c dùng thay th echo, m c đích đ in chu i khơng sang dịng m i. printf ch sang dịng m i khi thêm vào chu i thốt "\n".
42
3.6.11 return
L nh return dùng đ tr v giá tr c a hàm. L nh return không tham s s tr v mã l i c a l nh v a th c hi n sau cùng.
3.6.12 set
Tr c h t, l nh set dùng đ áp đ t giá tr cho các tham s môi tr ng nh $1, $2,
$3 ... L nh set s lo i b nh ng kho ng tr ng không c n thi t và đ t n i dung c a chu i truy n cho nó vào các bi n tham s . Ví d :
$ set This is parameter $echo $ 1
This
$echo $3
parameter
Tho t nhìn l nh set khơng m y ích l i nh ng nó s vơ cùng m nh m n u b n bi t cách s d ng.
Ví d l nh date c a linux phát sinh chu i sau: $da te
Fri March 13 16:06: 6 EST 2001
N u ch mu n l y v ngày, tháng ho c n m thì sao? set s th c hi n đi u này theo ví d sau:
Ví du 3-27 set_use.sh
#!bin/sh
echo Current date is $(date) set $(date)
echo The month is $2 echo The year is $6 exit 0
K t qu k t xu t
$./set_use.sh
Current date Fri March 13 16:06:16 EST 2001 The month is March
The year is 2001
L nh set còn đ c dùng đ đ t các thông s thi t l p cho shell. Ví d nh khi nói v l nh export, ta đã làm quen v i set -a ho c set –allexport, cho phép shell khai báo
bi n toàn c c cho m t bi n trong script. Khi tìm hi u và cách dị l i c a shell ph n sau, s có thơng s đ y đ h n v các thi t l p c a set.
43
v c a m t l nh dùng làm danh sách bi n. Chúng s đ c nêu chi ti t h n m c sau.
3.6.13. shift
L nh shift di chuy n n i dung t t c các tham s môi tr ng $1, $2 ... xu ng m t v trí. B i vì h u nh ta ch có t i đa 9 tham s t $1. $2. … $9, cho nên n u các shell c n nh n t 10 tham s tr lên thì sao? L nh shift dùng đ gi i quy t v n đ này.
N u g i $10 shell th ng hi u là $1 và '0'.
Ví d d i đây s in ra n i dung c a t t cá các tham s truy n cho script. S tham s có th l n h n 10. Ví d 3-28 using_shift.sh #!/bin/sh while [ "$1" != "" ]; do echo "$1" shift done exit 0 K t qu k t xu t
$./using_shift.sh here is a long parameter with 1 2 3 4 5 here is a long parameter . . . 5 6 Cách ch ng trình làm vi c:. Ch ng trình ti p nh n và in ra tham s dòng l nh ch b ng bi n $1. M i l n nh n đ c n i dung c a bi n, ta d ch chuy n các tham s v trái m t v trí, b ng cách này bi n $2 chuy n cho $1, $3 chuy n cho $2 ... vòng l p while ki m tra cho đ n khi nào $1 b ng r ng, có ngh a là khơng cịn tham s nào đ nh n n a thì d ng l i.
3.6.14. trap
L nh trap dùng đ b y m t tín hi u (signal) do h th ng g i đ n cho shell trong q trình th c thi script. Tín hi u th ng là m t thông đi p c a h th ng g i đ n ch ng trình u c u hay thơng báo v cơng vi c nào đó mà h th ng s th c hi n. Ví d INT th ng đ c g i khi ng i dùng nh n Ctrl-C đ ng t ch ng trình. TERM là tín hi u khi h th ng shutdown ... Chúng ta s đi sâu vào c ch c a vi c g i/nh n và x lý tín hi u
44 gi a ch ng trình và h th ng trong ph n sau.
V i trap trong script, ta đón và x lí m t s tín hi u th ng x y ra sau đây:
Tín hi u (signal) Ý ngh a
HUP (1) Hang-up. nh n đ c khi ng i dùng logout.
INT ( 2 ) Interrupt. Tín hi u ng t đ c g i khi ng i dùng nh n Ctrl-C.
QUIT ( 3 ) Tín hi u thốt, nh n khi ng i dùng nh n Ctrl-C 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 đùng x lý cho tình hu ng timeout
TERM (15) Terminate - Tín hi u nh n đ c khi h thơng u c u shutdown.
Tín hi u là các h ng đ c đnh ngh a trong t p tin signal.h. s d ng các h ng này trong các ch ng trình C, b n có th dùng #include <signal.h>. Mu n bi t chi ti t h n, b n có th dùng ngay l nh trap -l nh sau
$ trap -l