3.8 Shell - mo
ˆ
˙
t ngôn ngu
˜
’
la
ˆ
˙
p trình 45
• file1 -ot file2
D
¯
úng, ne
ˆ
´
u ta
ˆ
˙
p tin file1 "già" ho
’
n file1 (tru
’
o
`
’
ng ho
˙
’
p ngu
’
o
˙
’
c la
˙
i cu
’
a tru
’
o
`
’
ng ho
˙
’
p trên).
• file1 -ef file2
D
¯
úng, ne
ˆ
´
u ta
ˆ
˙
p tin file1 và file2 có cùng mo
ˆ
˙
t so
ˆ
´
thie
ˆ
´
t bi
˙
và chı
’
so
ˆ
´
mô ta
’
inode.
• -o optname
D
¯
úng, ne
ˆ
´
u tùy cho
˙
n optname cu
’
a he
ˆ
˙
vo
’
d
¯
u
’
o
˙
’
c kích hoa
˙
t. Chi tie
ˆ
´
t xin xem trên trang
man bash.
• -z string
D
¯
úng, ne
ˆ
´
u d
¯
o
ˆ
˙
dài cu
’
a chuo
ˆ
˜
i string ba
˘
`
ng không.
• -n string
D
¯
úng, ne
ˆ
´
u d
¯
o
ˆ
˙
dài cu
’
a chuo
ˆ
˜
i khác không.
• string1 == string2
D
¯
úng, ne
ˆ
´
u hai chuo
ˆ
˜
i trùng nhau. Có the
ˆ
’
thay hai == ba
˘
`
ng mo
ˆ
˙
t =.
• string1 !== string2
D
¯
úng, ne
ˆ
´
u hai chuo
ˆ
˜
i không trùng nhau.
• string1 < string2
D
¯
úng, ne
ˆ
´
u chuo
ˆ
˜
i string1, theo tu
`
’
d
¯
ie
ˆ
’
n, d
¯
u
´
’
ng tru
’
o
´
’
c chuo
ˆ
˜
i string2 (d
¯
o
ˆ
´
i vo
´
’
i ngôn
ngu
˜
’
hie
ˆ
˙
n tho
`
’
i).
• string1 > string2
D
¯
úng, ne
ˆ
´
u chuo
ˆ
˜
i string1, theo tu
`
’
d
¯
ie
ˆ
’
n, d
¯
u
´
’
ng sau chuo
ˆ
˜
i string2 (d
¯
o
ˆ
´
i vo
´
’
i ngôn ngu
˜
’
hie
ˆ
˙
n tho
`
’
i).
• arg1 OP arg2
O
’
’
d
¯
ây OP là mo
ˆ
˙
t trong các phép so sánh so
ˆ
´
ho
˙
c: -eq (ba
˘
`
ng), -ne (khác, không ba
˘
`
ng),
-lt (nho
’
ho
’
n), -le (nho
’
ho
’
n hoa
˘
˙
c ba
˘
`
ng), -gt (lo
´
’
n ho
’
n), -ge (lo
´
’
n ho
’
n hoa
˘
˙
c ba
˘
`
ng).
O
’
’
cho
ˆ
˜
các tham so
ˆ
´
arg1 và arg2 có the
ˆ
’
su
’
’
du
˙
ng các so
ˆ
´
nguyên (âm hoa
˘
˙
c du
’
o
’
ng).
Tu
`
’
các bie
ˆ
’
u thu
´
’
c d
¯
ie
ˆ
`
u kie
ˆ
˙
n co
’
ba
’
n này có the
ˆ
’
xây du
˙
’
ng các bie
ˆ
’
u thu
´
’
c phu
´
’
c ta
˙
p theo ý
muo
ˆ
´
n nho
`
’
các phép lôgíc thông thu
’
o
`
’
ng PHU
’
D
¯
I
˙
NH, VÀ (co
ˆ
˙
ng) và HOA
˘
˙
C:
• !(expression)
Phép phu
’
d
¯
i
˙
nh. D
¯
úng, ne
ˆ
´
u bie
ˆ
’
u thu
´
’
c sai.
• expression1 -a expression2
Phép co
ˆ
˙
ng lôgic AND. D
¯
úng ne
ˆ
´
u ca
’
hai bie
ˆ
’
u thu
´
’
c d
¯
e
ˆ
`
u d
¯
úng.
• expression1 -o expression2
Phép lôgíc hoa
˘
˙
c OR. D
¯
úng ne
ˆ
´
u mo
ˆ
˙
t trong hai bie
ˆ
’
u thu
´
’
c d
¯
úng.
46 Bash
3.8.3 Toán tu
’
’
case
Da
˙
ng cu
’
a toán tu
’
’
case nhu
’
sau:
case word in [ [(] pattern [ | pattern ] ) list ;; ] + esac
Câu le
ˆ
˙
nh case d
¯
a
ˆ
`
u tiên khai trie
ˆ
’
n tu
`
’
word, và so sánh nó (word) vo
´
’
i mo
ˆ
˜
i tu
`
’
trong ma
ˆ
˜
u
pattern theo thu
´
’
tu
˙
’
. Sau khi tìm tha
ˆ
´
y su
˙
’
trùng nhau d
¯
a
ˆ
`
u tiên thì du
`
’
ng vie
ˆ
˙
c so sánh la
˙
i, và
thu
˙
’
c hie
ˆ
˙
n danh sách list các câu le
ˆ
˙
nh d
¯
u
´
’
ng sau ma
ˆ
˜
u d
¯
ã tìm tha
ˆ
´
y. Giá tri
˙
tra
’
la
˙
i bo
’
’
i toán tu
’
’
này, ba
˘
`
ng 0, ne
ˆ
´
u không tìm tha
ˆ
´
y su
˙
’
trùng nhau nào. Trong tru
’
o
`
’
ng ho
˙
’
p ngu
’
o
˙
’
c la
˙
i, tra
’
la
˙
i giá tri
˙
mà câu le
ˆ
˙
nh cuo
ˆ
´
i cùng trong danh sách list d
¯
u
’
a ra. Ví du
˙
su
’
’
du
˙
ng toán tu
’
’
case sau la
ˆ
´
y tu
`
’
script /etc/rc.d/rc.sysinit (FreeBSD-style):
kênh giao tác
case "$UTC" in
yes|true)
CLOCKFLAGS="$CLOCKFLAGS -u";
CLOCKDEF="$CLOCKDEF (utc)";
;;
no|false)
CLOCKFLAGS="$CLOCKFLAGS localtime";
CLOCKDEF="$CLOCKDEF (localtime)";
;;
esac
Ne
ˆ
´
u bie
ˆ
´
n so
ˆ
´
(UTC) nha
ˆ
˙
n giá tri
˙
yes hoa
˘
˙
c true, thì se
˜
thu
˙
’
c hie
ˆ
˙
n ca
˘
˙
p le
ˆ
˙
nh thu
´
’
nha
ˆ
´
t, nha
ˆ
˙
n
giá tri
˙
no hoa
˘
˙
c false - ca
˘
˙
p thu
´
’
hai.
3.8.4 Toán tu
’
’
select
Toán tu
’
’
select cho phép to
ˆ
’
chu
´
’
c ho
ˆ
˙
i thoa
˙
i vo
´
’
i ngu
’
o
`
’
i dùng. Nó có da
˙
ng sau:
select name [ in word; ] do list; done
Lúc d
¯
a
ˆ
`
u tu
`
’
ma
ˆ
˜
u word hình thành mo
ˆ
˙
t danh sách nhu
˜
’
ng tu
`
’
tu
’
o
’
ng u
´
’
ng vo
´
’
i ma
ˆ
˜
u này. Ta
ˆ
˙
p
ho
˙
’
p nhu
˜
’
ng tu
`
’
này d
¯
u
’
o
˙
’
c d
¯
u
’
a vào kênh thông báo lo
ˆ
˜
i tiêu chua
ˆ
’
n, ho
’
n nu
˜
’
a mo
ˆ
˜
i tu
`
’
d
¯
u
’
o
˙
’
c d
¯
i kèm
vo
´
’
i mo
ˆ
˙
t so
ˆ
´
thu
´
’
tu
˙
’
. Ne
ˆ
´
u ma
ˆ
˜
u word bi
˙
bo
’
qua (không có trong toán tu
’
’
select), thì se
˜
d
¯
u
’
a vào
các tham bie
ˆ
´
n vi
˙
trí (xem trên) theo mo
ˆ
˙
t cách tu
’
o
’
ng tu
˙
’
. Sau d
¯
ó, da
ˆ
´
u nha
˘
´
c PS3 d
¯
u
’
o
˙
’
c d
¯
u
’
a ra,
và he
ˆ
˙
vo
’
cho
`
’
chuo
ˆ
˜
i nha
ˆ
˙
p vào trên d
¯
a
ˆ
`
u vào tiêu chua
ˆ
’
n. Ne
ˆ
´
u chuo
ˆ
˜
i nha
ˆ
˙
p vào có chu
´
’
a so
ˆ
´
, tu
’
o
’
ng
u
´
’
ng vo
´
’
i mo
ˆ
˙
t trong các so
ˆ
´
d
¯
ã hie
ˆ
˙
n ra, thì bie
ˆ
´
n name se
˜
d
¯
u
’
o
˙
’
c gán giá tri
˙
ba
˘
`
ng tu
`
’
d
¯
i kèm vo
´
’
i so
ˆ
´
này. Ne
ˆ
´
u nha
ˆ
˙
p vào mo
ˆ
˙
t dòng ro
ˆ
˜
ng, thì so
ˆ
´
và tu
`
’
se
˜
d
¯
u
’
o
˙
’
c hie
ˆ
˙
n ra them mo
ˆ
˙
t la
ˆ
`
n nu
˜
’
a. Ne
ˆ
´
u nha
ˆ
˙
p
vào ba
ˆ
´
t ky
`
mo
ˆ
˙
t giá tri
˙
nào khác, thì bie
ˆ
´
n name se
˜
nha
ˆ
˙
n giá tri
˙
ba
˘
`
ng không. Chuo
ˆ
˜
i mà ngu
’
o
`
’
i
dùng nha
ˆ
˙
p vào, d
¯
u
’
o
˙
’
c ghi la
˙
i trong bie
ˆ
´
n REPLY. Danh sách le
ˆ
˙
nh list d
¯
u
’
o
˙
’
c thu
˙
’
c hie
ˆ
˙
n vo
´
’
i giá
tri
˙
bie
ˆ
´
n name d
¯
ã cho
˙
n. Sau d
¯
ây là mo
ˆ
˙
t script nho
’
(xin hãy gõ không da
ˆ
´
u ne
ˆ
´
u console cu
’
a ba
˙
n
chu
’
a ho
ˆ
˜
tro
˙
’
vie
ˆ
˙
c hie
ˆ
’
n thi
˙
Tie
ˆ
´
ng Vie
ˆ
˙
t):
kênh giao tác
#!/bin/sh
echo "Ba
˙
n thích dùng OS nào?"
select var in "Linux" "Gnu Hurd" "Free BSD" "MacOSX" "Solaris" "QNX" "Other"; do
break
done
echo "Ba
˙
n d
¯
ã cho
˙
n $var"
3.8 Shell - mo
ˆ
˙
t ngôn ngu
˜
’
la
ˆ
˙
p trình 47
Ghi d
¯
oa
˙
n trên vào mo
ˆ
˙
t ta
ˆ
˙
p tin (ví du
˙
, select.sh), thay d
¯
o
ˆ
’
i d
¯
e
ˆ
’
ta
ˆ
˙
p tin thành kha
’
thi (ví
du
˙
, chmod 755 select.sh), và cha
˙
y (./select.sh). Trên màn hình se
˜
hie
ˆ
˙
n ra câu
ho
’
i sau:
kênh giao tác
Ba
˙
n thích dùng OS nào?
1) Linux 3) Free BSD 5) Solaris 7) Other
2) Gnu Hurd 4) MacOSX 6) QNX
#?
Hãy nha
ˆ
´
n mo
ˆ
˙
t trong 7 so
ˆ
´
d
¯
u
’
a ra (tu
`
’
1 d
¯
e
ˆ
´
n 7). Ne
ˆ
´
u ba
˙
n nha
ˆ
˙
p 4 (nha
ˆ
´
n ca
’
<Enter>), thì se
˜
tha
ˆ
´
y thông báo sau:
kênh giao tác
Ba
˙
n d
¯
ã cho
˙
n MacOSX
3.8.5 Toán tu
’
’
for
Toán tu
’
’
for làm vie
ˆ
˙
c có khác mo
ˆ
˙
t chút so vo
´
’
i for trong cácngôn ngu
˜
’
la
ˆ
˙
p trình thông thu
’
o
`
’
ng.
Thay vì ta
˘
ng hoa
˘
˙
c gia
’
m giá tri
˙
cu
’
a mo
ˆ
˙
t bie
ˆ
´
n so
ˆ
´
nào d
¯
ó (lên hoa
˘
˙
c xuo
ˆ
´
ng) mo
ˆ
˙
t d
¯
o
’
n vi
˙
sau mo
ˆ
˜
i
vòng la
˘
˙
p, thì nó gán giá tri
˙
tie
ˆ
´
p theo trong danh sách tu
`
’
d
¯
u
’
a sa
˘
˜
n cho bie
ˆ
´
n d
¯
ó trong
mo
ˆ
˜
i vòng la
˘
˙
p. Nói chung ca
ˆ
´
u trúc có da
˙
ng sau:
for name in words do list done
Quy lua
ˆ
˙
t xây du
˙
’
ng danh sách le
ˆ
˙
nh (list) gio
ˆ
´
ng trong toán tu
’
’
if. Ví du
˙
. Script sau ta
˙
o
các ta
ˆ
˙
p tin fu1, fu2, và fu3:
kênh giao tác
for a in 1 2 3 ; do
touch fu$a
done
Có the
ˆ
’
gõ ba dòng này trên mo
ˆ
˙
t dòng le
ˆ
˙
nh, ke
ˆ
´
t qua
’
thu d
¯
u
’
o
˙
’
c tu
’
o
’
ng tu
˙
’
vo
´
’
i script. Da
˙
ng
to
ˆ
’
ng quát cu
’
a toán tu
’
’
for nhu
’
sau:
for name [ in word; ] do list ; done
D
¯
a
ˆ
`
u tiên cu
˜
ng xa
’
y ra su
˙
’
khai trie
ˆ
’
n tu
`
’
word theo quy lua
ˆ
˙
t khai trie
ˆ
’
n bie
ˆ
’
u thu
´
’
c (xem trên).
Sau d
¯
ó bie
ˆ
´
n name la
ˆ
`
n lu
’
o
˙
’
t d
¯
u
’
o
˙
’
c gán các giá tri
˙
thu d
¯
u
’
o
˙
’
c tu
`
’
su
˙
’
khai trie
ˆ
`
n này, và thu
˙
’
c hie
ˆ
˙
n
danh sách le
ˆ
˙
nh list trong mo
ˆ
˜
i la
ˆ
`
n nhu
’
va
ˆ
˙
y. Ne
ˆ
´
u không có "in word", thì danh sách le
ˆ
˙
nh
list d
¯
u
’
o
˙
’
c thu
˙
’
c hie
ˆ
˙
n mo
ˆ
˙
t la
ˆ
`
n cho mo
ˆ
˜
i tham bie
ˆ
´
n vi
˙
trí d
¯
ã d
¯
u
’
a ra. Trên Linux có
chu
’
o
’
ng trình seq, tie
ˆ
´
p nha
ˆ
˙
n hai so
ˆ
´
nguyên làm tham so
ˆ
´
, và d
¯
u
’
a ra chuo
ˆ
˜
i ta
ˆ
´
t ca
’
các so
ˆ
´
na
˘
`
m
giu
˜
’
a hai so
ˆ
´
này (co
ˆ
˙
ng thêm ca
’
chúng). Nho
`
’
câu le
ˆ
˙
nh này có the
ˆ
’
su
’
’
du
˙
ng for cu
’
a bash làm
vie
ˆ
˙
c nhu
’
toán tu
’
’
for trong các ngôn ngu
˜
’
la
ˆ
˙
p trình thông thu
’
o
`
’
ng. D
¯
e
ˆ
’
làm d
¯
u
’
o
˙
’
c d
¯
ie
ˆ
`
u này chı
’
ca
ˆ
`
n vie
ˆ
´
t vòng la
˘
˙
p for nhu
’
sau:
kênh giao tác
for a in $( seq 1 6 ) ; do
cat fu$a
done
Câu le
ˆ
˙
nh (script) này d
¯
u
’
a ra màn hình no
ˆ
˙
i dung cu
’
a 10 ta
ˆ
˙
p tin (ne
ˆ
´
u có): "fu1", , "fu10".
48 Bash
3.8.6 Toán tu
’
’
while và until
Toán tu
’
’
while làm vie
ˆ
˙
c tu
’
o
’
ng tu
˙
’
nhu
’
if, nhu
’
ng vòng la
˘
˙
p các câu le
ˆ
˙
nh trong list2 chı
’
thu
˙
’
c hie
ˆ
˙
n khi d
¯
ie
ˆ
`
u kie
ˆ
˙
n còn d
¯
úng, và se
˜
ngu
`
’
ng khi d
¯
ie
ˆ
`
u kie
ˆ
˙
n không tho
’
a mãn. Ca
ˆ
´
u trúc có
da
˙
ng nhu
’
sau:
while list1 do list2 done
Ví du
˙
:
kênh giao tác
while [ -d directory ] ; do
ls -l directory >> logfile
echo SEPARATOR >> logfile
sleep 60
done
Chu
’
o
’
ng trình (script) trên se
˜
theo dõi và ghi la
˙
i no
ˆ
˙
i dung cu
’
a thu
’
mu
˙
c directory theo
tu
`
’
ng phút ne
ˆ
´
u thu
’
mu
˙
c còn to
ˆ
`
n ta
˙
i. Toán tu
’
’
until tu
’
o
’
ng tu
˙
’
nhu
’
toán tu
’
’
while:
until list1 do list2 done
D
¯
ie
ˆ
’
m khác bie
ˆ
˙
t na
˘
`
m o
’
’
cho
ˆ
˜
, su
’
’
du
˙
ng giá tri
˙
phu
’
d
¯
i
˙
nh cu
’
a d
¯
ie
ˆ
`
u kie
ˆ
˙
n list1, tu
´
’
c là list2
thu
˙
’
c hie
ˆ
˙
n, ne
ˆ
´
u câu le
ˆ
˙
nh cuo
ˆ
´
i cùng trong danh sách list1 tra
’
la
˙
i tra
˙
ng thái thoát ra khác
không.
3.8.7 Các hàm so
ˆ
´
Cú pháp He
ˆ
˙
vo
’
bash cho phép ngu
’
o
`
’
i dùng ta
˙
o các hàm so
ˆ
´
cho mình. Hàm so
ˆ
´
làm vie
ˆ
˙
c và
d
¯
u
’
o
˙
’
c su
’
’
du
˙
ng gio
ˆ
´
ng nhu
’
các câu le
ˆ
˙
nh thông thu
’
o
`
’
ng cu
’
a he
ˆ
˙
vo
’
, tu
´
’
c là chúng ta có the
ˆ
’
tu
˙
’
ta
˙
o
các câu le
ˆ
˙
nh mo
´
’
i. Hàm so
ˆ
´
có ca
ˆ
´
u trúc nhu
’
sau:
function name () { list }
Ho
’
n nu
˜
’
a tu
`
’
function không nha
ˆ
´
t thie
ˆ
´
t pha
’
i có, name xác d
¯
i
˙
nh tên cu
’
a hàm (dùng d
¯
e
ˆ
’
go
˙
i hàm), còn pha
ˆ
`
n thâm cu
’
a hàm so
ˆ
´
ta
˙
o bo
’
’
i danh sách các câu le
ˆ
˙
nh list, na
˘
`
m giu
˜
’
a { và }.
Các câu le
ˆ
˙
nh này se
˜
d
¯
u
’
o
˙
’
c thu
˙
’
c hie
ˆ
˙
n mo
ˆ
˜
i khi tên name d
¯
u
’
o
˙
’
c go
˙
i (gio
ˆ
´
ng nhu
’
mo
ˆ
˙
t le
ˆ
˙
nh thông
thu
’
o
`
’
ng). Ca
ˆ
`
n chú ý ra
˘
`
ng hàm có the
ˆ
’
là d
¯
e
ˆ
˙
qui, tu
´
’
c là go
˙
i hàm so
ˆ
´
o
’
’
ngay trong pha
ˆ
`
n thân cu
’
a
nó. Hàm so
ˆ
´
thu
˙
’
c hie
ˆ
˙
n trong pha
˙
m vi he
ˆ
˙
vo
’
hie
ˆ
˙
n tho
`
’
i: không có tie
ˆ
´
n trình mo
´
’
i nào d
¯
u
’
o
˙
’
c cha
˙
y
khi biên di
˙
ch hàm so
ˆ
´
(khác vo
´
’
i vie
ˆ
˙
c cha
˙
y script).
3.8.8 Tham so
ˆ
´
Khi hàm so
ˆ
´
d
¯
u
’
o
˙
’
c go
˙
i d
¯
e
ˆ
’
thu
˙
’
c hie
ˆ
˙
n, các tham so
ˆ
´
cu
’
a hàm se
˜
tro
’
’
thành các tham bie
ˆ
´
n vi
˙
trí
(positional parameters, xem trên) trong tho
`
’
i gian thu
˙
’
c hie
ˆ
˙
n hàm này. Chúng d
¯
u
’
o
˙
’
c d
¯
a
˘
˙
t các tên
nhu
’
$n, trong d
¯
ó n là so
ˆ
´
cu
’
a tham so
ˆ
´
mà chúng ta muo
ˆ
´
n su
’
’
du
˙
ng. Vie
ˆ
˙
c d
¯
ánh so
ˆ
´
ba
˘
´
t d
¯
a
ˆ
`
u tu
`
’
1, nhu
’
va
ˆ
˙
y $1 là tham so
ˆ
´
d
¯
a
ˆ
`
u tiên. Cu
˜
ng có the
ˆ
’
su
’
’
du
˙
ng ta
ˆ
´
t ca
’
các tham so
ˆ
´
mo
ˆ
˙
t lúc nho
`
’
$*,
và d
¯
u
’
a ra so
ˆ
´
thu
´
’
tu
˙
’
cu
’
a tham so
ˆ
´
nho
`
’
$# Tham so
ˆ
´
vi
˙
trí so
ˆ
´
0 không thay d
¯
o
ˆ
’
i. Trong khi thu
˙
’
c
hie
ˆ
˙
n ne
ˆ
´
u ga
˘
˙
p câu le
ˆ
˙
nh no
ˆ
˙
i trú return (trong pha
ˆ
`
n thâm cu
’
a hàm), thì hàm so
ˆ
´
se
˜
bi
˙
du
`
’
ng la
˙
i
và quye
ˆ
`
n d
¯
ie
ˆ
`
u khie
ˆ
’
n d
¯
u
’
o
˙
’
c trao cho câu le
ˆ
˙
nh d
¯
u
´
’
ng sau hàm. Khi thu
˙
’
c hie
ˆ
˙
n xong hàm so
ˆ
´
, các
tham bie
ˆ
´
n vi
˙
trí và tham bie
ˆ
´
n d
¯
a
ˆ
˙
c bie
ˆ
˙
t # se
˜
d
¯
u
’
o
˙
c tra
’
la
˙
i các giá tri
˙
mà chúng có tru
’
o
´
’
c khi cha
˙
y
hàm. Bie
ˆ
´
n no
ˆ
˙
i bo
ˆ
˙
(local)
Ne
ˆ
´
u muo
ˆ
´
n ta
˙
o mo
ˆ
˙
t tham bie
ˆ
´
n d
¯
i
˙
a phu
’
o
’
ng, có the
ˆ
’
su
’
’
du
˙
ng tu
`
’
khóa local. Cú pháp d
¯
u
’
a ra
bie
ˆ
´
n d
¯
i
˙
a phu
’
o
’
ng gio
ˆ
´
ng he
ˆ
˙
t các tham bie
ˆ
´
n khác, chı
’
có d
¯
ie
ˆ
`
u ca
ˆ
`
n d
¯
u
´
’
ng sau tu
`
’
khóa local:
3.9 Script cu
’
a he
ˆ
˙
vo
’
và le
ˆ
˙
nh source 49
local name=value. Du
’
o
´
’
i d
¯
ây là mo
ˆ
˙
t ví du
˙
hàm so
ˆ
´
, thu
˙
’
c hie
ˆ
˙
n công vie
ˆ
˙
c cu
’
a le
ˆ
˙
nh seq d
¯
ã
nha
˘
´
c d
¯
e
ˆ
´
n o
’
’
trên:
kênh giao tác
seq()
{
local I=$1;
while [ $2 != $I ]; do
{
echo -n "$I ";
I=$(( $I + 1 ))
};
done;
echo $2
}
Ca
ˆ
`
n chú ý d
¯
e
ˆ
´
n tùy cho
˙
n -n cu
’
a echo, nó (tùy cho
˙
n) hu
’
y bo
’
vie
ˆ
˙
c ta
˙
o dòng mo
´
’
i. Ma
˘
˙
c dù
tùy cho
˙
n này không có nhie
ˆ
`
u ý nghı
˜
a vo
´
’
i mu
˙
c d
¯
ích chúng ta muo
ˆ
´
n o
’
’
d
¯
ây, nhu
’
ng se
˜
ra
ˆ
´
t có ích
trong các hàm so
ˆ
´
vo
´
’
i mu
˙
c d
¯
ích khác. Hàm so
ˆ
´
tính giai thu
`
’
a fact Mo
ˆ
˙
t ví du
˙
khác:
kênh giao tác
fact()
{
if [ $1 = 0 ]; then
echo 1;
else
{
echo $(( $1 * $( fact $(( $1 1 )) ) ))
};
fi
}
D
¯
ây là hàm so
ˆ
´
giai thu
`
’
a, mo
ˆ
˙
t ví du
˙
cu
’
a hàm d
¯
e
ˆ
˙
qui. Hãy chú ý d
¯
e
ˆ
´
n su
˙
’
khai trie
ˆ
’
n so
ˆ
´
ho
˙
c,
và phép the
ˆ
´
các câu le
ˆ
˙
nh.
3.9 Script cu
’
a he
ˆ
˙
vo
’
và le
ˆ
˙
nh source
Script cu
’
a he
ˆ
˙
vo
’
chı
’
là các ta
ˆ
˙
p tin có chu
´
’
a chuo
ˆ
˜
i le
ˆ
˙
nh. Tu
’
o
’
ng tu
˙
’
hàm so
ˆ
´
script có the
ˆ
’
d
¯
u
’
o
˙
’
c
thu
˙
’
c hie
ˆ
˙
n nhu
’
mo
ˆ
˙
t câu le
ˆ
˙
nh. Cú pháp truy ca
ˆ
˙
p d
¯
e
ˆ
´
n các tham so
ˆ
´
cu
˜
ng nhu
’
hàm so
ˆ
´
. Trong các
tru
’
o
`
’
ng ho
˙
’
p thông thu
’
o
`
’
ng khi cha
˙
y script se
˜
có mo
ˆ
˙
t tie
ˆ
´
n trình mo
´
’
i d
¯
u
’
o
˙
’
c cha
˙
y. D
¯
e
ˆ
’
có the
ˆ
’
thu
˙
’
c
hie
ˆ
˙
n script o
’
’
trong ba
’
n bash hie
ˆ
˙
n tho
`
’
i, ca
ˆ
`
n su
’
’
du
˙
ng câu le
ˆ
˙
nh source, hay mo
ˆ
˙
t da
ˆ
´
u cha
ˆ
´
m "."
(d
¯
o
ˆ
`
ng nghı
˜
a cu
’
a source). Trong tru
’
o
`
’
ng ho
˙
’
p này script chı
’
d
¯
o
’
n gia
’
n là mo
ˆ
˙
t tham so
ˆ
´
cu
’
a le
ˆ
˙
nh
nói trên. Câu le
ˆ
˙
nh se
˜
có da
˙
ng:
source filename [arguments]
Câu le
ˆ
˙
nh này d
¯
o
˙
c và thu
˙
’
c hie
ˆ
˙
n các câu le
ˆ
˙
nh có trong ta
ˆ
˙
p tin filename trong môi tru
’
o
`
’
ng
hie
ˆ
˙
n tho
`
’
i, và tra
’
la
˙
i giá tri
˙
, xác d
¯
i
˙
nh bo
’
’
i câu le
ˆ
˙
nh cuo
ˆ
´
i cùng cu
’
a filename. Ne
ˆ
´
u filename
không chu
´
’
a da
ˆ
´
u ga
˙
ch chéo, thì d
¯
u
’
o
`
’
ng da
ˆ
˜
n, lie
ˆ
˙
t kê trong bie
ˆ
´
n so
ˆ
´
PATH, se
˜
d
¯
u
’
o
˙
’
c su
’
’
du
˙
ng d
¯
e
ˆ
’
tìm ta
ˆ
˙
p tin có tên filename. Ta
ˆ
˙
p tin này không nha
ˆ
´
t thie
ˆ
´
t pha
’
i kha
’
thi (không nha
ˆ
´
t thie
ˆ
´
t
pha
’
i có bit x). Ne
ˆ
´
u trong thu
’
mu
˙
c, lie
ˆ
˙
t kê trong PATH, không tìm tha
ˆ
´
y ta
ˆ
˙
p tin ca
ˆ
`
n, thì se
˜
tìm
nó (ta
ˆ
˙
p tin) trong thu
’
mu
˙
c hie
ˆ
˙
n tho
`
’
i. Ne
ˆ
´
u có các tham so
ˆ
´
(d
¯
u
’
a ra arguments, xem d
¯
i
˙
nh da
˙
ng
50 Bash
câu le
ˆ
˙
nh o
’
’
trên), thì trong tho
`
’
i gian thu
˙
’
c hie
ˆ
˙
n script chúng se
˜
thành các tham bie
ˆ
´
n vi
˙
trí. Ne
ˆ
´
u
không có tham so
ˆ
´
, thì tham bie
ˆ
´
n vi
˙
trí không thay d
¯
o
ˆ
’
i. Giá tri
˙
(tra
˙
ng thái), mà le
ˆ
˙
nh source
tra
’
la
˙
i, trùng vo
´
’
i giá tri
˙
, tra
’
la
˙
i bo
’
’
i câu le
ˆ
˙
nh cuo
ˆ
´
i cùng trong script. Ne
ˆ
´
u không câu le
ˆ
˙
nh nào
d
¯
u
’
o
˙
’
c thu
˙
’
c hie
ˆ
˙
n, hoa
˘
˙
c không tìm tha
ˆ
´
y ta
ˆ
˙
p tin filename, thì tra
˙
ng thái thoát ba
˘
`
ng 0.
3.10 Câu le
ˆ
˙
nh sh
Ba
˙
n luôn luôn có the
ˆ
’
cha
˙
y mo
ˆ
˙
t ba
’
n sao cu
’
a he
ˆ
˙
vo
’
bash nho
`
’
câu le
ˆ
˙
nh bash hay sh. Khi này
có the
ˆ
’
ba
˘
´
t ba
’
n sao này cha
˙
y mo
ˆ
˙
t script nào d
¯
ó, ne
ˆ
´
u d
¯
u
’
a tên cu
’
a script nhu
’
mo
ˆ
˙
t tham so
ˆ
´
cho
le
ˆ
˙
nh bash. Nhu
’
va
ˆ
˙
y, d
¯
e
ˆ
’
thu
˙
’
c hie
ˆ
˙
n script myscript ca
ˆ
`
n d
¯
u
’
a câu le
ˆ
˙
nh "sh myscript".
Ne
ˆ
´
u xem no
ˆ
˙
i dung cu
’
a mo
ˆ
˙
t ta
ˆ
˙
p tin script nào d
¯
ó (nhu
˜
’
ng ta
ˆ
˙
p tin nhu
’
va
ˆ
˙
y có ra
ˆ
´
t nhie
ˆ
`
u trên
he
ˆ
˙
tho
ˆ
´
ng), ba
˙
n se
˜
tha
ˆ
´
y dòng d
¯
a
ˆ
`
u tiên có da
˙
ng sau: #!/bin/sh. D
¯
ie
ˆ
`
u này có nghı
˜
a là, khi
chúng ta go
˙
i script d
¯
e
ˆ
’
thu
˙
’
c hie
ˆ
˙
n nhu
’
mo
ˆ
˙
t le
ˆ
˙
nh thông thu
’
o
`
’
ng, thì /bin/sh se
˜
giúp chúng ta
"thu xe
ˆ
´
p" mo
˙
i thu
´
’
. Có the
ˆ
’
thay the
ˆ
´
dòng này bo
’
’
i liên ke
ˆ
´
t d
¯
e
ˆ
´
n ba
ˆ
´
t ky
`
mo
ˆ
˙
t chu
’
o
’
ng trình nào,
mà se
˜
d
¯
o
˙
c ta
ˆ
˙
p tin và thu
˙
’
c hie
ˆ
˙
n các câu le
ˆ
˙
nh tu
’
o
’
ng u
´
’
ng. Ví du
˙
, script trên ngôn ngu
˜
’
Perl ba
˘
´
t
d
¯
a
ˆ
`
u bo
’
’
i dòng có da
˙
ng !/bin/perl. Mo
ˆ
˙
t chú ý khác là ký tu
˙
’
# dùng d
¯
e
ˆ
’
vie
ˆ
´
t lo
`
’
i chú thích
trong script. Ta
ˆ
´
t ca
’
nhu
˜
’
ng gì d
¯
u
´
’
ng sau ký tu
˙
’
này d
¯
e
ˆ
´
n cuo
ˆ
´
i dòng se
˜
d
¯
u
’
o
˙
’
c coi là chú thích và bi
˙
bash bo
’
qua (tu
´
’
c là he
ˆ
˙
vo
’
se
˜
không xem dòng này là câu le
ˆ
˙
nh). Ne
ˆ
´
u ba
˙
n muo
ˆ
´
n kie
ˆ
’
m chu
´
’
ng
la
˙
i tác du
˙
ng cu
’
a ký tu
˙
’
này, thì hãy nha
ˆ
˙
p vào dòng le
ˆ
˙
nh mo
ˆ
˙
t câu le
ˆ
˙
nh ba
ˆ
´
t ky
`
, và d
¯
a
˘
˙
t tru
’
o
´
’
c nó
(câu le
ˆ
˙
nh) ký tu
˙
’
#, ví du
˙
"# ls", ba
˙
n se
˜
tha
ˆ
´
y ra
˘
`
ng he
ˆ
˙
vo
’
bo
’
’
qua câu le
ˆ
˙
nh này.
Chúng ta se
˜
du
`
’
ng bài ho
˙
c nga
˘
´
n go
˙
n ve
ˆ
`
bash ta
˙
i d
¯
ây. Ta
ˆ
´
t nhiên, còn ra
ˆ
´
t nhie
ˆ
`
u va
ˆ
´
n d
¯
e
ˆ
`
quan
tro
˙
ng ca
ˆ
`
n xem xét nhu
’
ng na
˘
`
m ngoài pha
˙
m vi cu
’
a bài ho
˙
c, ví du
˙
, qua
’
n lý tie
ˆ
´
n trình, li
˙
ch su
’
’
câu
le
ˆ
˙
nh, mô ta
’
ve
ˆ
`
thu
’
vie
ˆ
˙
n readline, tín hie
ˆ
˙
u, v.v. . . Các ba
˙
n se
˜
tìm tha
ˆ
´
y thông tin ca
ˆ
`
n thie
ˆ
´
t trong
các cuo
ˆ
´
n hu
’
o
´
’
ng da
ˆ
˜
n khác hoa
˘
˙
c trên trang man bash.