UNIX/Linux LẬP TRÌNH TRONG MÔI TRƯỜNG SHELL - Pdf 94

LINUX, Lp trình shell
________________________________________________________________________ 1
UNIX/Linux

LP TRÌNH TRONG MÔI TRNG SHELL

1. Shell ca UNIX/LINUX

2. S DNG SHELL NH NGÔN NG LP TRÌNH
2.1. iu khin shell t dòng lnh
2.2. iu khin shell bng tp tin kch bn (script file)
2.3. Thc thi script

3. CÚ PHÁP NGÔN NG SHELL
3.1. S dng bin
3.1.1. Các kí t đc bit (Metalcharacters ca Shell)
3.1.1.1 Chuyn hng vào/ra
3.1.1.2 Các kí t đc bit kim soát tin trình
1.& (Ampersand)
2.Ngoc đn ( ; )
3. Du nháy ` ` (backquotes)
4.ng dn (Pipelines)
3.1.1.3 Du bc chui (quoting)
1.Backslash (\)
3.1.2. Biên môi trng (environment variable)
3.1.3. Bin tham s (parameter variable)
3.2. iu kin
3.2.1. Lnh test hoc [ ]

3.6.7. exit n
3.6.8. export
3.6.9 Lnh 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. Ly v kt qu ca mt lnh
3.7.1. c lng toán hc
3.7.2. M rng tham s
3.8. Tài liu Here

4. DÒ LI (DEBUG) CA SCRIPT

5. HIN TH MÀU SC (COLOR)
5.1. Màu ch
5.2. Thuc tính vn bn
5.3. Màu nn

6. XÂY DNG NG DNG BNG NGÔN NG SCRIPT
6.1. Phn tích yêu cu
6.2. Thit k ng dng

7. KT CHNG
8. MT S TÓM TT
8.1 To và chy các chng trình shell
8.1.1 To mt chng trình shell
8.1.2 Chy chng trình shell


Cách th nht là vit ra các chng trình mà các chng trình này bit cách to ra tin
trình (C/C++). Tuy nhiên cách này đòi hi nhiu hiu bit và n lc. Cng nh các h
điu hành làm vic kiu o khác, Unix h tr mt phng tin x lí lnh làm giao din
gia lnh máy (mà ngi dùng đa vào) và vic thc thi ca lnh đó (bi Unix). Phng
tin đó gi là shell. T khi ra đi Unix đã có vài kiu shell, đó là Bourne, C, Korn shell.
Thc ra shell làm gì ? Tòan b mc đích ca shell là đ khi đng các tin trình x lí
lnh đa vào: yêu cu đa (dòng) lnh vào, đc đu vào, thông dch dòng lnh đó, và to
ra tin trình đ thc hin lnh đó. Nói cách khác shell quét dòng lnh đa vào máy tính,
cu hình môi trng thc thi và to tin trình đ thc hin lnh. Hình 2: V trí ca shell khi “thc hin” lnh ca ngi dùng Shell dch các
lnh nhp vào thành li gi h thng, chuyn các ký hiu dn hng >, >>
hay | thành d liu di chuyn gia các lnh. c các bin môi trng đ
tìm ra thông tin thc thi lnh.
Nh vy tìm hiu shell thc t là hc mt ngôn ng lp trình, cho dù không phc
tp nh C, hay các ngôn ng khác, nhng cng phi qua nhng đòi hi cn thit. Trong
Unix/Linux có các lai shell khác nhau và có th la chn đ dùng theo nhu cu mà
ngi dùng thy phù hp. Hình 2 là mô hình tng tác gia các shell, chng trình ng
dng, h X-Window và ht nhân.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 5Cac ung

H thng cung cp cho ngi dùng rt nhiu chng trình shell. Mi shell có mt
s tin ích nh h tr ch đ gõ phím, ghi nh lnh. Kt hp các tin ích ca shell đ to
ra mt chng trình chy đc, thì mt chng trình nh vy đc lu di dng mt
tp, gi là tp kch bn (script, hãy th m mt tp nh vy và quan sát cu trúc ca tp).
Vit đc mt tp script, thc cht là đã lp trình theo shell. Mt khi đã quen thuc vi
mt shell và cách hot đng ca shell đó, ngi dùng có th làm ch đc các shell khác
mt cách đ dàng.

