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.3. Cu trúc điu khin
3.3.1. Lnh if
3.3.2. Lnh elif
3.3.3. Vn đ phát sinh vi các bin
3.3.4. Lnh for
3.3.5. Lnh while
3.3.6. Lnh intil
3.3.7. Lnh case
3.4. Danh shell thc thi lnh (Lists)
3.4.1. Danh sách AND (&&)
3.4.2 Danh sáchl OR ( || )
3.4.3. Khi lnh
3.5. Hàm (function)
3.5.1 Bin cc b
và bên toàn cc
3.5.2. Hàm và cách truyn tham s
3.6. Các lnh ni ti ca shell
3.6.1. break
3.6.2 continue
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
2
3.6.3. Lnh : (lnh rng)
3.6.4. Lnh . (thc thi)
3.6.5. eval
3.6.6. exec
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
8.2 S dng bin
8.2.1 Gán mt giá tr cho bin
8.2.2 Truy nhp giá tr ca mt bin
8.2.3 Tham s v
trí và bin xây dng sn trong shell
8.2.4 Ký t đc bit và cách thoát khi ký t đc bit
8.2.5 Lnh test
8.3 Các hàm shell
8.3.2 Các ví d to hàm
8.4 Các mnh đ điu kin
8.4.1 Mnh đ if
8.4.2 Mnh đ case
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
3
8.5 Các mnh đ vòng lp
8.5.1 Mnh đ for
8.5.2 Mnh đ while
8.5.3 Mnh đ until
8.5.4 Câu lnh shift
TÀI LIU THAM KHO
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
4
Trc khi bt tay vào vit nhng ng dng không cn ti các ngôn ng lp trình
phc tp khác, chng này s đ cp cách tip cn vi ngôn ng kch bn (script) ca h
v (shell, t đây s gi là shell script), dùng điu khin và tng tác vi Linux. Khi tip
cn vi DOS, DOS cung cp mt shell đ to các x lí theo lô trên nhng tp tin *.bat,
tng đi rõ ràng, đn gin. Tuy nhiên shell ca DOS không mnh và hu dng bng
shell script trên Linux. Tài liu này s cung cp nhng kin thc va đ đ ngi dùng
UNIX/LINUX có th dùng shell to ra các chng trình thc thi hu hiu, thm chí còn
có th dùng shell đ thc hin đc mi thao tác kim soát h điu hành (nh các nhà
chuyên nghip vn nói). Nhng đích chính cn đt đc nh sau:
1.Shell và mc đích s dng
2.Cú pháp và cách điu khin các lnh ca ngôn ng shell
3.Hin th và th hin màu sc
4.các ví d thc hành
1. Shell ca UNIX/Linux
Mi th đc thc hin trên Unix đu bi tin trình. Vy to ra tin trình nh th nào ?
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
________________________________________________________________________
5
Cac ung
dung
C shell (csh)
Bourne
Again shell
(bash)
X-Wimdows
shell
Nhan
HDH
Hình 2
Linux/Unix tách bit các ng dng, lnh gi các hàm chc nng ca nhân thành
nhng đn th rt nh (tin trình). Tuy nhiên, nhiu lnh ca Linux có th kt hp li vi
nhau đ to nên chc nng tng hp rt mnh m. Ví d:
$ ls -al | more
lnh trên đc kt hp bng hai lnh, ls lit kê toàn b danh sách tp và th mc trên đa
ra màn hình, nu danh sách quá dài, ls chuyn d liu kt xut cho lnh more x lý hin
th kt qu thành tng trang màn hình. Linux có cách kt hp d liu kt xut ca các
lnh vi nhau thông qua c ch chuyn tip (redirect), ng dn (pipe).
Kt hp các lnh vi nhau ch bng dòng lnh không cha đ. Nu mun t hp
nhiu lnh đng thi vi nhau và tùy vào tng điu kin, kt xut ca lnh, mà có nhng
ng x thích hp thì sao? Lúc đó s dùng đn các cu trúc lp trình r nhánh nh if, case.
Trng hp bn mun thc hin các thao tác vòng lp, phi dùng các lnh nh for, while
Shell chính là trình din dch cung cp cho ngi dùng kh nng này. Hu ht các
Shell trong Unix/Linux s dng mt ngôn ng gn ging vi C (điu này cng d hiu
bi trong th gii Unix/Linux, C là ngôn ng lp trình thng tr). Ngôn ng Shell càng
ging C thì lp trình viên hay ngi điu khin Linux càng cm thy thân thin vi HH.
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
đt Linux, trình cài đt thng mc đnh bash là shell khi đng. Có th tìm thy chng
trình shell này trong th mc /bin vi tên chng trình là bash. bash đôi khi là mt
chng trình nh phân đôi khi là mt script gi đn liên kt nh phân khác. Có th dùng
lnh file đ xem bash là mt tp tin nh phân hay script nh sau:
$ file /bin/bash
/bin/bash: ELF 32-bit LSB executable. Intel 80386
nu kt qu kt xut là dng ELF thì có ngha là bash là chng trình nh phân.
Tuy bash là shell s dng ph bin trong Linux, nhng các ví d v lp trình s s
dng ngôn ng và lnh ca shell sh bi vì sh là shell nguyên thy, có th chy trên c
Unix. Bng lnh file ta s thy trong hu ht các bn Linux hin nay sh ch là liên kt đn
bash mà thôi. Ví d:
$ file /bin/sh
/bin/sh: symbolic link to bash
điu này có ngha là bash hoàn toàn có th din dch và điu khin các lnh ca shell sh.
2. S DNG SHELL NH NGÔN NG LP TRÌNH
Có hai cách đ vit chng trình điu khin shell: gõ chng trình ngay t dòng
lnh là cách đn gin nht. Tuy nhiên mt khi đã thành tho có th gp các lnh vào mt
tp đ chy (chúng tng đng vi cách DOS gi tp *.bat), điu này hiu qu và tn
dng trit đ tính nng t đng hóa ca shell.
2.1. iu khin shell t dòng lnh
Chúng ta hãy bt đu, giá s trên đa cng có rt nhiu file ngun .c, bn mun
truy tìm và hin th ni dung ca các tp ngun cha chui main(). Thay vì dùng lnh
grep đ tìm ra tng file sau đó quay li dùng lnh more đ hin th file, ta có th dùng
lnh điu khin shell t đng nh sau:
$ for file in *
do
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
khong vài ba lnh. d bo trì bn có th đa các lnh vào mt tp tin và yêu cu shell
đc ni dung tp tin đ thc thi lnh. Nhng tp tin nh vy gi là tp tin kch bn (shell
script).
2.2. iu khin shell bng tp tin kch bn (script file)
Trc ht bn dùng lnh
$cat > first.sh hay các trình son tho nh vi hay emacs (hoc mc) đ son ni
dung tp tin first.sh nh sau:
# ! /bin/ sh
# first.sh
# Script nay se tìm trong th mc hin hành các chui
# mang ni dung main( ) , ni dung ca fìle s đc hin th ra màn hình nu tìm
thy.
for file in *
do
if grep -l 'main( ) ' $file
then
more $fle
fi
done
exit 0
Không nh chú thích ca C, mt dòng chú thích (comment) trong ngôn ng shell bt đu
bng ký t #. Tuy nhiên
đây có mt chú thích hi đc bit đó là #!/bin/sh. y thc s
không phi là chú thích. Cp ký t #! là ch th yêu cu shell hin ti triu gi shell sh
nm trong th mc /bin. Shell sh s chu trách nhim thông dch các lnh nm trong tp
tin script đc to.
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:
$ /bin/ sh first.sh
Cách gi trên là bình thng, nhng vn quen thuc hn nu ta có th gi first.sh ngay t
dòng lnh, tng t các lnh Linux thông thng. làm đc điu này, trc ht cn
chuyn thuc tính thc thi (x) cho tp tin script bng lnh chmod nh sau:
$ chmod +x first.sh
Sau đó có th triu gi script theo cách th hai tin li hn:
$ first.sh
Có th lnh trên không thc hin thành công và ta s nhn đc thông báo li 'command
not found' (không tìm thy lnh). iu này xy ra bi vì bin môi trng PATH ca bn
thng không cha đng dn hay v trí th mc hin hành. khc phc, ta có th thêm
vào bin môi trng PATH ch đnh th
mc hin hành nh sau:
$ PATH=$PATH: .
Nu mun Linux t đng nh th mc hin hành mi khi đng nhp bn có th thêm lnh
PATH=$PATH : . vào cui tp .bash_profile (file đc triu gi lúc h thng đang nhp
- tng t autoexec.bat ca DOS). Tuy nhiên cách gn và đn gin nht mà ta vn
thng làm là đnh rõ du th mc hiên hành ./ ngay trên lnh. Ví d:
$ . / first.sh
Lu ý: i vi tài khon root, không nên thay đi bin môi trng PATH (bng
cách thêm du ch đnh . ) cho phép truy tìm th mc hin hành. iu này không an
toàn và d to ra l hng bo mt. Ví d, mt qun tr h đng nhp di quyn
root, triu gi chng trình ca Linux mà h tng th mc qui đnh nh /bin,
nu bin PATH cho phép tìm th mc hin hành thì rt có th nhà qun tr thc
thi chng trình ca ai đó thay vì chng trình Linux /bin. Vy nên to thói quen
đt du ./ trc mt tp tin đ ám ch truy xut th mc hin hành.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
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
3. CÚ PHÁP NGÔN NG SHELL
Chúng ta đã thy cách vit lnh và gi thc thi tp tin scirpt. Phn tip theo nay
dành cho bn khám phá sc mnh ca ngôn ng lp trình shell. Trái vi lp trình bng
trình biên dch khó kim li và nâng cp, lp trình script cho phép bn d dàng sa đi
lnh bng ngôn ng vn bn. Nhiu đon script nh có th kt hp li thành mt script
ln mnh m và rt hu ích. Trong th gii UNIX và Linux đôi lúc gi thc thi mt
chng trình, bn khó mà bit đc chng trình đc vit bng script hay thc thi theo
mã ca chng trình nh phân, bi vì tc đ thc thi và s uyn chuyn ca chúng gn
nh ngang nhau. Phn này chúng ta s hc v:
• Bin: kiu chui, kiu s, tham s và bin môi trng
• iu kin: kim tra lun lý Boolean bng shell
• iu khin chng trình: if, elif, for , while, until, case
• Danh shell
• Hàm
• Các hình ni ti ca shell
• Ly v kt qu ca mt lnh
• Tài liu Here
3.1. S dng bin
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
10
Thng bn không cn phi khai báo bin trc khi s dng. Thay vào đó bin s
đc t đng to và khai báo khi ln đu tiên tên bin xut hin, chng hn nh trong
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
Lnh read kt thúc khi bn nhn phím Enter (tng t scanf ca C hay readln ca
Pascal).
3.1.1. Các kí t đc bit (Metalcharacters ca Shell)
3.1.1.1 Chuyn hng vào/ra
Mt tin trình Unix/Linux bao gi cng gn lin vi các đu x lí các dòng (stream) d
liu: đu vào chun (stdin hay 0), thng là t
bàn phím qua chc nng getty(); đu ra
chun (stdout, hay 1), thng là màn hình, và c s d liu li h thng (stderr, hay 2).
Tuy nhiên các hng vào/ra có th thay đi đc bi các thông báo đc bit:
Kí hiu Ý ngha ( … tng trng cho đích đi hbg)
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
11
> u ra hng ti …
>> Ni vào ni dung ca …
< Ly đu vào t < …
<< word đu vào là đây …
2> đu ra báo li s hng vào …
2>> đu ra báo li hng và ghi thêm vào …
Ví d:
$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
date khác cat, nó không kim tra đu vào, nó bit phi tìm đu vào đâu. i hng
đây không có tác dng.
Ví d
$cat < badfile 2> errfile
Thông thng các li h thng qun lí đu stderr và s in ra màn hình. Tuy nhiên có th
chuyn hng báo li, ví d vào m
t tp (chng hn logfile) mà không đa ra mahn hình.
Ví d trên là nh vy. Ta bit stderr là tp có mô t tp = 2, do vy 2>errfile có ngha đi
đu ra ca stderr vào mt tp, tc ghi báo li vào tp xác đnh.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
12
Nhng gì va đ cp tác đng trên tp vào/ra. Ta cng có cách x lí ngay trong
mt dòng ca tp, cái đó gi là đi hng trong dòng (in-line Redirection). Lai này bao
gm hai phn: đi hng (<<) và du hiu đánh du (là bt kì kí t gì) ca dòng d liu
vào.
Ví d:
$cat << EOF # du hiu đánh du ch
n đây là EOF
> Xin chao
> ….
> EOF (và gõ ENTER)
Ngay lp tc trên màn hình s là:
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
[1]
s thy s hiu ca lnh đang chy ngm.
kt thúc thc thi, dùng
$ kill 1234 #1234 là só ID ca tin trình sort
quay li ch đ tng tác:
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
13
$ fg 1
2. Ngoc đn ( ; ) Dùng đ nhóm mt s lnh li, phân cách bi ;
Ví d:
$ (date ; who) > system.status
$ cat system.status
(Hãy xem kt xut trên màn hình)
3. Du nháy ` ` (backquotes) (là du phím đi cùng vi ~)
Hay còn gi là du thay th. Bt kì lnh nào xut hin bên trong du nháy s đc thc
hin trc và kt qu ca lnh
đó s thay th đu ra chun (stdout) trc khi lnh trong
dòng lnh thc hin.
Ví d:
$ echo Logged in `date` > login.time
s nói cho shell đi thc hin date trc tiên, trc khi thc hin các phn khác còn li
ca dòng lnh, tc sau đó mi thc hin lnh echo. Vy cách din đt dòng lnh trên nh
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 -
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
14
Tóm tt:
cmd & đt lnh cmd chy nn (background)
cmd1 ; cmd2 chy cmd1 trc, sau đó chy cmd2
(cmd) thc hin cmd trong mt shell con (subshell)
`cmd` đu ra ca cmd s thay cho đàu ra ca lnh trong dòng lnh
cmd1 | cmd2 ni đu ra ca cmd1 vào đu vào ca cmd2
3.1.1.2 Du bc chui (quoting)
Shell có mt tp các kí t đc bit mà hiu lc ca chúng là đ vô hiu hóa ý ngha ca
các kí t đc bit khác. Khi mt kí t đc bit b gii tr hiu lc, ta gi kí t đó là b
quoted.
Trc khi tip tc chúng ta cn hiu mt s tính cht ca du bc chui mà shell
quy đnh. Thông thng, tham s dòng lnh thng cách nhau bng khong trng.
Khong trng có th là ký t spacebar, tab hoc ký t xung dòng. Trng hp mun
tham s ca mình cha đc c khong trng, cn phi bc chui bng du nháy đn '
hoc nháy kép " .
Du nháy kép đc dùng trong trng hp bin chui ca bn có khong trng. Tuy
nhiên vi du nháy kép, ký hiu bin $ vn có hiu lc. Ni dung ca bin s đc thay
th trong chui. Du nháy đn s có hiu lc mnh hn. Nu tên bin có ký t $ đt trong
chui có du nháy đn, nó s b vô hiu hóa. Có th dùng du \ đ hin th ký t đt bit
$ trong chui.
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
________________________________________________________________________
15
exit 0
Kt xut khi thc thi script:
Hi there
message : Hi there
message : $myvar
message : $myvar
Enter some text
Hello World
$myvar now equals Hello World
Cách chng trình làm vic:
Bin myvar đc to ra và khi gán giá tr chui Hi there. Ni dung ca bin sau
đó đc hin th bng lnh echo trong các trng hp bc chuôi bng nháy kép, nháy đn
và du hin th ký t đc bit \. Tóm li 'nu mun thay th ni dung bin trong mt
chui, cn bc chui bng nháy kép. Nu mun hin th toàn b
ni dung chui, hãy dùng
nháy đn.
3.1.2. Biên môi trng (environment variable)
Khi trình shell khi đng nó cung cp sn mt s bin đc khai báo và gán tr
mc đnh. Chúng đc gi là các bin môi trng. Các bin này thng đc vit hoa đ
phân bit vi bin do ngi dùng t đnh ngha (thng là ký t không hoa). Ni dung
các bin này thng tùy vào thit lp ca h thng và ngi qun tr cho phép ngi
dùng h thng s dng. Danh shell ca các bin môi trng là khá nhiu, nhng nhìn
chung nên nh mt s bin môi trng ch yu sau:
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).
3.1.3. Bin tham s (parameter variable)
Nu cn tip nhn tham s trên dòng lnh đ x lý, có th dùng thêm các bin môi
trng sau:
Bin tham s Ý ngha
$1, $2, $3 . . . V trí và ni dung ca các tham s trên dòng lnh theo th t t
trái sang phi.
S* Danh shell ca tt c các tham s trên dòng lnh. Chúng đc lu
trong mt chui duy nht phn cách bng ký t đu tiên quy đnh
trong bin $IFS
$@ Danh shell các tham s đc chuyn thành chui. Không s dng
du phân cách ca bin IFS.
hiu rõ s khác bit ca bin $ * và $@, hãy xem ví d sau:
$IFS= "A”
$set foo bar bam
$echo “$@”
foo bar bam
$echo "$*”
foo^ bar^bam
$unset IFS
$echo "$*"
foo bar bam
Ta nhn thy, lnh set tip nhnn 3 tham s trên dòng lnh là foo bar bam. Chúng nh
hng đn bin môi trng $* và $@. Khi IFS đc qui đinh là ký t ^ , $* cha danh
shell các tham s phân cách bng ký t ^ . Khi đt IFS v NULL bng lnh unset, bin $*
tr v danh shell thun tuý ca các tham s tng t bin $@.
Bin $# s cha s tham s ca lnh, trong tr
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
echo $salutation
echo "The script is now complete"
exit 0
Lu tên tp là try-variables.sh, đi thuc tính thc thi x cho tp tin bng lnh:
$chmod +x try_variablebles.sh
Khi chy try-variables.sh t dòng lnh, bn s nhn đc kt qa kt xut nh
sau:
$./try_variables.sh foo bar baz
Hello
The program . /try_vanables.sh is now running
The second parameter was bar
The first parameter was foo
The parameter list was foo bar baz
The user's home directory is /home/xyz #tên ngi dùng login là xyz
please enter a new greeting
Xin chao!
Xin chao!
The scnpt is now complete
3.2. iu kin
Nn tng c bn trong tt c ngôn ng lp trình, đó là kh nng kim tra điu kin
và đa ra quyt đnh r nhánh thích h
p tùy theo điu kin đúng hay sai. Trc khi tìm
hiu cu trúc điu khin ca ngôn ng script, ta hãy xem qua cách kim tra đi kin.
Mt script ca shell có th kim tra mã li tr v ca bt k lnh nào có khá nng
triu gi t dòng lnh, bao gm nhng tp tin lnh script khác. Ó là lý do ti sao
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:
if test -f hello.c
then
. . .
fi
Cng có th s dng [ ] đ thay th test
if [-f hello.c ]
then
. . .
fi
Mà li và giá tr tr v ca lnh mà test kim tra s quyt đnh điu kin kim tra
là
đúng hay sai.
Lu ý, phi đt khong trng gia lnh [ ] và biu thc kim tra. d nh th
xem [ ] tng đng vi lnh test, và d nhiên gia mt lnh và tham s truyn
cho lnh phi phân cách nhau bng khong trng đ trình biên dch có th hiu.
Nu thích đt t khóa then chung mt dòng vi lnh if, bn phi phân cách then
bng du chm phy (;) nh sau:
if [ -f hello.c ] ; then
. . .
fi
iu kin mà lnh test cho phép kim tra có th ri vào mt trong 3 kiu sau:
So sánh chui
So sánh Kt qu
stringl = string2 true nu 2 chui bàng nhau (chính xác tng ký t)
tring1 != string2 true nu 2 chui không bng nhau
-n string1 true nu string1 không rng
-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
-u file true nu set-ser-id đc áp đt trên file
-w file true nu file cho phép ghi
-x file true nu file đc phép thc thi
Lu ý v mt lch s thì tùy chn -e không kh chuyn (portable) và -f th
ng đc s
dng thay th.
Câu hi có th đt ra là set-group-id và set-ser-id (còn đc gi là set-gid và set-
uid) mang ý ngha gì. Set-uid cho phép chng trình quyn ca ch th s hu
(owner) thay vì quyn ca user thông thng. Tng t set-gid cho phép chng
trình quyn ca nhóm.
Tt cá các điu kin kim tra tp tin đu yêu cu file phi tn ti trc đó (có
ngha là lnh test -f filename phi đc gi trc). Lnh test hay [ ] còn có thêm nhiu
điu kin kim tra khác na, nhng hin thi ta cha dùng đn. Có th tham kho chi tit
test bng lnh help test t du nhc ca h thng.
3.3. Cu trúc điu khin
Shell cung cp cu trúc lnh điu khin rt ging vi các ngôn ng lp trình khác
đó là if, elif, for, while, until, case. i vi mt vài cu trúc lnh (ví d nh case), shell
đa ra cách x lý uyn chuyn và mnh m hn. Nhng cu trúc điu khin khác nu có
thay đi ch là nhng thay đi nh không đáng k.
Trong các phn sau statements đc hiu là biu thc lnh (có th bao gm mt
tp hp các lnh) s đc thc thi khi điu kin kim tra condition đc tho
mãn.
1 3.3.1. Lnh if
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
Kt qu kt xut ca script
$./ if_control.sh
Is it mornining ? Please answer yes or no
yes
Good morning
$
ví d trên chúng ta đã s dng cú pháp [ ] đ kim tra điu kin thay cho lnh test.
Biu thc kim tra xem ni dung ca bin $timeofday có khp vi chui "yes" hay
không. Nu có thì lnh echo cho in ra chui “Good morningg”, nu không (mnh đ else)
in ra chui “Goođ afternoon".
Shell không đòi hi phi canh l hay tht đu dòng cho tng lnh. Chúng ta canh
l đ có pháp đc rõ ràng. Mc dù vy sau này bn s thy ngôn ng ca
chng trình make s yêu cu canh l và xem đó là yêu cu đ nhn dng lnh.
3.3 2. Lnh elif
Tht không may, có rt nhiu vn đ phát sinh vi đon trình script trên. Tt c tr
li khác vi “yes” đu có ngha là “no”. Chúng ta có th khc phc điu này bng cách
dùng cu trúc điu khin elif. Mnh đ này cho phép kim tra điu kin ln th hai bên
trong else. Script di đãy ca có th đc sa đi hoàn chnh hn, bao gm c in ra
thông báo li nu ngi dùng không nhp đúng câu tr li “yes” hoc “no”.
Ví du 3-4: elif_control.sh
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
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
elif trong ví d trên khc phc đc hu ht các điu kin nhp li
u và yêu cu
ngi dùng nhp đúng trc khi ra quyt đnh thc thi tip theo. Mc dù vy, có mt vn
đ khá tinh t còn li, nu chy li elif_control.sh nói trên, nhng thay vì nhp vào mt
chui nào đó, hãy gõ Enter (to chui rng cho bin $timeofday), s nhn đc thông báo
li ca shell nh sau:
[ : = : unary operator expected
iu gì xy ra ? Li phát sinh ngay mnh đ if đu tiên. Khi bin timeofday đc kim
tra nó cho tr là rng và do đó lnh if s đc shell din dch thành:
if [= “yes " ]
và d nhiên shell không hiu phi so sánh chui “yes" vi cái gì. tránh li này cn bc
ni dung bin bng du bao chui nh sau:
if [ “$timeofdayl” ="yes”]
Trong trng hp này nu chui nhp vào là rng, shell s din dch biu thc thành:
if [ “ “ =”yes”]
và script s chy tt. Elif_control.sh có th sa li hoàn chnh hn nh sau:
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
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
mt bin hoc biu thc khác.
Cú pháp:
for variable in values
do
statemens
done
Ví d sau s in ra các giá tr chui trong tp hp:
Ví du 3-6: for_loop.sh
#!/bin/sh
for foo in bar fud 13
do
echo $foo
done
exit 0
Kt qu kt xut s là
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
23
$./ 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
ta tìm hiu chi tit hn trong phn sau). Danh shell ca các phn t trong lnh for đc
cung cp bi kt qu tr v ca lnh ls f* và đc bc trong cp lnh m rng bin $ ( ) .
Bin m rng nm trong du bao $ (command) ch đc xác đinh khi lnh
command thc thi xong.
3.3.5. Lnh while
Mc dù lnh for cho phép lp trong mt tp hp giá tr bit trc, nhng trong
trng hp mt tp hp ln hoc s ln lp không bit trc, thì for không thích hp. Ví
d .
for foo in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
echo $foo
done
Lnh while cho phép thc hin lp vô hn khi điu kin kim tra vn còn đúng.
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
24
Cú pháp ca while nh sau:
while condition do
statements
done
Ví d sau s cho thy cách while liên tc kim tra mt khu (password) ca ngi dùng
cho đn khi đúng bng chui secret, mi chp nhn.
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
#!/bin/sh
foo=1
while [ "$foo" -le 16 ]
do
echo "Here $foo"
foo=$(($foo+1))
done
exit 0
Lu ý, cú pháp $( ( ) ) do shell ksh đã xng. Cú pháp này dùng đ đánh giá và
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son
LINUX, Lp trình shell
________________________________________________________________________
25
c lng mt biu thc. Vi các shell c khác có th thay th cú pháp này bng
lnh expr. Tuy nhiên expr không hiu qu. Bt c khi nào, nu có th hãy nên
dùng $ ( ( ) ) thay cho expr.
script while_for.sh s dng lnh [ ] đ kim tra giá tr ca bin $foo vn còn nh hn hay
bng 16 hay không. Nu còn, lnh lp while s in ra tng cng dn ca bin $foo.
3.3.6. Lnh intil
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:
$./until_user.sh xyz
Locate for user . . .
Script s ri vào vòng lp ch user tên là xyz dng nhp. Hãy nhp t mt màn hình khác
(vi user tên là xyz), ta s thy màn hình đu tiên đa ra thông báo cho thy vòng lp
until ch
m dt
* * * * * xyz has just logged in * * * * *
Cách chng trình làm vic:
________________________________________________________________________
Hunh Thúc Cc, Vin CNTT tp hp và biên son