Nói chung caˆ´u trúc có da ˙ng sau: fornameinwordsdolistdone Quy luaˆ ˙t xây du˙’ng danh sách leˆ˙nh list gioˆ´ ng trong toán tu’’if.. This is trial version www.adultpdf.com... Taˆ ˙p ti
Trang 1Ghi 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?
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’’forlàm vieˆ
˙c có khác moˆ
˙t chút so vo´’ifortrong các ngô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 trongdanh sách tu`’ d¯u’a sa˘˜ncho bieˆ´n d¯ó trong moˆ˜i vòng la˘
˙p Nói chung caˆ´u trúc có da
˙ng sau:
fornameinwordsdolistdone
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 tinfu1, 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’’fornhu’ sau:
forname [inword; ]dolist ;done
D
¯ aˆ`u tiên cu˜ng xa’y ra su
˙’ khai trieˆ’n tu`’wordtheo quy luaˆ
˙t khai trieˆ’n bieˆ’u thu´’c (xem trên) Sau d¯ó bieˆ´nnamelaˆ`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ˆ
˙nhlisttrong 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ìnhseq, 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
˙ngforcu’abashlàm vieˆ
˙c nhu’ toán tu’’fortrong 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˘
˙pfornhu’ 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" This is trial version
www.adultpdf.com
Trang 248 Bash
3.8.6 Toán tu’’ while và until
Toán tu’’whilelàm vieˆ
˙c tu’o’ng tu
˙’ nhu’if, nhu’ng vòng la˘
˙p các câu leˆ
˙nh trong list2chı’ 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:
whilelist1dolist2done
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
˙cdirectorytheo tu`’ng phút neˆ´u thu’ mu
˙c còn toˆ`n ta
˙i Toán tu’’untiltu’o’ng tu
˙’ nhu’ toán tu’’while: untillist1dolist2done
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ˆ
˙nlist1, 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’bashcho 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:
functionname() {list}
Ho’n nu˜’a tu`’functionkhông nhaˆ´t thieˆ´t pha’i có,namexá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ˆ
˙nhlist, 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ênnamed¯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$1là 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óalocal 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: This is trial version
www.adultpdf.com
Trang 3local 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ˆ
˙nhseqd¯ã 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-ncu’aecho, 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’nbashhieˆ
˙n tho`’i, caˆ`n su’’du
˙ng câu leˆ
˙nhsource, 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 tinfilenametrong 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’afilename Neˆ´ufilename 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 This is trial version
www.adultpdf.com
Trang 450 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ˆ
˙nhsource 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 tinfilename, 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’bashnho`’ câu leˆ
˙nhbashhaysh 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/shse˜ 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˙ bashbo’ 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ˆ`bashta
˙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 trangman bash.
This is trial version www.adultpdf.com
Trang 5This is trial version www.adultpdf.com