3.7 Khai trie
ˆ
’
n bie
ˆ
’
u thu
´
’
c 39
kênh giao tác
[user]$ export name=value
Trong tru
’
o
`
’
ng ho
˙
’
p này, ta
ˆ
´
t ca
’
các chu
’
o
’
ng trình cha
˙
y tu
`
’
he
ˆ
˙
vo
’
(ke
ˆ
’
ca
’
ba
’
n sao thu
´
’
hai cu
’
a
chính he
ˆ
˙
vo
’
) se
˜
có quye
ˆ
`
n truy ca
ˆ
˙
p to
´
’
i các bie
ˆ
´
n d
¯
u
’
o
˙
’
c gán nhu
’
va
ˆ
˙
y, tu
´
’
c là su
’
’
du
˙
ng giá tri
˙
cu
’
a
chúng qua tên.
3.7 Khai trie
ˆ
’
n bie
ˆ
’
u thu
´
’
c
Hay he
ˆ
˙
vo
’
d
¯
o
˙
c các câu le
ˆ
˙
nh nhu
’
the
ˆ
´
nào? Khi he
ˆ
˙
vo
’
nha
ˆ
˙
n d
¯
u
’
o
˙
’
c mo
ˆ
˙
t dòng
le
ˆ
˙
nh này d
¯
ó ca
ˆ
`
n thu
˙
’
c hie
ˆ
˙
n, nó (he
ˆ
˙
vo
’
) tru
’
o
´
’
c khi cha
˙
y câu le
ˆ
˙
nh thu
˙
’
c hie
ˆ
˙
n vie
ˆ
˙
c "phân tích ngu
˜
’
pháp" dòng le
ˆ
˙
nh này (gio
ˆ
´
ng trong ngôn ngu
˜
’
, phân tích chu
’
ngu
˜
’
, vi
˙
ngu
˜
’
). Mo
ˆ
˙
t trong nhu
˜
’
ng
bu
’
o
´
’
c cu
’
a su
˙
’
phân tích này là phép mo
’
’
hay khai trie
ˆ
’
n bie
ˆ
’
u thu
´
’
c (expansion). Trong bash có
ba
’
y loa
˙
i khai trie
ˆ
’
n bie
ˆ
’
u thu
´
’
c:
• Khai trie
ˆ
’
n da
ˆ
´
u ngoa
˘
˙
c (brace expansion);
• Thay the
ˆ
´
da
ˆ
´
u ngã (tilde expansion);
• Phép the
ˆ
´
các tham bie
ˆ
´
n và bie
ˆ
´
n so
ˆ
´
;
• Phép the
ˆ
´
các câu le
ˆ
˙
nh;
• Phép the
ˆ
´
so
ˆ
´
ho
˙
c (thu
˙
’
c hie
ˆ
˙
n tu
`
’
trái sang pha
’
i);
• Phép chia tu
`
’
(word splitting);
• Khai trie
ˆ
’
n các ma
ˆ
˜
u tên ta
ˆ
˙
p tin và thu
’
mu
˙
c (pathname expansion).
Các thao tác này d
¯
u
’
o
˙
’
c thu
˙
’
c hie
ˆ
˙
n theo d
¯
úng thu
´
’
tu
˙
’
lie
ˆ
˙
t kê trên. Chúng ta se
˜
xem xét chúng
theo tu
´
’
tu
˙
’
này.
3.7.1 Khai trie
ˆ
’
n da
ˆ
´
u ngoa
˘
˙
c
Khai trie
ˆ
’
n da
ˆ
´
u ngoa
˘
˙
c to
ˆ
´
t nha
ˆ
´
t minh ho
˙
a trên ví du
˙
. Gia
’
thie
ˆ
´
t, chúng ta ca
ˆ
`
n ta
˙
o thu
’
mu
˙
c con
trong mo
ˆ
˙
t thu
’
mu
˙
c nào d
¯
ó, hoa
˘
˙
c thay d
¯
o
ˆ
’
i ngu
’
o
`
’
i dùng so
’
’
hu
˜
’
u cu
’
a vài ta
ˆ
˙
p tin cùng mo
ˆ
˙
t lúc. Có
the
ˆ
’
thu
˙
’
c hie
ˆ
˙
n d
¯
ie
ˆ
`
u này nho
`
’
các câu le
ˆ
˙
nh sau:
kênh giao tác
[user]$ mkdir /usr/src/unikey/{old,new,dist,bugs}
[root]# chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}
Trong tru
’
o
`
’
ng ho
˙
’
p d
¯
a
ˆ
`
u, trong thu
’
mu
˙
c /usr/src/unikey/ se
˜
ta
˙
o ra các thu
’
mu
˙
c con
old,new,dist, và bugs. Trong tru
’
o
`
’
ng ho
˙
’
p thu
´
’
hai, ngu
’
o
`
’
i dùng so
’
’
hu
˜
’
u cu
’
a các ta
ˆ
˙
p tin sau
se
˜
thay d
¯
o
ˆ
’
i (thành root):
• /usr/ucb/ex
• /usr/lib/ex?.?
40 Bash
• /usr/ucb/edit
• /usr/lib/ex?.?
• /usr/ucb/ex
• /usr/lib/how_ex
• /usr/ucb/edit
• /usr/lib/how_ex
Tu
´
’
c là vo
´
’
i mo
ˆ
˜
i ca
˘
˙
p da
ˆ
´
u ngoa
˘
˙
c se
˜
ta
˙
o ra vài dòng riêng re
˜
(so
ˆ
´
nhu
˜
’
ng dòng này ba
˘
`
ng so
ˆ
´
tu
`
’
na
˘
`
ng trong da
ˆ
´
u ngoa
˘
˙
c) ba
˘
`
ng cách ghi thêm vào tru
’
o
´
’
c mo
ˆ
˜
i tu
`
’
trong ngoa
˘
˙
c nhu
˜
’
ng gì d
¯
u
´
’
ng tru
’
o
´
’
c
da
ˆ
´
u ngoa
˘
˙
c, và ghi thêm vào sau mo
ˆ
˜
i tu
`
’
này nhu
˜
’
ng gì d
¯
u
´
’
ng sau da
ˆ
´
u ngoa
˘
˙
c. Mo
ˆ
˙
t ví du
˙
khác:
dòng a{d,c,b}e khi khai trie
ˆ
’
n se
˜
thu d
¯
u
’
o
˙
’
c ba tu
`
’
"ade ace abe". Khai trie
ˆ
’
n da
ˆ
´
u ngoa
˘
˙
c
d
¯
u
’
o
˙
’
c thu
˙
’
c hie
ˆ
˙
n tru
’
o
´
’
c các da
˙
ng khai trie
ˆ
’
n khác trong dòng le
ˆ
˙
nh, ho
’
n nu
˜
’
a ta
ˆ
´
t ca
’
các ký tu
˙
’
d
¯
a
˘
˙
c
bie
ˆ
˙
t có trong dòng le
ˆ
˙
nh, ke
ˆ
’
ca
’
nhu
˜
’
ng ký tu
˙
’
na
˘
`
m trong da
ˆ
´
u ngoa
˘
˙
c, se
˜
d
¯
u
’
o
˙
’
c giu
˜
’
không thay d
¯
o
ˆ
’
i
(chúng se
˜
d
¯
u
’
o
˙
’
c biên di
˙
ch o
’
’
các bu
’
o
´
’
c phía sau).
3.7.2 Thay the
ˆ
´
da
ˆ
´
u ngã (Tilde Expansion)
Ne
ˆ
´
u nhu
’
tu
`
’
ba
˘
´
t d
¯
a
ˆ
`
u vo
´
’
i ký tu
˙
’
da
ˆ
´
u ngã (’∼’), ta
ˆ
´
t ca
’
các ký tu
˙
’
d
¯
u
´
’
ng tru
’
o
´
’
c da
ˆ
´
u ga
˙
ch chéo d
¯
a
ˆ
`
u tiên
(hay ta
ˆ
´
t ca
’
các ký tu
˙
’
ne
ˆ
´
u nhu
’
không có da
ˆ
´
u ga
˙
ch chéo) se
˜
d
¯
u
’
o
˙
’
c hie
ˆ
’
u là tên ngu
’
o
`
’
i dùng (login
name). Ne
ˆ
´
u nhu
’
tên này là mo
ˆ
˙
t dòng ro
ˆ
˜
ng (tu
´
’
c là da
ˆ
´
u ga
˙
ch chéo d
¯
u
´
’
ng ngay phía sau da
ˆ
´
u ngã),
thì da
ˆ
´
u ngã se
˜
d
¯
u
’
o
˙
’
c thay the
ˆ
´
bo
’
’
i giá tri
˙
cu
’
a bie
ˆ
´
n HOME. Và ne
ˆ
´
u giá tri
˙
cu
’
a bie
ˆ
´
n HOME không
d
¯
u
’
o
˙
’
c gán thì da
ˆ
´
u ngã se
˜
d
¯
u
’
o
˙
’
c thay the
ˆ
´
bo
’
’
i d
¯
u
’
o
`
’
ng da
ˆ
˜
n d
¯
a
ˆ
`
u d
¯
u
’
d
¯
e
ˆ
´
n thu
’
mu
˙
c cá nhân cu
’
a ngu
’
o
`
’
i
dùng, mà d
¯
ã cha
˙
y he
ˆ
˙
vo
’
. Ne
ˆ
´
u nhu
’
ngay sau da
ˆ
´
u ngã (và tru
’
o
´
’
c da
ˆ
´
u ga
˙
ch chéo) là mo
ˆ
˙
t tu
`
’
trùng
vo
´
’
i tên cu
’
a mo
ˆ
˙
t ngu
’
o
`
’
i dùng ho
˙
’
p pháp, thì da
ˆ
´
u ngã co
ˆ
˙
ng vo
´
’
i tên ngu
’
o
`
’
i dùng d
¯
u
’
o
˙
’
c thay the
ˆ
´
bo
’
’
i
d
¯
u
’
o
`
’
ng da
ˆ
˜
n d
¯
a
ˆ
`
y d
¯
u
’
d
¯
e
ˆ
´
n thu
’
mu
˙
c cá nhân cu
’
a ngu
’
o
`
’
i dùng này. Ne
ˆ
´
u nhu
’
tu
`
’
d
¯
u
´
’
ng sau da
ˆ
´
u ngã
không pha
’
i là tên cu
’
a mo
ˆ
˙
t ngu
’
o
`
’
i dùng (và không ro
ˆ
˜
ng), thì tu
`
’
không bi
˙
thay d
¯
o
ˆ
’
i. Ne
ˆ
´
u nhu
’
sau
da
ˆ
´
u ngã là ’+’, hay ký hie
ˆ
˙
u này se
˜
d
¯
u
’
o
˙
’
c thay the
ˆ
´
bo
’
’
i tên d
¯
a
ˆ
`
u d
¯
u
’
cu
’
a thu
’
mu
˙
c hie
ˆ
˙
n tho
`
’
i (tu
´
’
c là
giá tri
˙
cu
’
a bie
ˆ
´
n PWD). Ne
ˆ
´
u du
´
’
ng sau da
ˆ
´
u ngã là ’-’, thì thay the
ˆ
´
giá tri
˙
cu
’
a bie
ˆ
´
n OLDPWD (thu
’
mu
˙
c "cu
˜
").
3.7.3 Phép the
ˆ
´
các tham bie
ˆ
´
n và bie
ˆ
´
n so
ˆ
´
Ký tu
˙
’
$ d
¯
u
’
o
˙
’
c su
’
’
du
˙
ng cho các thao tác the
ˆ
´
tham bie
ˆ
´
n, the
ˆ
´
các câu le
ˆ
˙
nh và the
ˆ
´
các bie
ˆ
’
u thu
´
’
c
so
ˆ
´
ho
˙
c. Bie
ˆ
’
u thu
´
’
c hay tên d
¯
u
´
’
ng sau $ có the
ˆ
’
d
¯
u
’
o
˙
’
c d
¯
u
’
a vào ngoa
˘
˙
c, không nha
ˆ
´
t thie
ˆ
´
t, nhu
’
ng
ra
ˆ
´
t tie
ˆ
˙
n, vì da
ˆ
´
u ngoa
˘
˙
c phân cách bie
ˆ
’
u thu
´
’
c vo
´
’
i các tu
`
’
hay ký tu
˙
’
d
¯
u
´
’
ng sau. Nhu
’
va
ˆ
˙
y, d
¯
e
ˆ
’
go
˙
i
giá tri
˙
cu
’
a tham bie
ˆ
´
n nói chung cu
˜
ng nhu
’
bie
ˆ
´
n môi tru
’
o
`
’
ng nói riêng trong dòng le
ˆ
˙
nh, ca
ˆ
`
n d
¯
a
˘
˙
t
bie
ˆ
’
u thu
´
’
c da
˙
ng $parameter. Da
ˆ
´
u ngoa
˘
˙
c chı
’
ca
ˆ
`
n thie
ˆ
´
t, ne
ˆ
´
u tên cu
’
a tham bie
ˆ
´
n có chu
´
’
a vài chu
˜
’
so
ˆ
´
, hoa
˘
˙
c khi theo sau tên còn có các ký tu
˙
’
khác, mà chúng ta không muo
ˆ
´
n he
ˆ
˙
vo
’
"hie
ˆ
’
u la
ˆ
`
m"
chúng là mo
ˆ
˙
t pha
ˆ
`
n cu
’
a tên tham bie
ˆ
´
n. Trong ta
ˆ
´
t ca
’
các giá tri
˙
cu
’
a bie
ˆ
´
n so
ˆ
´
xa
’
y ra phép the
ˆ
´
da
ˆ
´
u
ngã (∼), su
˙
’
khai trie
ˆ
’
n tham bie
ˆ
´
n và bie
ˆ
´
n so
ˆ
´
, phép the
ˆ
´
các câu le
ˆ
˙
nh, phép the
ˆ
´
các bie
ˆ
’
u thu
´
’
c so
ˆ
´
ho
˙
c, cu
˜
ng nhu
’
xóa các ký tu
˙
’
trích da
ˆ
˜
n (xem du
’
o
´
’
i). Su
˙
’
phân chia tu
`
’
không xa
’
y ra, tru
`
’
tru
’
o
`
’
ng
ho
˙
’
p "$" (lo
`
’
i gia
’
i thích xem o
’
’
ba
’
ng so
ˆ
´
3). Su
˙
’
khai trie
ˆ
’
n các ma
ˆ
˜
u tên ta
ˆ
˙
p tin và thu
’
mu
˙
c cu
˜
ng
không d
¯
u
’
o
˙
’
c thu
˙
’
c hie
ˆ
˙
n.
3.7 Khai trie
ˆ
’
n bie
ˆ
’
u thu
´
’
c 41
3.7.4 Phép the
ˆ
´
các câu le
ˆ
˙
nh
Phép the
ˆ
´
các câu le
ˆ
˙
nh là mo
ˆ
˙
t công cu
˙
ra
ˆ
´
t ma
˙
ng cu
’
a bash. Ý nghı
˜
a cu
’
a nó na
˘
`
m o
’
’
cho
ˆ
˜
thay the
ˆ
´
tên các câu le
ˆ
˙
nh bo
’
’
i ke
ˆ
´
t qua
’
thu
˙
’
c hie
ˆ
˙
n cu
’
a chúng. Có hai da
˙
ng phép the
ˆ
´
le
ˆ
˙
nh: $(command)
và ‘command‘ Ne
ˆ
´
u u
´
’
ng du
˙
ng da
˙
ng thu
´
’
hai (chú ý o
’
’
d
¯
ây su
’
’
du
˙
ng da
ˆ
´
u "ngoa
˘
˙
c d
¯
o
’
n ngu
’
o
˙
’
c",
phím cho nó thu
’
o
`
’
ng na
˘
`
m trên phím Tab), thì da
ˆ
´
u ga
˙
ch ngu
’
o
˙
’
c (\) o
’
’
trong da
ˆ
´
u ngoa
˘
˙
c se
˜
có chu
´
’
c
na
˘
ng nhu
’
mo
ˆ
˙
t ký tu
˙
’
thông thu
’
o
`
’
ng, tru
`
’
tru
’
o
`
’
ng ho
˙
’
p, khi d
¯
u
´
’
ng sau nó (da
ˆ
´
u ga
˙
ch ngu
’
o
˙
’
c) là mo
ˆ
˙
t
$, ‘, hay mo
ˆ
˙
t \. Ne
ˆ
´
u nhu
’
su
’
’
du
˙
ng da
˙
ng $(command), thì ta
ˆ
´
t ca
’
các ký tu
˙
’
d
¯
u
´
’
ng trong ngoa
˘
˙
c ta
˙
o
thành mo
ˆ
˙
t câu le
ˆ
˙
nh, không có ký tu
˙
’
nào có ý nghı
˜
a d
¯
a
˘
˙
c bie
ˆ
˙
t. Ne
ˆ
´
u phép the
ˆ
´
câu le
ˆ
˙
nh xa
’
y ra
phía trong ngoa
˘
˙
c kép, thì trong ke
ˆ
´
t qua
’
cu
’
a phép the
ˆ
´
se
˜
không thu
˙
’
c hie
ˆ
˙
n phép phân chia tu
`
’
và
su
˙
’
khai trie
ˆ
’
n ma
ˆ
˜
u tên ta
ˆ
˙
p tin và thu
’
mu
˙
c.
3.7.5 Phép the
ˆ
´
so
ˆ
´
ho
˙
c (Arithmetic Expansion)
Phép the
ˆ
´
so
ˆ
´
ho
˙
c cho phép tính giá tri
˙
cu
’
a mo
ˆ
˙
t bie
ˆ
’
u thu
´
’
c so
ˆ
´
ho
˙
c và thay the
ˆ
´
nó (bie
ˆ
’
u thu
´
’
c)
bo
’
’
i ke
ˆ
´
t qua
’
thu d
¯
u
’
o
˙
’
c. Có hai da
˙
ng phép the
ˆ
´
so
ˆ
´
ho
˙
c: $[expression] ((expression))
Trong d
¯
ó expression d
¯
u
’
o
˙
’
c hie
ˆ
’
u (d
¯
u
’
o
˙
’
c bash d
¯
o
˙
c) nhu
’
khi d
¯
u
´
’
ng trong ngoa
˘
˙
c kép, nhu
’
ng
nhu
˜
’
ng da
ˆ
´
u ngoa
˘
˙
c kép o
’
’
trong expression la
˙
i d
¯
u
’
o
˙
’
c d
¯
o
˙
c nhu
’
mo
ˆ
˙
t ký tu
˙
’
thu
’
o
`
’
ng. Phía trong
expression có thu
˙
’
c hie
ˆ
˙
n các phép the
ˆ
´
tham bie
ˆ
´
n và the
ˆ
´
câu le
ˆ
˙
nh. Cú pháp cu
’
a bie
ˆ
’
u thu
´
’
c
expression tu
’
o
’
ng tu
˙
’
nhu
’
cú pháp cu
’
a bie
ˆ
’
u thu
´
’
c so
ˆ
´
ho
˙
c cu
’
a ngôn ngu
˜
’
C, cu
˙
the
ˆ
’
ho
’
n ve
ˆ
`
va
ˆ
´
n
d
¯
e
ˆ
`
này có the
ˆ
’
d
¯
o
˙
c trong pha
ˆ
`
n ARITHMETIC EVALUATION cu
’
a trang man cu
’
a bash. Ví
du
˙
, câu le
ˆ
˙
nh
kênh giao tác
[user]$ echo $((2 + 3 * 5))
cho ke
ˆ
´
t qua
’
ba
˘
`
ng "17". Ne
ˆ
´
u bie
ˆ
’
u thu
´
’
c không chính xác, bash se
˜
d
¯
u
’
a ra thông báo lo
ˆ
˜
i.
3.7.6 Phân chia tu
`
’
(word splitting)
Sau khi thu
˙
’
c hie
ˆ
˙
n xong các phép the
ˆ
´
tham bie
ˆ
´
n, the
ˆ
´
le
ˆ
˙
nh, và the
ˆ
´
các bie
ˆ
’
u thu
´
’
c so
ˆ
´
ho
˙
c, he
ˆ
˙
vo
’
la
˙
i
phân tích dòng le
ˆ
˙
nh mo
ˆ
˙
t la
ˆ
`
n nu
˜
’
a (nhu
’
ng o
’
’
da
˙
ng thu d
¯
u
’
o
˙
’
c sau các phép the
ˆ
´
nói trên) và thu
˙
’
c
hie
ˆ
˙
n vie
ˆ
˙
c phân chia tu
`
’
(word splitting). Thao tác này na
˘
`
m o
’
’
cho
ˆ
˜
, he
ˆ
˙
vo
’
tìm trong dòng le
ˆ
˙
nh
ta
ˆ
´
t ca
’
các ký tu
˙
’
phân chia, xác d
¯
i
˙
nh bo
’
’
i bie
ˆ
´
n IFS (xem trên), và nho
`
’
d
¯
ó chia nho
’
dòng le
ˆ
˙
nh
thành các tu
`
’
riêng re
˜
trong các cho
ˆ
˜
tu
’
o
’
ng u
´
’
ng. Ne
ˆ
´
u giá tri
˙
cu
’
a IFS ba
˘
`
ng mo
ˆ
˙
t dòng tro
ˆ
´
ng, thì
vie
ˆ
˙
c phân chia tu
`
’
se
˜
không xa
’
y ra. Ne
ˆ
´
u trong dòng le
ˆ
˙
nh không thu
˙
’
c hie
ˆ
˙
n phép the
ˆ
´
nào trong
các phép the
ˆ
´
ke
ˆ
’
trên, thì phân chia tu
`
’
cu
˜
ng không xa
’
y ra.
3.7.7 Khai trie
ˆ
’
n các ma
ˆ
˜
u tên ta
ˆ
˙
p tin và thu
’
mu
˙
c (Pathname Expansion)
Phép the
ˆ
´
tên d
¯
u
’
o
`
’
ng da
ˆ
˜
n và ta
ˆ
˙
p tin (Pathname expansion) su
’
’
du
˙
ng d
¯
e
ˆ
’
chı
’
nho
`
’
mo
ˆ
˙
t ma
ˆ
˜
u nho
’
go
˙
n mà có the
ˆ
’
chı
’
ra vài ta
ˆ
˙
p tin (hay thu
’
mu
˙
c), tu
’
o
’
ng u
´
’
ng vo
´
’
i ma
ˆ
˜
u này. Sau khi phân chia tu
`
’
,
và ne
ˆ
´
u nhu
’
không d
¯
u
’
a ra tùy cho
˙
n -f, thì bash se
˜
tìm kie
ˆ
´
m trong tu
`
’
ng tu
`
’
cu
’
a dòng le
ˆ
˙
nh các
ký tu
˙
’
*, ?, và [. Ne
ˆ
´
u tìm tha
ˆ
´
y tu
`
’
vo
´
’
i mo
ˆ
˙
t hay vài ký tu
˙
’
nhu
’
va
ˆ
˙
y, thì tu
`
’
này se
˜
d
¯
u
’
o
˙
’
c xem
nhu
’
mo
ˆ
˙
t ma
ˆ
˜
u, và ca
ˆ
`
n thay the
ˆ
´
bo
’
’
i các tu
`
’
trong danh sách d
¯
u
’
o
`
’
ng da
ˆ
˜
n, tu
’
o
’
ng u
´
’
ng vo
´
’
i ma
ˆ
˜
u này.
Ne
ˆ
´
u nhu
’
không tìm tha
ˆ
´
y tên tu
’
o
’
ng u
´
’
ng vo
´
’
i ma
ˆ
˜
u, và bie
ˆ
´
n nullglob không d
¯
u
’
o
˙
’
c d
¯
u
’
a ra, thì tu
`
’
se
˜
không thay d
¯
o
ˆ
’
i, tu
´
’
c là các ký tu
˙
’
d
¯
a
˘
˙
c bie
ˆ
˙
t bi
˙
ma
ˆ
´
t giá tri
˙
và hie
ˆ
’
u nhu
’
các ký tu
˙
’
thu
’
o
`
’
ng. Ne
ˆ
´
u
nhu
’
bie
ˆ
´
n này d
¯
u
’
o
˙
’
c xác d
¯
i
˙
nh, mà d
¯
u
’
o
`
’
ng da
ˆ
˜
n tu
’
o
’
ng u
´
’
ng vo
´
’
i ma
ˆ
˜
u không tìm tha
ˆ
´
y, thì tu
`
’
se
˜
bi
˙
xóa kho
’
i dòng le
ˆ
˙
nh. Các ký tu
˙
’
dùng d
¯
e
ˆ
’
ta
˙
o ma
ˆ
˜
u có các giá tri
˙
trong ba
’
ng
3.4
42 Bash
Ba
’
ng 3.4: Các ký tu
˙
’
ta
˙
o ma
ˆ
˜
u
Ký tu
˙
’
Quy lua
ˆ
˙
t thay the
ˆ
´
* Tu
’
o
’
ng u
´
’
ng vo
´
’
i ba
ˆ
´
t ky
`
dòng ký tu
˙
’
nào, ke
ˆ
’
ca
’
dòng ro
ˆ
˜
ng. Ví du
˙
, v*.txt
se
˜
d
¯
u
’
o
˙
’
c thay the
ˆ
´
bo
’
’
i vnoss.txt, vnlinux.txt và vntex.txt
(ne
ˆ
´
u các ta
ˆ
˙
p tin này to
ˆ
`
n ta
˙
i), và *.png se
˜
tu
’
o
’
ng u
´
’
ng ta
ˆ
´
t ca
’
các ta
ˆ
˙
p tin có
pha
ˆ
`
n mo
’
’
ro
ˆ
˙
ng png (ta
ˆ
˙
p tin d
¯
o
ˆ
`
ho
˙
a hai chie
ˆ
`
u).
? Tu
’
o
’
ng u
´
’
ng ba
ˆ
´
t ký mo
ˆ
˙
t ký tu
˙
’
d
¯
o
’
n nào. Ví du
˙
, ma
ˆ
˜
u
file?.txt se
˜
d
¯
u
’
o
˙
’
c thaythe
ˆ
´
bo
’
’
i các tên te
ˆ
˙
p sau
file1.txt, file2.txt, file3.txt, và filea.txt
(ne
ˆ
´
u chúng to
ˆ
`
n ta
˙
i), nhu
’
ng file23.txt thì không.
[ ] Tu
’
o
’
ng u
´
’
ng ba
ˆ
´
t ky
`
ký tu
˙
’
nào trong so
ˆ
´
các ký tu
˙
’
na
˘
`
m trong da
ˆ
´
u ngoa
˘
˙
c
vuông này. Ca
˘
˙
p ký tu
˙
’
, phân cách nhau bo
’
’
i da
ˆ
´
u tru
`
’
(-), ví du
˙
c-f, bie
ˆ
’
u
thi
˙
mo
ˆ
˙
t dãy; ba
ˆ
´
t ký ký tu
˙
’
nào, theo tu
`
’
d
¯
ie
ˆ
’
n, na
˘
`
m giu
˜
’
a hai ký tu
˙
’
này, ke
ˆ
’
ca
’
hai ký tu
˙
’
ta
˙
o ra dãy (c và f trong ví du
˙
) cu
˜
ng tu
’
o
’
ng u
´
’
ng vo
´
’
i ma
ˆ
˜
u. Ne
ˆ
´
u
ký tu
˙
’
d
¯
a
ˆ
`
u tiên trong ngoa
˘
˙
c vuông là hay
ˆ
, thì ma
ˆ
˜
u (o
’
’
vi
˙
trí này) se
˜
tu
’
o
’
ng
u
´
’
ng ta
ˆ
´
t ca
’
các ký tu
˙
’
, không d
¯
u
’
o
˙
’
c chı
’
ra trong ngo
Ma
ˆ
˜
u tên ta
ˆ
˙
p tin ra
ˆ
´
t thu
’
o
`
’
ng xuyên su
’
’
du
˙
ng trong dòng le
ˆ
˙
nh có chu
´
’
a ls. Hãy tu
’
o
’
’
ng tu
’
o
˙
’
ng
là ba
˙
n muo
ˆ
´
n xem thông tin cu
’
a mo
ˆ
˙
t thu
’
mu
˙
c, trong d
¯
ó có chu
´
’
a mo
ˆ
˙
t so
ˆ
´
lu
’
o
˙
’
ng lo
´
’
n các ta
ˆ
˙
p tin
d
¯
u
’
các da
˙
ng, ví du
˙
, ta
ˆ
˙
p tin hình a
’
nh, phim vo
´
’
i da
˙
ng gif, jpeg, avi, v.v. . . . D
¯
e
ˆ
’
thu d
¯
u
’
o
˙
’
c thông
tin chı
’
cu
’
a ta
ˆ
˙
p tin da
˙
ng jpeg, có the
ˆ
’
dùng câu le
ˆ
˙
nh
kênh giao tác
[user]$ ls *.jpg
Ne
ˆ
´
u trong thu
’
mu
˙
c có nhie
ˆ
`
u ta
ˆ
˙
p tin, mà tên cu
’
a chúng là các so
ˆ
´
go
ˆ
`
m bo
ˆ
´
n chu
˜
’
so
ˆ
´
(thu
’
mu
˙
c
/proc là mo
ˆ
˙
t ví du
˙
+), thì le
ˆ
˙
nh sau chı
’
d
¯
u
’
a ra danh sách các ta
ˆ
˙
p tin có so
ˆ
´
tu
`
’
0500 d
¯
e
ˆ
´
n 0999:
kênh giao tác
[user]$ ls -l 0[5-9]??
3.7.8 Xóa các ký tu
˙
’
d
¯
a
˘
˙
c bie
ˆ
˙
t
Sau khi làm xong ta
ˆ
´
t ca
’
các phép the
ˆ
´
, các ký tu
˙
’
\, ‘ và " còn la
˙
i trong dòng le
ˆ
˙
nh (chúng
d
¯
u
’
o
˙
’
c su
’
’
du
˙
ng d
¯
e
ˆ
’
huy
’
bo
’
giá tri
˙
d
¯
a
˘
˙
c bie
ˆ
˙
t cu
’
a các ký tu
˙
’
khác) se
˜
bi
˙
xóa he
ˆ
´
t.
3.8 Shell - mo
ˆ
˙
t ngôn ngu
˜
’
la
ˆ
˙
p trình
Nhu
’
d
¯
ã nói o
’
’
trên, d
¯
e
ˆ
’
có the
ˆ
’
xây du
˙
’
ng ba
ˆ
´
t ky
`
gia
’
i thua
ˆ
˙
t nào, cu
˜
ng ca
ˆ
`
n có các toán tu
’
’
kie
ˆ
’
m tra
d
¯
ie
ˆ
`
u kie
ˆ
˙
n. He
ˆ
˙
vo
’
bash ho
ˆ
˜
tro
˙
’
các toán tu
’
’
lu
˙
’
a cho
˙
n if then else và case, cu
˜
ng
nhu
’
các toán tu
’
’
vòng la
˘
˙
p for, while, until, nho
`
’
d
¯
ó nó (bash) tro
’
’
thành mo
ˆ
˙
t ngôn
ngu
˜
’
la
ˆ
˙
p trình ma
˙
nh.
3.8.1 Toàn tu
’
’
if và test (hoa
˘
˙
c [ ])
Ca
ˆ
´
u trúc cu
’
a toán tu
’
’
d
¯
ie
ˆ
`
u kie
ˆ
˙
n có da
˙
ng thu go
˙
n nhu
’
sau: if list1 then list2 else list3
fi trong d
¯
ó, list1, list2, và list3 là các chuo
ˆ
˜
i câu le
ˆ
˙
nh, phân cách nhau bo
’
’
i da
ˆ
´
u
3.8 Shell - mo
ˆ
˙
t ngôn ngu
˜
’
la
ˆ
˙
p trình 43
pha
’
y và ke
ˆ
´
t thúc bo
’
’
i mo
ˆ
˙
t da
ˆ
´
u cha
ˆ
´
m pha
ˆ
’
y hay ký tu
˙
’
dòng mo
´
’
i. Ngoài ra, các chuo
ˆ
˜
i này có the
ˆ
’
d
¯
u
’
o
˙
’
c d
¯
u
’
a vào da
ˆ
´
u ngoa
˘
˙
c nho
˙
n: list. Toán tu
’
’
if kie
ˆ
’
m tra giá tri
˙
d
¯
u
’
o
˙
’
c tra
’
la
˙
i bo
’
’
i các câu le
ˆ
˙
nh
tu
`
’
list1. Ne
ˆ
´
u trong danh sách có vài câu le
ˆ
˙
nh, thì kie
ˆ
’
m tra giá tri
˙
d
¯
u
’
o
˙
’
c tra
’
la
˙
i bo
’
’
i câu le
ˆ
˙
nh
cuo
ˆ
´
i cùng cu
’
a danh sách. Ne
ˆ
´
u giá tri
˙
này ba
˘
`
ng 0, thì se
˜
thu
˙
’
c hie
ˆ
˙
n các le
ˆ
˙
nh tu
`
’
list2; còn
ne
ˆ
´
u giá tri
˙
này khác không, thì se
˜
thu
˙
’
c hie
ˆ
˙
n nhu
˜
’
ng le
ˆ
˙
nh tu
`
’
list3. Giá tri
˙
d
¯
u
’
o
˙
’
c tra
’
la
˙
i bo
’
’
i
toán tu
’
’
if nhu
’
va
ˆ
˙
y, trùng vo
´
’
i giá tri
˙
mà chuo
ˆ
˜
i le
ˆ
˙
nh thu
˙
’
c hie
ˆ
˙
n (list2 hoa
˘
˙
c list3) d
¯
u
’
a ra.
Da
˙
ng d
¯
a
ˆ
`
y d
¯
u
’
cu
’
a le
ˆ
˙
nh if nhu
’
sau:
if list then list [ elif list then list ] [ else list ] fi
(o
’
’
d
¯
ây da
ˆ
´
u ngoa
˘
˙
c vuông chı
’
có nghı
˜
a là, nhu
˜
’
ng gì na
˘
`
m trong nó, ngoa
˘
˙
c vuông, không nha
ˆ
´
t
thie
ˆ
´
t pha
’
i có). Bie
ˆ
’
u thu
´
’
c d
¯
u
´
’
ng sau if hay elif thu
’
o
`
’
ng là câu le
ˆ
˙
nh test, mà có the
ˆ
’
d
¯
u
’
o
˙
’
c
bie
ˆ
’
u thi
˙
bo
’
’
i da
ˆ
´
u ngoa
˘
˙
c vuông [ ]. Le
ˆ
˙
nh test thu
˙
’
c hie
ˆ
˙
n phép tính mo
ˆ
˙
t bie
ˆ
’
u thu
´
’
c nào d
¯
ó, và
tra
’
la
˙
i giá tri
˙
0, ne
ˆ
´
u bie
ˆ
’
u thu
´
’
c là d
¯
úng, và 1 trong tru
’
o
`
’
ng ho
˙
’
p ngu
’
o
˙
’
c la
˙
i. Bie
ˆ
’
u thu
´
’
c d
¯
u
’
o
˙
’
c d
¯
u
’
a
to
´
’
i chu
’
o
’
ng trình test nhu
’
mo
ˆ
˙
t tham so
ˆ
´
cu
’
a chu
’
o
’
ng trình. Thay vì gõ
test expression
có the
ˆ
’
d
¯
u
’
a bie
ˆ
’
u thu
´
’
c expression vào ngoa
˘
˙
c vuông:
[ expression ]
Ca
ˆ
`
n chú ý ra
˘
`
ng, test và [ d
¯
ó là hai tên cu
’
a cu
’
a cùng mo
ˆ
˙
t chu
’
o
’
ng trình, chu
´
’
không pha
’
i
là mo
ˆ
˙
t phép bie
ˆ
´
n hóa tha
ˆ
`
n thông nào d
¯
ó cu
’
a he
ˆ
˙
vo
’
bash (chı
’
là cú pháp cu
’
a [ d
¯
òi ho
’
i pha
’
i có
da
ˆ
´
u d
¯
óng ngoa
˘
˙
c). Và cu
˜
ng ca
ˆ
`
n chú ý ra
˘
`
ng o
’
’
cho
ˆ
˜
cu
’
a test trong ca
ˆ
´
u trúc if có the
ˆ
’
su
’
’
du
˙
ng
ba
ˆ
´
t ky
`
chu
’
o
’
ng trình nào. D
¯
e
ˆ
’
ke
ˆ
´
t thúc mu
˙
c này, chúng ta d
¯
u
’
a ra ví du
˙
su
’
’
du
˙
ng if:
kênh giao tác
if [ -x /usr/bin/unicode_start ] ; then
unicode_start
else
echo "hello world"
fi
Ve
ˆ
`
toán tu
’
’
test (hay [ ]) ca
ˆ
`
n d
¯
i sâu ho
’
n.
3.8.2 Toán tu
’
’
test và d
¯
ie
ˆ
`
u kie
ˆ
˙
n cu
’
a bie
ˆ
’
u thu
´
’
c
Bie
ˆ
’
u thu
´
’
c d
¯
ie
ˆ
`
u kie
ˆ
˙
n, su
’
’
du
˙
ng trong toán tu
’
’
test, d
¯
u
’
o
˙
’
c xây du
˙
’
ng trên co
’
so
’
’
kie
ˆ
’
m tra thuo
ˆ
˙
c
tính ta
ˆ
˙
p tin, so sánh các dòng và các so sánh so
ˆ
´
ho
˙
c thông thu
’
o
`
’
ng. Bie
ˆ
’
u thu
´
’
c phu
´
’
c ta
˙
p ho
’
n
d
¯
u
’
o
˙
’
c ta
˙
o ra tu
`
’
các thao tác d
¯
o
’
n và kép sau ("nhu
˜
’
ng viên ga
˙
ch co
’
so
’
’
"):
• -a file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i.
• -b file
D
¯
úng ne
ˆ
´
u file to
ˆ
`
n ta
˙
i, và là mo
ˆ
˙
t ta
ˆ
˙
p tin thie
ˆ
´
t bi
˙
kho
ˆ
´
i (block device) d
¯
a
˘
˙
c bie
ˆ
˙
t.
• -c file
D
¯
úng ne
ˆ
´
u file to
ˆ
`
n ta
˙
i, và là mo
ˆ
˙
t ta
ˆ
˙
p tin thie
ˆ
´
t bi
˙
ký tu
˙
’
(charater device) d
¯
a
˘
˙
c bie
ˆ
˙
t.
• -d file
D
¯
úng ne
ˆ
´
u file to
ˆ
`
n ta
˙
i và là mo
ˆ
˙
t thu
’
mu
˙
c.
• -e file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i.
44 Bash
• -f file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và là mo
ˆ
˙
t ta
ˆ
˙
p tin thông thu
’
o
`
’
ng.
• -g file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và d
¯
u
’
o
˙
’
c d
¯
a
˘
˙
t bit thay d
¯
o
ˆ
’
i nhóm.
• -h file hay -L file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và là liên ke
ˆ
´
t me
ˆ
`
m (liên ke
ˆ
´
t tu
’
o
˙
’
ng tru
’
ng).
• -k file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và d
¯
u
’
o
˙
’
c d
¯
a
˘
˙
t bit sticky.
• -p file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và là tên cu
’
a mo
ˆ
˙
t o
ˆ
´
ng (kênh FIFO).
• -p file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và là tên cu
’
a mo
ˆ
˙
t o
ˆ
´
ng (kênh FIFO).
• -r file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và có quye
ˆ
`
n d
¯
o
˙
c.
• -s file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và kích thu
’
o
´
’
c lo
´
’
n ho
’
n không.
• -t fd
D
¯
úng ne
ˆ
´
u bo
ˆ
˙
mô ta
’
cu
’
a ta
ˆ
˙
p tin (fd) mo
’
’
và chı
’
lên terminal.
• -u file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và d
¯
u
’
o
˙
’
c d
¯
a
˘
˙
t bit thay d
¯
o
ˆ
’
i ngu
’
o
`
’
i dùng.
• -w file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và có quye
ˆ
`
n ghi.
• -x file
D
¯
úng ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và có quye
ˆ
`
n thu
˙
’
c thi.
• -0 file
D
¯
úng, ne
ˆ
´
u ta
ˆ
˙
p tin có tên file và chu
’
so
’
’
hu
˜
’
u cu
’
a nó là ngu
’
o
`
’
i dùng mà ID có hie
ˆ
˙
u lu
˙
’
c
chı
’
d
¯
e
ˆ
´
n.
• -G file
D
¯
úng, ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và thuo
ˆ
˙
c ve
ˆ
`
nhóm, xác d
¯
i
˙
nh bo
’
’
i ID nhóm có hie
ˆ
˙
u
lu
˙
’
c.
• -S file
D
¯
úng, ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và là socket.
• -N file
D
¯
úng, ne
ˆ
´
u ta
ˆ
˙
p tin có tên file to
ˆ
`
n ta
˙
i và thay d
¯
o
ˆ
’
i tu
`
’
la
ˆ
`
n d
¯
u
’
o
˙
’
c d
¯
o
˙
c cuo
ˆ
´
i cùng.
• file1 -nt file2
D
¯
úng, ne
ˆ
´
u ta
ˆ
˙
p tin file1 có tho
`
’
i gian su
’
’
a d
¯
o
ˆ
’
i muo
ˆ
˙
n ho
’
n file2.