LINUX, Lp trình shell
________________________________________________________________________ 1
UNIX/Linux
LP TRÌNH TRONG MÔI TRNG SHELL
1. Shell ca UNIX/LINUX
2. S DNG SHELL NH NGÔN NG LP TRÌNH
2.1. iu khin shell t dòng lnh
2.2. iu khin shell bng tp tin kch bn (script file)
2.3. Thc thi script
3. CÚ PHÁP NGÔN NG SHELL
3.1. S dng bin
3.1.1. Các kí t đc bit (Metalcharacters ca Shell)
3.1.1.1 Chuyn hng vào/ra
3.1.1.2 Các kí t đc bit kim soát tin trình
1.& (Ampersand)
2.Ngoc đn ( ; )
3. Du nháy ` ` (backquotes)
4.ng dn (Pipelines)
3.1.1.3 Du bc chui (quoting)
1.Backslash (\)
3.1.2. Biên môi trng (environment variable)
3.1.3. Bin tham s (parameter variable)
3.2. iu kin
3.2.1. Lnh test hoc [ ]
3.6.7. exit n
3.6.8. export
3.6.9 Lnh expr
3.6.10. printf
3.6.11 return
3.6.12 set
3.6.13. shift
3.6.14. trap
3.6.15. unset
3.7. Ly v kt qu ca mt lnh
3.7.1. c lng toán hc
3.7.2. M rng tham s
3.8. Tài liu Here
4. DÒ LI (DEBUG) CA SCRIPT
5. HIN TH MÀU SC (COLOR)
5.1. Màu ch
5.2. Thuc tính vn bn
5.3. Màu nn
6. XÂY DNG NG DNG BNG NGÔN NG SCRIPT
6.1. Phn tích yêu cu
6.2. Thit k ng dng
7. KT CHNG
8. MT S TÓM TT
8.1 To và chy các chng trình shell
8.1.1 To mt chng trình shell
8.1.2 Chy chng trình shell
Cách th nht là vit ra các chng trình mà các chng trình này bit cách to ra tin
trình (C/C++). Tuy nhiên cách này đòi hi nhiu hiu bit và n lc. Cng nh các h
điu hành làm vic kiu o khác, Unix h tr mt phng tin x lí lnh làm giao din
gia lnh máy (mà ngi dùng đa vào) và vic thc thi ca lnh đó (bi Unix). Phng
tin đó gi là shell. T khi ra đi Unix đã có vài kiu shell, đó là Bourne, C, Korn shell.
Thc ra shell làm gì ? Tòan b mc đích ca shell là đ khi đng các tin trình x lí
lnh đa vào: yêu cu đa (dòng) lnh vào, đc đu vào, thông dch dòng lnh đó, và to
ra tin trình đ thc hin lnh đó. Nói cách khác shell quét dòng lnh đa vào máy tính,
cu hình môi trng thc thi và to tin trình đ thc hin lnh. Hình 2: V trí ca shell khi “thc hin” lnh ca ngi dùng Shell dch các
lnh nhp vào thành li gi h thng, chuyn các ký hiu dn hng >, >>
hay | thành d liu di chuyn gia các lnh. c các bin môi trng đ
tìm ra thông tin thc thi lnh.
Nh vy tìm hiu shell thc t là hc mt ngôn ng lp trình, cho dù không phc
tp nh C, hay các ngôn ng khác, nhng cng phi qua nhng đòi hi cn thit. Trong
Unix/Linux có các lai shell khác nhau và có th la chn đ dùng theo nhu cu mà
ngi dùng thy phù hp. Hình 2 là mô hình tng tác gia các shell, chng trình ng
dng, h X-Window và ht nhân.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 5Cac ung
H thng cung cp cho ngi dùng rt nhiu chng trình shell. Mi shell có mt
s tin ích nh h tr ch đ gõ phím, ghi nh lnh. Kt hp các tin ích ca shell đ to
ra mt chng trình chy đc, thì mt chng trình nh vy đc lu di dng mt
tp, gi là tp kch bn (script, hãy th m mt tp nh vy và quan sát cu trúc ca tp).
Vit đc mt tp script, thc cht là đã lp trình theo shell. Mt khi đã quen thuc vi
mt shell và cách hot đng ca shell đó, ngi dùng có th làm ch đc các shell khác
mt cách đ dàng.
Các shell trên Unix/Linux:
sh ( Bourne ) shell nguyên thy áp dng cho Unix
Csh, tcsh và zsh dòng shell s d
ng cu trúc lnh ca C làm ngôn ng kch bn.
c to ra đu tiên bi Bia Joy. Là shell thông dng th hai sau
bash shell.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 6
bash shell ch yu ca Linux. Ra đi t d án GNU. bash (Vit tt ca
Bourne Again Shell có li đim là mã ngun đc công b rng
rãi. Nu bash cha có sn trong h thng Unix hay Linux, hãy ti
v, biên dch và s dng min phí ti đa ch www.gnu.org
rc shell mô rng ca csh vi nhiu tng thích vi ngôn ng C hn.
rc cng ra đi t d án GNU.
Shell chun thng đc các nhà phân phi Linux s dng hin nay là bash shell. Khi cài
if grep -l 'main( ) ' $file
then
more $fle
fi
done
Khi gõ mt lnh cha hoàn chnh t du nhc ca shell, shell s chuyn du nh
c thành
>, shell ch nhp đy đ các lnh trc khi thc hin tip. Shell t trng hiu đc khi
nào thì lnh bt đu và kt thúc. Trong ví d trên lnh for . . . do s kt thúc bng done.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 7
Khi gõ xong done, shell s bt đu thc thi tt c nhng gì đã gõ vào bt đu t for.
đây, file là mt bin ca shell, trong khi * là mt tp hp đi din cho các tên tp tìm thy
trong th mc hin hành.
Bt tin ca vic điu khin ngôn ng shell t dòng lnh là khó ly li khi lnh
trc đó đ sa đi và thc thi mt ln na. Nu ta nhn phím Up/Down thì shell có th
tr li khi lnh nh sau:
$ for file in * ; do ; if grep -1 'main( )’ $file;
then ; more $file; fi; done
ây là cách các shell Linux vn thng làm đ cho phép thc thi nhiu lnh cùng lúc
ngay trên dòng lnh. Các lnh có th cách nhau bng du (;). Ví d:
$ mkdir myfolđer; cd myfolder;
s to th mc myfolder bng lnh mkdir sau đó chuyn vào th mc này bng lnh cd.
Ch cn gõ Enter mt ln duy nht đ thc thi hai lnh cùng lúc. Tuy nhiên sa cha các
khi lnh nh vy không d dàng và rt d gây li. Chúng ch thun tin cho kt hp
Có th ch đnh #!/bin/bash làm shell thông dch thay cho sh, vì trong Linux tht ra
sh và bash là mt. Tuy nhiên nh đã nêu, trên các h Unix vn s dng shell sh làm
chun, vì vy vn là mt thói quen tt cho lp trình viên nu s dng shell sh. Khi
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 8
tip cn vi UNIX, ta s cm thy quen và thân thuc vi shell này hn. Nên chy
script trong mt shell ph (nh gi sh chng hn), khi đó mi thay đi v môi
trng mà script gây ra không nh hng đn môi trng làm vic chính.
Ch th #! Còn đc dùng đ gi bt kì chng trình nào ta mun chy trc khi script
tip theo đc dch. Lnh exit bo đm rng script sau khi thc thi s tr v mã li, đây là
cách mà hu ht các chng trình nên làm, mc dù mã li tr v ít khi đc dùng đn
trong trng hp thc hin tng tác trc tip t dòng lnh. Tuy nhiên, nhn bit mã tr
v ca mt đon script sau khi thc thi, li thng rt có ích nu bn triu gi script t
trong mt script khác. Trong đon chng trình trên, lnh exit s tr v 0, cho bit script
thc thi thành công và thoát khi shell gi nó. Mc dù khi đã lu tp tin script vi tên .sh,
nhng UNIX và Linux không bt buc điu này. Him khi Linux s dng phn đuôi m
rng ca tp tin làm du hiu nhn dng, do đó tp tp script có th là tùy ý. Tuy vy .sh
vn là cách chúng ta nhn ngay ra mt tp tin có th là script ca shell mt cách nhanh
chóng.
2.3. Thc thi script
Chúng ta va to ra tp tin script first.sh, nó có th đc gi thc thi theo 2 cách.
Cách đn gin nht là triu gi trình shell vi tên tp tin script làm đi s. Ví d:
________________________________________________________________________ 9
Mt khi bn tin rng first.sh chy tt, có th di chuyn nó đn th mc khác thích
hp hn th mc hin hành. Nu lnh script ch dành cho mc đích riêng ca bn, bn có
th to ra th mc /bin trong th mc ch (home) mà nhà qun tr qui đnh cho ngi
dùng, sau đó thêm đng dn này vào bin môi trng PATH. Nu mun script đc gi
bi ngi dùng khác, hãy đt nó vào th mc /usr/1ocal/bin. Thông thng, đ cho phép
mt script hay chng trình thc thi, cn đc ngi qun tr cho phép. Nu bn là nhà
qun tr, cng cn cn thn xem xét các script do các ngi dùng khác (hacker chng hn)
đt vào h thng. Ngôn ng script rt mnh, nó có th làm đc hu nh là mi chuyn
k c hy dit h thng!
ngn script ca b sa đi bi ngi dùng khác, có th s dng các lnh thit
lp quyn (thng phái đng nhp vi t cách root đ làm công vic này):
#cp first.sh /usr/1ocal/bin
#chown root /usr/local/bin/first.sh
#chgrp root /usr/1ocal/bin/first.sh
#chmod u=rwx go=rx /usr/1ocal/bin/firsc.sh
on lnh trên mang ý ngha: chuyn quyn s hu tp tin cho root, root đc toàn
quyn đc sa ni dung và thc thi tp tin, trong khi nhóm và nhng ngi dùng khác
root ch đc phép đc và thc thi. Nên nh mc dù b
n loi b quyn ghi w trên tp tin,
UNTX và Linux vn cho phép bn xoá tp tin này nu th mc cha nó có quyn ghi w.
an toàn, vi t cách là nhà qun tr, nên kim tra li th mc cha script và bo đm
rng ch có root mi có quyn w trên th mc cha các tp .sh
phép gán. Mc đnh, tt c các bin đu đc khi to và cha tr kiu chui (string).
Ngay c khi d liu mà bn đa vào bin là mt con s thì nó cng đc xem là đnh
dng chui. Shell và mt vài lnh tin ích s t đng chuyn chui thành s đ thc hin
phép tính khi có yêu cu. Tng t nh bn thân h điu hành và ngôn ng C, cú pháp
ca shell phân bit ch hoa ch thng, bin mang tên foo, Foo, và FOO là ba bin khác
nhau.
Bên trong các script ca shell, bn có th ly v ni dung ca bin bng cách dùng
du $ đt trc tên bin. hin th ni dung bin, bn có th dùng lnh echo. Khi gán
ni dung cho bin, bn không cn phi s dng ký t $. Ví d trên dòng lnh, bn có th
gán ni dung và hin th bin nh sau:
$ xinahao=hello
$ echo $xinchao
Hello
$ xin chao= "I am here"
$echo $xin chao
I am here
$ xinchao=12+l
$echo $xin chao
12+1
Lu ý, sau du = không đc có khong trng. Nu gán ni dung chui có khong
trng cho bin, cn bao bc chui bng du “ “.
Có th s
dng lnh read đ đc nhp liu do ngi dùng đa vào và gi li trong bin
đ s dng. Ví d:
$ read yourname
XYZ
$echo "Hello " $yourname
Hello XYZ
$date > login.time
Lnh date không kt xut ra đu ra chun (stdout) mà ghi vào tp login.time. >login.time
không phi là thành phn ca lnh date, mà đn gin mô t tin trình t
o và gi kt xut
đâu (bình thng là màn hình). Nhìn theo cách x lí thì nh sau: c cm lnh trên cha
hai phn: lnh date, tc chng trình thc thi, và thông đip (>login.time) thông báo cho
shell bit kt xut lnh s đc x lí nh th nào (khác vi mc đnh. Bn thân date cng
không bit chuyn kt xut đi đâu, shell chn mc đnh).
Ví d:
$cat < file1
Bình thng cat nhn và hin th ni dung tp có tên (là đi đu vào). Vi lnh trên cat
nhn ni dung t file1 và kt xut ra màn hình. Thc cht không khác gì khi gõ:
$cat file1.
Hãy xem:
$cat < file1 > file2
Lnh này thc hin nh th nào ? Theo trình t s nh sau: cat nhn ni dung ca file1
sau đó ghi vào tp có tên file2, không đa ra stdout nh mc đnh. Lnh cho thy ta có
th thay đi đu và đu ra cho lnh nh th nào. Nhng lnh cho phép đi đu ra/vào gi
chung là qúa trình lc (filter).
Ví d:
$cat file1 < file2
Lnh này ch hin th ni dung ca file1, không gì hn. Ti sao ? cat nhn đi đu vào là
tên tp. Nu không có đi nó nhn t stdin (bàn phím). Có đi thì chính là file1 và đu ra
là stdout. Trng hp này gi là b qua đi hng. Cái gì đây là quan trng ? u
ra/vào ca lnh đã đi hng cng không có ngha là s bo đm rng s đi hng s
đc s dng Mt ln na cho thy lnh bn thân nó không hiu rng đã có s đi hng
và có lnh chp nhn đi hng vào/ra, nhng không phi tt c. Ví d
$date < login.time
Xin chao
…
đây EOF là du hiu đánh du, hay còn gi là th bài (token). iu đáng lu ý là: 1.
cùng mt dòng d liu, phai đc kt thúc; 2. token phi đng ngay đu dòng. Ví d
trên có mt chú ý: du > gi là du nhc th cp, nó cho bit dòng lnh đa vào dài hn
là 1 dòng và cng là du hiu shell thông báo nó hòai vng nhn nhiu (thông tin) đu
vào.
Hãy th vi ví d sau:
$ cat << EOF
> Logged in
> EOF > login.time
$ date >> login.time
$cat login.time
Login in
Fri May 19 12:40:15 PDT 2004
3.1.1.2 Các kí t đc bit kim soát tin trình
1. & (Ampersand) : đt mt tin trình (chng trình) vào ch đ chy nn
(background process). Bn thân Unix không có khái nim gì v tin trình chy nn hay
tin trình tng tác (foreground), mà shell điu khin vic chy các tin trình. Vi &
chng trình s t chy và shell quay ngay v tng tác vi ngi dùng, tr li du nhc
ngay. Ti
n trình nn có nhiu cách đ kim soát.
Ví d:
$sort huge.file > sorted.file &
$
Bng lnh ps s thy lnh sort đang chy kèm vi só ID ca tin tình đó.
Bng lnh
$ jobs
sau:
echo Logged in Fri May 12:52:25 UTC 2004 > login.time
Tc là: 1. thc hin date vi kt qu Fri May 12:52:25 UTC 2004 không hin ra stdout
(màn hình), nhng s là đu vào ca echo;
2. sau đó lnh echo s echo Logged in Fri May 12:52:25 UTC 2004, nhng không
đa ra màn hình (stdout) mà đi hng vào tp login.time.
Nu gõ $ cat login.time, ta có kt xut t tp này ra màn hình:
Logged in Fri May 12:52:25 UTC 2004
1.Hãy th vi lnh:
$echo Logged in Fri May 12:52:25 UTC 2004
Kt qu ?
2. Kt hp:
$cat << EOF
> Logged in `date`
> EOF > Login.time (ENTER)
Sau đó thc hin:
$ cat login.time
Kt qu ?
4. ng dn (Pipelines)
Shêll cho phép kt qu thc thi mt lnh (đu ra ca lnh), kt hp tr
c tip (ni vào) đu
vào ca mt lnh khác, mà không cn x lí trung gian (lu li trc ti tp trung gian).
Ví d:
$who | ls –l
u ra (stdout) ca who (đáng l s ra màn hình), slà đi vào (stdin) ca ls –l.
Ví d:
$ (date ; who) | ls -
1. Backslash (\)
Ví d:
$cat file1&2 lnh này gây ra nhiu li, bi có s hiu nhm & trong khi nó đn
gin là thành phn ca tên tp (file1&2). đc nh ý:
$cat file1\&2 s cho kt quae nh momg mun: đa ni dung ca tp có tên
file1&2 ra màn hình. Du \ đã gii tr ý ngha đc bit ca &. Các ví d khác v “ ” hay ‘ ‘:
Ví d 3-1: variables.sh
#!/bin/sh
myvar="Hi there"
echo $myvar
echo "message : $myvar"
echo 'message : $myvar'
echo "messgae :\$myvar"
echo Enter some text
read myvar
echo '$myvar' now equals $myvar
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
Bin môi trng Ý ngha
$HOME Cha ni dung ca th mc ch. (Th mc đu tiên khi ngi
dùng đng nhp)
$PATH Cha danh shell các đng dn (phn cách bng dn hai chm :).
Linux thng tìm các trình cn thi hành trong bin $PATH.
$PS1 Du nhc (prompt) hin th trên dòng lnh. Thông thng là $
cho user không phi root.
$SP2 Du nhc th cp, thông báo ngi dùng nhp thêm thông tin trc
khi lnh thc hin.Thng là du >.
$IFS Du phân cách các trng trong danh shell chui. Bin này cha
danh shell các ký t mà shell dùng tách chui (thng là tham s
trên dòng lnh). Ví d $IFS thng cha ký t Tab, ký t trng
hoc ký t xung hàng.
$0 Cha tên chng trình gi trên dòng lnh.
$# S tham s truyn trên dòng lnh
$$ Mã tin trình (process id) ca shell script thc thi. Bi s
process
id ca tin trình là duy nht trên toàn h thng vào lúc script thc
thi nên thng các lnh trong script' dùng con s này đ to các tên
file tm. Ví d /tmp/tmpfile_$$.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 16
Mi môi trng mà uer đng nhp cha mt s danh shell bin môi trng dùng cho mc
đích riêng. Có th xem đanh shell này bng lnh env. to mt bin môi trng mi,
có th dùng lnh export ca shell (mt s shell s dng lnh setenv).
ng hp trên ta có:
$echo " $ # "
3
Khi lnh không có tham s thì $0 chính là tên lnh còn $# tr v giá tr 0.
on trình mu sau s minh ha mt s cách đn giãn x lý và truy xut bin môi
trng.
Ví d3-2: try_variables.sh
#!/bin/sh
salutation="Hello"
echo $salutation
echo "The program $0 is now running"
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 17
echo "The second parameter was $2"
echo "The first parameter was $1"
echo "The parameter list was $*"
echo "The user's home directory is $HOME"
echo "Please enter a new greeting"
read salutation
chúng ta thng s dng lnh exit cui mi scipt khi kt thúc.
3.2.1. Lnh test hoc [ ]
Thc t, các script s dng lnh [] hoc test đ kim tra điu kin boolean rt
thng xuyên. Trong hu ht các h thng UNIX và Linux thì [ ] và test có ý ngha tng
t nhau, thng lnh [ ] đc dùng nhiu hn. Lnh [ ] trông đn gin, d hiu và rt gn
vi các ng lp trình khác.
Trong mt s shell ca Unix, lnh test có kh nng là mt li triu gi đn
chng trình bên ngoài ch không phi lnh ni ti ca ngôn ng script. Bi vì
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 18
test ít khi đc dùng và hu ht các lp trình viên có thói quen thng to các
chng trình vi tên test, cho nên khi th lnh test không thành công bên trong
script, thì hãy xem li đây đó bên trong h thng có mt chng trình tên là test
khác bit nào đó đang tn ti. Hãy th dùng lnh which test, lnh này s tr v
cho bn đng dn đn th mc test đc triu g
i. Chng hn /bin/test hay
/usr/bin/test.
Dc đây là cách s dng lnh test đn gin nht. Dùng lnh test đ kim tra xem
file mang tên hello.c có tn ti trong h thng hay không. Lnh test trong trng hp này
có cú pháp nh sau: test -f <mename>, trong script ta có th vit lnh theo cách sau:
-z stringl true nu string1 rng (chui null)
So sánh toán hc
So sánh Kt qu
expression1 -eq expression2 true nu hai biu thc bng nhau
expression1 -ne expression2 true nu hai biu thc không b
ng nhau
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 19
expression1 -gt expression2 true nu biu thc expression1 ln hn expression2
expreesion1 -ge expression2 true nu biu thc expression1 ln hn hay bng
expression2
expression1 -lt expression2 true nu biu thc expression1 nh hn expression2
expression1 -le exprebbion2 true nu biu thc expression1 nh hn hay bng
expression2
!expression true nu biu thc expression là false (toán t not)
Kim tra đi
u kin trên tp tin
-d file true nu file là th mc
-e file true nu file tn ti trên đa
-f file true nu file là tp tin thông thng
-g file true nu set-group-id đc thit lp trên file
-r file true nu file cho phép đc
-s f ile true nu kích thc file khác 0
Lnh if tuy đn gin nhng đc s dng nhiu nht. if kim tra điu kin đúng
hoc sai đ thc thi biu thc thích hp
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 20
if condition
then
statements
else
statements
Ví d, đon script sau s đng if tùy vào cu trá li ca bn mà đa ra li chào thích hp
Ví du 3-3 if_control.sh
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
if [ $timeofday = "yes" ]; then
echo "Good morning"
else
echo "Good afternoon"
fi
exit 0
LINUX, Lp trình shell
________________________________________________________________________ 21
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
if [ $timeofday = "yes" ]; then
echo "Good morning"
elif [ $timeofday = "no" ]; then
echo "Good afternoon"
else
echo "Sorry, $timeofday not recognized. Enter yes or no"
exit 1
fi
exit 0
Cng đn gián nh ví d 3-3, nhng chúng ta s dng thêm elif đ kim tra trng hp
ngi dùng không nhp “no". Thông báo li đc in ra và mã li tr v bng lnh exit là
1. Trng hp hoc “yes” hoc “no” đc nhp vào, mã li tr v s là 0.
3.3.3. Vn đ phát sinh vi các bin
22
Ví du: 3-5: elif_control2.sh
#!/bin/sh
echo -n "Is it morning? Please answer yes or no: "
read timeofday
if [ "$timeofday" = "yes" ]; then
echo "Good morning"
elif [ "$timeofday" = "no" ]; then
echo "Good afternoon"
else
echo "Sorry, $timeofday not recognized. Enter yes or no"
exit 1
fi
exit 0
Hãy kim tra li elif_controi2.sh bng cách chi nhn Enter khi shell đa ra câu
hi. Script gi đây chy rt bo đm và chun.
Lnh echo thng xung hàng sau khi đa ra thông báo. Có th đùng lnh printf
(s đ cp phn sau) thay cho echo. Mt vài shell cho phép lnh echo -e trên
mt dòng, nhng chúng không phi là ph bin đ bn s dng.
3.3.4. Lnh for
S dng for đ lp li mt s ln vi các giá tr xác đnh. Phm vi lp có th nm
trong mt tp hp chui ch đnh tng minh bi chng trình hay là kt qa tr v t
$./ for_loop.sh
bar
fud
13
foo là mt bin dùng trong vòng lp for đ duyt tp hp gm 3 phn t (cách nhau bng
khong trng). Mc đnh shell xem tt c các giá tr gán cho bin là kiu chui cho nên 13
đây đc xem là chui tng t nh chui bar và fud.
iu gì s xy ra nu bn thay th lnh for foo in barr fud 13 thành for foo in
“bar fud 13”. Hãy nh li, du nháy kép cho phép coi tt c ni dung bên trong
nháy kép là mt bin chui duy nht. Kt qu kt xut nu s dng du nháy kép,
lnh echo ch đc gi mt ln đ in ra chui "bar fud 13 ".
for thng dùng đ duyt qua danh shell tên các tp tin. Bng cách dùng ký t đi din *
(wildcard) ví d first.sh, ta đã thy cách for tìm kim tp tin kt hp vi lnh grep. Ví
d sau đây cho thy vic m rng bin thành tp hp s dng trong lnh for. Gi s bn
mun in ra tt c các tp *.sh có ký t đu tiên là f
Ví du 3-7: for_loop2.sh
#!/bin/sh
for file in $(ls f*.sh); do
lpr $file
done
Ví d trên đây cng cho thy cách s dng cú pháp $(command) (s đc chúng
Ví du: 3-8: password.sh
#!/bin/sh
echo "Enter password"
read trythis
while [ "$trythis" != "secret" ]; do
echo "Sorry, try again"
read trythis
done
exit 0
Kt xut ca scnpt
$./password.sh
Enter password:
abc
Sorry, try again
secret #gõ đúng
$
Mc dù đ password hin th khi nhp liu rõ ràng là không thích hp, nhng
đây ta ch yu minh ha lnh while. Lnh while liên tc kim tra ni dung bin $trythis,
yêu cu nhp li d liu bng lnh read mt khi $trythis vn cha bng vi chui "secret
".
Bng cách s dng bin đm và biu thc so sánh toán hc, while
hoàn tòan có th thay
th for trong trng hp tp d liu ln. H theo dõi ví d sau:
Ví d: 3-9 while_for.sh
Cú pháp ca lnh until nh sau:
until condition
do
statements
done
Lnh until tng t lnh while nhng điu kin kim tra bi đo ngc li. Vòng lp s b
dng nu điu kin kim tra là đúng. Ví d sau s s dng lnh until đ ch mt user nào
đó đng nhp:1
Ví d 3-10: until_user.sh
#!/bin/sh
echo "Locate for user "
until who | grep "$1" > /dev/null
do
sleep 60
done
echo -e \\a echo "***** $1 has just logged in *****"
exit 0
th lnh này, nu chy ngoài màn hình console, hãy dùng hai màn hình o (Alt+F1 và
Alt+F2), mt màn hình dùng chy script until_user.sh, màn hình kia dùng đng nhp vi
tên user mun kim tra. Nu trong ch đ đ ha, bn có th m hai ca s terminal và s
d hình dung hn. Hãy chy until_user.sh t mt màn hình nh sau: