3 Bash
3.8.1 Toàn tu’’ if và test (hoa˘
˙’ 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’’ivnoss.txt, vnlinux.txtvà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’ngfile23.txtthì 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 (cvà ftrong 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´’als. 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
/proclà 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’bashhoˆ˜ tro
˙’ các toán tu’’ lu˙’a cho˙nif...then...elsevà case, cu˜ng nhu’ các toán tu’’ vòng la˘
˙pfor, 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 [ ]) ˙c [ ])
Caˆ´u trúc cu’a toán tu’’ d¯ieˆ`u kieˆ
˙n có da˙ng thu go˙n nhu’ sau: iflist1 then list2 else list3
fitrong d¯ó, list1, list2, và list3là các chuoˆ˜i câu leˆ
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’’ifnhu’ vaˆ
˙y, trùng vo´’i giá tri
˙mà chuoˆ˜i leˆ
˙nh thu˙’c hieˆ˙n (list2hoa˘˙clist3) d¯u’a ra. Da
˙ng d¯aˆ`y d¯u’ cu’a leˆ
˙nhifnhu’ sau:
iflistthenlist [eliflistthenlist ] ... [elselist ]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 sauifhayelifthu’o`’ng là câu leˆ
˙nhtest, mà có theˆ’ d¯u’o ˙’c bieˆ’u thi
˙bo’’i daˆ´u ngoa˘
˙c vuông [ ]. Leˆ
˙nhtestthu˙’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ìnhtestnhu’ moˆ
˙t tham soˆ´ cu’a chu’o’ng trình. Thay vì gõ
test expression
có theˆ’ d¯u’a bieˆ’u thu´’cexpressionvào ngoa˘
˙c vuông:
[ expression ]
Caˆ`n chú ý ra˘`ng,testvà[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 testtrong caˆ´u trúcifcó 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 ˙ngif: 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.