Các shell trên Unix/Linux:

sh ( Bourne ) shell nguyên thy áp dng cho Unix
Csh, tcsh và zsh dòng shell s d
ng cu trúc lnh ca C làm ngôn ng kch bn.
c to ra đu tiên bi Bia Joy. Là shell thông dng th hai sau
bash shell.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 6
bash shell ch yu ca Linux. Ra đi t d án GNU. bash (Vit tt ca
Bourne Again Shell có li đim là mã ngun đc công b rng
rãi. Nu bash cha có sn trong h thng Unix hay Linux, hãy ti
v, biên dch và s dng min phí ti đa ch www.gnu.org
rc shell mô rng ca csh vi nhiu tng thích vi ngôn ng C hn.
rc cng ra đi t d án GNU.

Shell chun thng đc các nhà phân phi Linux s dng hin nay là bash shell. Khi cài

if grep -l 'main( ) ' $file
then
more $fle
fi
done
Khi gõ mt lnh cha hoàn chnh t du nhc ca shell, shell s chuyn du nh
c thành
>, shell ch nhp đy đ các lnh trc khi thc hin tip. Shell t trng hiu đc khi
nào thì lnh bt đu và kt thúc. Trong ví d trên lnh for . . . do s kt thúc bng done.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 7
Khi gõ xong done, shell s bt đu thc thi tt c nhng gì đã gõ vào bt đu t for. 
đây, file là mt bin ca shell, trong khi * là mt tp hp đi din cho các tên tp tìm thy
trong th mc hin hành.
Bt tin ca vic điu khin ngôn ng shell t dòng lnh là khó ly li khi lnh
trc đó đ sa đi và thc thi mt ln na. Nu ta nhn phím Up/Down thì shell có th
tr li khi lnh nh sau:
$ for file in * ; do ; if grep -1 'main( )’ $file;
then ; more $file; fi; done
ây là cách các shell Linux vn thng làm đ cho phép thc thi nhiu lnh cùng lúc
ngay trên dòng lnh. Các lnh có th cách nhau bng du (;). Ví d:
$ mkdir myfolđer; cd myfolder;
s to th mc myfolder bng lnh mkdir sau đó chuyn vào th mc này bng lnh cd.
Ch cn gõ Enter mt ln duy nht đ thc thi hai lnh cùng lúc. Tuy nhiên sa cha các
khi lnh nh vy không d dàng và rt d gây li. Chúng ch thun tin cho kt hp

Có th ch đnh #!/bin/bash làm shell thông dch thay cho sh, vì trong Linux tht ra
sh và bash là mt. Tuy nhiên nh đã nêu, trên các h Unix vn s dng shell sh làm
chun, vì vy vn là mt thói quen tt cho lp trình viên nu s dng shell sh. Khi
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 8
tip cn vi UNIX, ta s cm thy quen và thân thuc vi shell này hn. Nên chy
script trong mt shell ph (nh gi sh chng hn), khi đó mi thay đi v môi
trng mà script gây ra không nh hng đn môi trng làm vic chính.

Ch th #! Còn đc dùng đ gi bt kì chng trình nào ta mun chy trc khi script
tip theo đc dch. Lnh exit bo đm rng script sau khi thc thi s tr v mã li, đây là
cách mà hu ht các chng trình nên làm, mc dù mã li tr v ít khi đc dùng đn
trong trng hp thc hin tng tác trc tip t dòng lnh. Tuy nhiên, nhn bit mã tr
v ca mt đon script sau khi thc thi, li thng rt có ích nu bn triu gi script t
trong mt script khác. Trong đon chng trình trên, lnh exit s tr v 0, cho bit script
thc thi thành công và thoát khi shell gi nó. Mc dù khi đã lu tp tin script vi tên .sh,
nhng UNIX và Linux không bt buc điu này. Him khi Linux s dng phn đuôi m
rng ca tp tin làm du hiu nhn dng, do đó tp tp script có th là tùy ý. Tuy vy .sh
vn là cách chúng ta nhn ngay ra mt tp tin có th là script ca shell mt cách nhanh
chóng.

2.3. Thc thi script

Chúng ta va to ra tp tin script first.sh, nó có th đc gi thc thi theo 2 cách.
Cách đn gin nht là triu gi trình shell vi tên tp tin script làm đi s. Ví d:

________________________________________________________________________ 9
Mt khi bn tin rng first.sh chy tt, có th di chuyn nó đn th mc khác thích
hp hn th mc hin hành. Nu lnh script ch dành cho mc đích riêng ca bn, bn có
th to ra th mc /bin trong th mc ch (home) mà nhà qun tr qui đnh cho ngi
dùng, sau đó thêm đng dn này vào bin môi trng PATH. Nu mun script đc gi
bi ngi dùng khác, hãy đt nó vào th mc /usr/1ocal/bin. Thông thng, đ cho phép
mt script hay chng trình thc thi, cn đc ngi qun tr cho phép. Nu bn là nhà
qun tr, cng cn cn thn xem xét các script do các ngi dùng khác (hacker chng hn)
đt vào h thng. Ngôn ng script rt mnh, nó có th làm đc hu nh là mi chuyn
k c hy dit h thng!
 ngn script ca b sa đi bi ngi dùng khác, có th s dng các lnh thit
lp quyn (thng phái đng nhp vi t cách root đ làm công vic 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

on lnh trên mang ý ngha: chuyn quyn s hu tp tin cho root, root đc toàn
quyn đc sa ni dung và thc thi tp tin, trong khi nhóm và nhng ngi dùng khác
root ch đc phép đc và thc thi. Nên nh mc dù b
n loi b quyn ghi w trên tp tin,
UNTX và Linux vn cho phép bn xoá tp tin này nu th mc cha nó có quyn ghi w.
 an toàn, vi t cách là nhà qun tr, nên kim tra li th mc cha script và bo đm
rng ch có root mi có quyn w trên th mc cha các tp .sh
phép gán. Mc đnh, tt c các bin đu đc khi to và cha tr kiu chui (string).
Ngay c khi d liu mà bn đa vào bin là mt con s thì nó cng đc xem là đnh
dng chui. Shell và mt vài lnh tin ích s t đng chuyn chui thành s đ thc hin
phép tính khi có yêu cu. Tng t nh bn thân h điu hành và ngôn ng C, cú pháp
ca shell phân bit ch hoa ch thng, bin mang tên foo, Foo, và FOO là ba bin khác
nhau.
Bên trong các script ca shell, bn có th ly v ni dung ca bin bng cách dùng
du $ đt trc tên bin.  hin th ni dung bin, bn có th dùng lnh echo. Khi gán
ni dung cho bin, bn không cn phi s dng ký t $. Ví d trên dòng lnh, bn có th
gán ni dung và hin th bin 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

Lu ý, sau du = không đc có khong trng. Nu gán ni dung chui có khong
trng cho bin, cn bao bc chui bng du “ “.

Có th s
 dng lnh read đ đc nhp liu do ngi dùng đa vào và gi li trong bin
đ s dng. Ví d:
$ read yourname
XYZ
$echo "Hello " $yourname
Hello XYZ

$date > login.time
Lnh date không kt xut ra đu ra chun (stdout) mà ghi vào tp login.time. >login.time
không phi là thành phn ca lnh date, mà đn gin mô t tin trình t
o và gi kt xut 
đâu (bình thng là màn hình). Nhìn theo cách x lí thì nh sau: c cm lnh trên cha
hai phn: lnh date, tc chng trình thc thi, và thông đip (>login.time) thông báo cho
shell bit kt xut lnh s đc x lí nh th nào (khác vi mc đnh. Bn thân date cng
không bit chuyn kt xut đi đâu, shell chn mc đnh).

Ví d:
$cat < file1
Bình thng cat nhn và hin th ni dung tp có tên (là đi đu vào). Vi lnh trên cat
nhn ni dung t file1 và kt xut ra màn hình. Thc cht không khác gì khi gõ:
$cat file1.
Hãy xem:
$cat < file1 > file2
Lnh này thc hin nh th nào ? Theo trình t s nh sau: cat nhn ni dung ca file1
sau đó ghi vào tp có tên file2, không đa ra stdout nh mc đnh. Lnh cho thy ta có
th thay đi đu và đu ra cho lnh nh th nào. Nhng lnh cho phép đi đu ra/vào gi
chung là qúa trình lc (filter).

Ví d:
$cat file1 < file2
Lnh này ch hin th ni dung ca file1, không gì hn. Ti sao ? cat nhn đi đu vào là
tên tp. Nu không có đi nó nhn t stdin (bàn phím). Có đi thì chính là file1 và đu ra
là stdout. Trng hp này gi là b qua đi hng. Cái gì  đây là quan trng ? u
ra/vào ca lnh đã đi hng cng không có ngha là s bo đm rng s đi hng s
đc s dng Mt ln na cho thy lnh bn thân nó không hiu rng đã có s đi hng
và có lnh chp nhn đi hng vào/ra, nhng không phi tt c. Ví d
$date < login.time

Xin chao

 đây EOF là du hiu đánh du, hay còn gi là th bài (token). iu đáng lu ý là: 1.
cùng mt dòng d liu, phai đc kt thúc; 2. token phi đng ngay  đu dòng. Ví d
trên có mt chú ý: du > gi là du nhc th cp, nó cho bit dòng lnh đa vào dài hn
là 1 dòng và cng là du hiu shell thông báo nó hòai vng nhn nhiu (thông tin)  đu
vào.
Hãy th vi 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 bit kim soát tin trình

1. & (Ampersand) : đt mt tin trình (chng trình) vào ch đ chy nn
(background process). Bn thân Unix không có khái nim gì v tin trình chy nn hay
tin trình tng tác (foreground), mà shell điu khin vic chy các tin trình. Vi &
chng trình s t chy và shell quay ngay v tng tác vi ngi dùng, tr li du nhc
ngay. Ti
n trình nn có nhiu cách đ kim soát.
Ví d:
$sort huge.file > sorted.file &
$
Bng lnh ps s thy lnh sort đang chy kèm vi só ID ca tin tình đó.
Bng lnh
$ jobs

sau:
echo Logged in Fri May 12:52:25 UTC 2004 > login.time
Tc là: 1. thc hin date vi kt qu Fri May 12:52:25 UTC 2004 không hin ra stdout
(màn hình), nhng s là đu vào ca echo;
2. sau đó lnh echo s echo Logged in Fri May 12:52:25 UTC 2004, nhng không
đa ra màn hình (stdout) mà đi hng vào tp login.time.
Nu gõ $ cat login.time, ta có kt xut t tp này ra màn hình:
Logged in Fri May 12:52:25 UTC 2004

1.Hãy th vi lnh:
$echo Logged in Fri May 12:52:25 UTC 2004
Kt qu ?
2. Kt hp:
$cat << EOF
> Logged in `date`
> EOF > Login.time (ENTER)
Sau đó thc hin:
$ cat login.time
Kt qu ?

4. ng dn (Pipelines)
Shêll cho phép kt qu thc thi mt lnh (đu ra ca lnh), kt hp tr
c tip (ni vào) đu
vào ca mt lnh khác, mà không cn x lí trung gian (lu li trc ti tp trung gian).
Ví d:
$who | ls –l
u ra (stdout) ca who (đáng l s ra màn hình), slà đi vào (stdin) ca ls –l.
Ví d:
$ (date ; who) | ls -


1. Backslash (\)
Ví d:
$cat file1&2 lnh này gây ra nhiu li, bi có s hiu nhm & trong khi nó đn
gin là thành phn ca tên tp (file1&2).  đc nh ý:
$cat file1\&2 s cho kt quae nh momg mun: đa ni dung ca tp có tên
file1&2 ra màn hình. Du \ đã gii tr ý ngha đc bit ca &. 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

________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________


Bin môi trng Ý ngha
$HOME Cha ni dung ca th mc ch. (Th mc đu tiên khi ngi
dùng đng nhp)
$PATH Cha danh shell các đng dn (phn cách bng dn hai chm :).
Linux thng tìm các trình cn thi hành trong bin $PATH.
$PS1 Du nhc (prompt) hin th trên dòng lnh. Thông thng là $
cho user không phi root.
$SP2 Du nhc th cp, thông báo ngi dùng nhp thêm thông tin trc
khi lnh thc hin.Thng là du >.
$IFS Du phân cách các trng trong danh shell chui. Bin này cha
danh shell các ký t mà shell dùng tách chui (thng là tham s
trên dòng lnh). Ví d $IFS thng cha ký t Tab, ký t trng
hoc ký t xung hàng.
$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ã tin trình (process id) ca shell script thc thi. Bi s
 process
id ca tin trình là duy nht trên toàn h thng vào lúc script thc
thi nên thng các lnh trong script' dùng con s này đ to các tên
file tm. Ví d /tmp/tmpfile_$$.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 16
Mi môi trng mà uer đng nhp cha mt s danh shell bin môi trng dùng cho mc
đích riêng. Có th xem đanh shell này bng lnh env.  to mt bin môi trng mi,
có th dùng lnh export ca shell (mt s shell s dng lnh setenv).

ng hp trên ta có:
$echo " $ # "
3
Khi lnh không có tham s thì $0 chính là tên lnh còn $# tr v giá tr 0.

on trình mu sau s minh ha mt s cách đn giãn x lý và truy xut bin môi
trng.

Ví d3-2: try_variables.sh

#!/bin/sh

salutation="Hello"
echo $salutation
echo "The program $0 is now running"
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp 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 thng s dng lnh exit  cui mi scipt khi kt thúc.

3.2.1. Lnh test hoc [ ]

Thc t, các script s dng lnh [] hoc test đ kim tra điu kin boolean rt
thng xuyên. Trong hu ht các h thng UNIX và Linux thì [ ] và test có ý ngha tng
t nhau, thng lnh [ ] đc dùng nhiu hn. Lnh [ ] trông đn gin, d hiu và rt gn
vi các ng lp trình khác.

Trong mt s shell ca Unix, lnh test có kh nng là mt li triu gi đn
chng trình bên ngoài ch không phi lnh ni ti ca ngôn ng script. Bi vì
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 18
test ít khi đc dùng và hu ht các lp trình viên có thói quen thng to các
chng trình vi tên test, cho nên khi th lnh test không thành công bên trong
script, thì hãy xem li đây đó bên trong h thng có mt chng trình tên là test
khác bit nào đó đang tn ti. Hãy th dùng lnh which test, lnh này s tr v
cho bn đng dn đn th mc test đc triu g
i. Chng hn /bin/test hay
/usr/bin/test.

Dc đây là cách s dng lnh test đn gin nht. Dùng lnh test đ kim tra xem
file mang tên hello.c có tn ti trong h thng hay không. Lnh test trong trng hp này
có cú pháp nh sau: test -f <mename>, trong script ta có th vit lnh theo cách sau:


-z stringl true nu string1 rng (chui null)

So sánh toán hc
So sánh Kt qu
expression1 -eq expression2 true nu hai biu thc bng nhau
expression1 -ne expression2 true nu hai biu thc không b
ng nhau
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 19
expression1 -gt expression2 true nu biu thc expression1 ln hn expression2
expreesion1 -ge expression2 true nu biu thc expression1 ln hn hay bng
expression2
expression1 -lt expression2 true nu biu thc expression1 nh hn expression2
expression1 -le exprebbion2 true nu biu thc expression1 nh hn hay bng
expression2
!expression true nu biu thc expression là false (toán t not)

Kim tra đi
u kin trên tp tin
-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 f ile true nu kích thc file khác 0

Lnh if tuy đn gin nhng đc s dng nhiu nht. if kim tra điu kin đúng
hoc sai đ thc thi biu thc thích hp
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________ 20
if condition
then
statements
else
statements
Ví d, đon script sau s đng if tùy vào cu trá li ca bn mà đa ra li chào thích hp

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, Lp 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

Cng đn gián nh ví d 3-3, nhng chúng ta s dng thêm elif đ kim tra trng hp
ngi dùng không nhp “no". Thông báo li đc in ra và mã li tr v bng lnh exit là
1. Trng hp hoc “yes” hoc “no” đc nhp vào, mã li tr v s là 0.

3.3.3. Vn đ phát sinh vi các bin


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 kim tra li elif_controi2.sh bng cách chi nhn Enter khi shell đa ra câu
hi. Script gi đây chy rt bo đm và chun.

Lnh echo thng xung hàng sau khi đa ra thông báo. Có th đùng lnh printf
(s đ cp  phn sau) thay cho echo. Mt vài shell cho phép lnh echo -e trên
mt dòng, nhng chúng không phi là ph bin đ bn s dng.

3.3.4. Lnh for

S dng for đ lp li mt s ln vi các giá tr xác đnh. Phm vi lp có th nm
trong mt tp hp chui ch đnh tng minh bi chng trình hay là kt qa tr v t

$./ for_loop.sh
bar
fud
13

foo là mt bin dùng trong vòng lp for đ duyt tp hp gm 3 phn t (cách nhau bng
khong trng). Mc đnh shell xem tt c các giá tr gán cho bin là kiu chui cho nên 13
 đây đc xem là chui tng t nh chui bar và fud.

iu gì s xy ra nu bn thay th lnh for foo in barr fud 13 thành for foo in
“bar fud 13”. Hãy nh li, du nháy kép cho phép coi tt c ni dung bên trong
nháy kép là mt bin chui duy nht. Kt qu kt xut nu s dng du nháy kép,
lnh echo ch đc gi mt ln đ in ra chui "bar fud 13 ".

for thng dùng đ duyt qua danh shell tên các tp tin. Bng cách dùng ký t đi din *
(wildcard)  ví d first.sh, ta đã thy cách for tìm kim tp tin kt hp vi lnh grep. Ví
d sau đây cho thy vic m rng bin thành tp hp s dng trong lnh for. Gi s bn
mun in ra tt c các tp *.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 cng cho thy cách s dng 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

Kt xut ca scnpt
$./password.sh
Enter password:
abc
Sorry, try again
secret #gõ đúng
$
Mc dù đ password hin th khi nhp liu rõ ràng là không thích hp, nhng 
đây ta ch yu minh ha lnh while. Lnh while liên tc kim tra ni dung bin $trythis,
yêu cu nhp li d liu bng lnh read mt khi $trythis vn cha bng vi chui "secret
".
Bng cách s dng bin đm và biu thc so sánh toán hc, while
hoàn tòan có th thay
th for trong trng hp tp d liu ln. H theo dõi ví d sau:

Ví d: 3-9 while_for.sh

Cú pháp ca lnh until nh sau:
until condition
do
statements
done

Lnh until tng t lnh while nhng điu kin kim tra bi đo ngc li. Vòng lp s b
dng nu điu kin kim tra là đúng. Ví d sau s s dng lnh until đ ch mt user nào
đó đng nhp: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 lnh này, nu chy ngoài màn hình console, hãy dùng hai màn hình o (Alt+F1 và
Alt+F2), mt màn hình dùng chy script until_user.sh, màn hình kia dùng đng nhp vi
tên user mun kim tra. Nu trong ch đ đ ha, bn có th m hai ca s terminal và s
d hình dung hn. Hãy chy until_user.sh t mt màn hình nh sau:


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status