3.6 Tham bie ˆ ´ n và các bie ˆ ´ n so ˆ ´ . Môi tru ’ o ` ’ ng cu ’ a he ˆ ˙ vo ’ 37 kho ’ ’ i d ¯ o ˆ ˙ ng (hay script d ¯ a ˘ ng nha ˆ ˙ p) xác d ¯ i ˙ nh la ˙ i bie ˆ ´ n này. Nói chung thì trong bash có ta ˆ ´ t ca ’ bo ˆ ´ n da ˆ ´ u nha ˘ ´ c, d ¯ u ’ o ˙ ’ c su ’ ’ du ˙ ng trong các tru ’ o ` ’ ng ho ˙ ’ p khác nhau. Bie ˆ ´ n PS1 d ¯ u ’ a ra da ˙ ng cu ’ a da ˆ ´ u nha ˘ ´ c khi he ˆ ˙ vo ’ cho ` ’ nha ˆ ˙ p le ˆ ˙ nh. Da ˆ ´ u nha ˘ ´ c thu ´ ’ hai, xác d ¯ i ˙ nh bo ’ ’ i bie ˆ ´ n PS2, xua ˆ ´ t hie ˆ ˙ n khi he ˆ ˙ vo ’ cho ` ’ ngu ’ o ` ’ i dùng nha ˆ ˙ p thêm mo ˆ ˙ t vài du ˜ ’ lie ˆ ˙ u ca ˆ ` n thie ˆ ´ t nào d ¯ ó d ¯ e ˆ ’ có the ˆ ’ tie ˆ ´ p tu ˙ c cha ˙ y câu le ˆ ˙ nh (chu ’ o ’ ng trình) d ¯ ã go ˙ i. Theo ma ˘ ˙ c d ¯ i ˙ nh bie ˆ ´ n PS2 có giá tri ˙ ">". Ra ˆ ´ t có the ˆ ’ ba ˙ n d ¯ ã nhìn tha ˆ ´ y da ˆ ´ u nha ˘ ´ c này, khi cha ˙ y le ˆ ˙ nh cat d ¯ e ˆ ’ d ¯ u ’ a du ˜ ’ lie ˆ ˙ u vào tu ` ’ bàn phím vào ta ˆ ˙ p tin. Mo ˆ ˙ t ví du ˙ khác - le ˆ ˙ nh ftp, sau khi cha ˙ y le ˆ ˙ nh này da ˆ ´ u nha ˘ ´ c se ˜ có da ˙ ng nhu ’ d ¯ ã nói. Da ˆ ´ u nha ˘ ´ c, xác d ¯ i ˙ nh bo ’ ’ i bie ˆ ´ n PS3, su ’ ’ du ˙ ng trong le ˆ ˙ nh select. Da ˆ ´ u nha ˘ ´ c, xác d ¯ i ˙ nh bo ’ ’ i bie ˆ ´ n PS4, d ¯ u ’ o ˙ ’ c d ¯ u ’ a ra tru ’ o ´ ’ c mo ˆ ˜ i câu le ˆ ˙ nh, trong lúc bash theo dõi quá trình thu ˙ ’ c hie ˆ ˙ n. Giá tri ˙ theo ma ˘ ˙ c d ¯ i ˙ nh - "+". Ne ˆ ´ u có mong muo ˆ ´ n, ba ˙ n có the ˆ ’ thay d ¯ o ˆ ’ i các bie ˆ ´ n PS1 và PS2. Khi này có the ˆ ’ su ’ ’ du ˙ ng ba ˆ ´ t ky ` ký tu ˙ ’ nào nha ˆ ˙ p tu ` ’ bàn phím, cu ˜ ng nhu ’ mo ˆ ˙ t vài ký tu ˙ ’ chuyên dùng d ¯ e ˆ ’ xác d ¯ i ˙ nh da ˙ ng da ˆ ´ u nha ˘ ´ c nhu ’ trong ba ’ ng 3.3 (chı ’ d ¯ u ’ a ra mo ˆ ˙ t vài trong so ˆ ´ chúng làm ví du ˙ , danh sách d ¯ a ˆ ` y d ¯ u ’ xem trong trang man cu ’ a bash - gõ le ˆ ˙ nh "man bash"). Ba ’ ng 3.3: Ký tu ˙ ’ xác d ¯ i ˙ nh da ˙ ng da ˆ ´ u nha ˘ ´ c Cu ˙ m ký tu ˙ ’ Giá tri ˙ (ke ˆ ´ t qua ’ thu d ¯ u ’ o ˙ ’ c) \a Tín hie ˆ ˙ u âm thanh (mã ASCII 07) \d Tho ` ’ i gian o ’ ’ da ˙ ng "Thu ´ ’ , tháng, ngày", ví du ˙ , Sun, Dec, 26. \h Tên máy (hostname) d ¯ e ˆ ´ n da ˆ ´ u cha ˆ ´ m d ¯ a ˆ ` u tiên. \H Tên máy d ¯ a ˆ ` y d ¯ u ’ , ví du ˙ teppi.phanthinh.com \t Tho ` ’ i gian hie ˆ ˙ n tho ` ’ i o ’ ’ da ˙ ng 24 gio ` ’ : HH:MM:SS (gio ` ’ :phút:giây) \T Tho ` ’ i gian hie ˆ ˙ n tho ` ’ i o ’ ’ da ˙ ng 12 gio ` ’ : HH:MM:SS \@ Tho ` ’ i gian hie ˆ ˙ n tho ` ’ i o ’ ’ da ˙ ng 12 gio ` ’ am/pm (sáng/chie ˆ ` u) \u Tên ngu ’ o ` ’ i dùng d ¯ ã cha ˙ y he ˆ ˙ vo ’ , ví du ˙ teppi \w Tên d ¯ a ˆ ` y d ¯ u ’ cu ’ a thu ’ mu ˙ c làm vie ˆ ˙ c hie ˆ ˙ n tho ` ’ i (ba ˘ ´ t d ¯ a ˆ ` u tu ` ’ go ˆ ´ c), ví du ˙ /home/teppi82/project/l4u \W Thu ’ mu ˙ c hie ˆ ˙ n tho ` ’ i (không có d ¯ u ’ o ` ’ ng da ˆ ˜ n) \$ Ký tu ˙ ’ #, ne ˆ ´ u he ˆ ˙ vo ’ d ¯ u ’ o ˙ ’ c cha ˙ y bo ’ ’ i ngu ’ o ` ’ i dùng root, và ký tu ˙ ’ $, ne ˆ ´ u he ˆ ˙ vo ’ d ¯ u ’ o ˙ ’ c cha ˙ y bo ’ ’ i ngu ’ o ` ’ i dùng thu ’ o ` ’ ng. \nnn Ký tu ˙ ’ có mã he ˆ ˙ tám nnn \n Dòng mo ´ ’ i (chuye ˆ ’ n dòng) \s Tên he ˆ ˙ vo ’ \# So ˆ ´ hie ˆ ˙ n tho ` ’ i cu ’ a câu le ˆ ˙ nh \\ Da ˆ ´ u ga ˙ ch ngu ’ o ˙ ’ c (backslash) \[ Sau ký tu ˙ ’ này ta ˆ ´ t ca ’ các ký tu ˙ ’ se ˜ không d ¯ u ’ o ˙ ’ c in ra. \] Ke ˆ ´ t thúc chuo ˆ ˜ i các ký tu ˙ ’ không d ¯ u ’ o ˙ ’ c in ra. \! So ˆ ´ thu ´ ’ tu ˙ ’ cu ’ a le ˆ ˙ nh hie ˆ ˙ n tho ` ’ i trong li ˙ ch su ’ ’ các câu le ˆ ˙ nh d ¯ ã dùng. So ˆ ´ cu ’ a le ˆ ˙ nh (so ˆ ´ thu ´ ’ tu ˙ ’ cu ’ a le ˆ ˙ nh d ¯ ang thu ˙ ’ c hie ˆ ˙ n trong buo ˆ ’ i làm vie ˆ ˙ c hie ˆ ˙ n tho ` ’ i) có the ˆ ’ khác vo ´ ’ i so ˆ ´ cu ’ a chính nó trong danh sách "li ˙ ch su ’ ’ các câu le ˆ ˙ nh", bo ’ ’ i vì danh sách còn chu ´ ’ a ca ’ nhu ˜ ’ ng câu le ˆ ˙ nh d ¯ ã d ¯ u ’ o ˙ ’ c ghi la ˙ i trong ta ˆ ˙ p tin li ˙ ch su ’ ’ . Sau khi giá tri ˙ cu ’ a bie ˆ ´ n d ¯ u ’ o ˙ ’ c he ˆ ˙ vo ’ d ¯ o ˙ c xong, se ˜ xa ’ y ra su ˙ ’ thay the ˆ ´ theo các quy lua ˆ ˙ t mo ’ ’ ro ˆ ˙ ng trong ba ’ ng trên, d ¯ o ˆ ` ng tho ` ’ i còn xa ’ y ra su ˙ ’ thay the ˆ ´ trong tên các câu le ˆ ˙ nh, trong các bie ˆ ’ u thu ´ ’ c so ˆ ´ ho ˙ c, và su ˙ ’ chia tu ` ’ (word splitting). Chúng ta se ˜ nói d ¯ e ˆ ´ n nhu ˜ ’ ng su ˙ ’ thay the ˆ ´ này o ’ ’ du ’ o ´ ’ i.Ví du ˙ , sau khi thu ˙ ’ c hie ˆ ˙ n le ˆ ˙ nh (vì trong dòng va ˘ n ba ’ n có khoa ’ ng tro ˆ ´ ng, nên nha ˆ ´ t thie ˆ ´ t pha ’ i có da ˆ ´ u ngoa ˘ ˙ c): kênh giao tác [user/root]$ PS1="[\u@\h \W]\$" This is trial version www.adultpdf.com 38 Bash thì trong da ˆ ´ u nha ˘ ´ c se ˜ có da ˆ ´ u mo ’ ’ ngoa ˘ ˙ c vuông, tên ngu ’ o ` ’ i dùng, ký hie ˆ ˙ u , tên máy, khoa ’ ng tra ˘ ´ ng, tên cu ’ a thu ’ mu ˙ c hie ˆ ˙ n tho ` ’ i (không có d ¯ u ’ o ` ’ ng da ˆ ˜ n), da ˆ ´ u d ¯ óng ngoa ˘ ˙ c vuông, và ký hie ˆ ˙ u $ (ne ˆ ´ u trên he ˆ ˙ vo ’ d ¯ ang làm vie ˆ ˙ c ngu ’ o ` ’ i dùng bình thu ’ o ` ’ ng) hay #(ne ˆ ´ u he ˆ ˙ vo ’ cha ˙ y du ’ o ´ ’ i ngu ’ o ` ’ i dùng root). 3.6.3 Bie ˆ ´ n môi tru ’ o ` ’ ng PATH Còn mo ˆ ˙ t bie ˆ ´ n cu ˜ ng quan tro ˙ ng nu ˜ ’ a có tên PATH. Bie ˆ ´ n này d ¯ u ’ a ra danh sách d ¯ u ’ o ` ’ ng da ˆ ˜ n d ¯ e ˆ ´ n các thu ’ mu ˙ c, mà bash se ˜ tìm kie ˆ ´ m ta ˆ ˙ p tin (tru ’ o ` ’ ng ho ˙ ’ p riêng là các ta ˆ ˙ p tin le ˆ ˙ nh) trong tru ’ o ` ’ ng ho ˙ ’ p, d ¯ u ’ o ` ’ ng da ˆ ˜ n d ¯ a ˆ ` y d ¯ u ’ d ¯ e ˆ ´ n ta ˆ ˙ p tin không d ¯ u ’ o ˙ ’ c d ¯ u ’ a ra. Các thu ’ mu ˙ c trong danh sách này phân cách nhau bo ’ ’ i da ˆ ´ u hai cha ˆ ´ m (:). Theo ma ˘ ˙ c d ¯ i ˙ nh bie ˆ ´ n PATH chu ´ ’ a các thu ’ mu ˙ c /usr/local/bin, /bin, /usr/bin, /usr/X11R6/bin, tu ´ ’ c là có da ˙ ng: /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin: D ¯ e ˆ ’ thêm thu ’ mu ˙ c vào danh sách này, ca ˆ ` n thu ˙ ’ c hie ˆ ˙ n câu le ˆ ˙ nh sau: kênh giao tác [user]$ PATH=$PATH:new_path Khi tìm kie ˆ ´ m, he ˆ ˙ vo ’ "lu ˙ c lo ˙ i" các thu ’ mu ˙ c theo d ¯ úng thu ´ ’ tu ˙ ’ d ¯ ã lie ˆ ˙ t kê trong bie ˆ ´ n PATH. Mo ˆ ˙ t chú ý nho ’ , có the ˆ ’ d ¯ u ’ a vào danh sách này thu ’ mu ˙ c hie ˆ ˙ n tho ` ’ i, khi thêm vào bie ˆ ´ n PATH mo ˆ ˙ t da ˆ ´ u cha ˆ ´ m (.). Tuy nhiên, d ¯ ây là d ¯ ie ˆ ` u không khuyên làm vo ´ ’ i lý do ba ’ o ma ˆ ˙ t: ngu ’ o ` ’ i có ác ý có the ˆ ’ d ¯ a ˘ ˙ t vào thu ’ mu ˙ c dùng chung mo ˆ ˙ t chu ’ o ’ ng trình nào d ¯ ó, có cùng tên vo ´ ’ i mo ˆ ˙ t trong so ˆ ´ nhu ˜ ’ ng câu le ˆ ˙ nh thu ’ o ` ’ ng dùng bo ’ ’ i root, nhu ’ ng thu ˙ ’ c hie ˆ ˙ n nhu ˜ ’ ng chu ´ ’ c na ˘ ng khác hoàn toàn (d ¯ a ˘ ˙ c bie ˆ ˙ t nguy hie ˆ ’ m ne ˆ ´ u thu ’ mu ˙ c hie ˆ ˙ n tho ` ’ i d ¯ u ´ ’ ng o ’ ’ d ¯ a ˆ ` u danh sách tìm kie ˆ ´ m). 3.6.4 Bie ˆ ´ n môi tru ’ o ` ’ ng IFS Bie ˆ ´ n này xác d ¯ i ˙ nh ký tu ˙ ’ (cu ˙ m ký tu ˙ ’ ) phân cách (Internal Field Separator), su ’ ’ du ˙ ng trong thao tác phân chia tu ` ’ ngu ˜ ’ khi bie ˆ ´ n d ¯ o ˆ ’ i dòng le ˆ ˙ nh, mà he ˆ ˙ vo ’ thu ˙ ’ c hie ˆ ˙ n tru ’ o ´ ’ c khi cha ˙ y mo ˆ ˙ t câu le ˆ ˙ nh nào d ¯ ó(xemdu ’ o ´ ’ i).Giátri ˙ theoma ˘ ˙ cd ¯ i ˙ nhcu ’ abie ˆ ´ nnày-"<Khoa ’ ng_tra ˘ ´ ng><Tab><Ký_tu ˙ ’ _hàng_mo ´ ’ i>". Ne ˆ ´ u thu ’ ’ gõ le ˆ ˙ nh "echo $IFS", ba ˙ n se ˜ nha ˆ ˙ n d ¯ u ’ o ˙ ’ c mo ˆ ˙ t nga ˙ c nhiên nho ’ . 3.6.5 Thu ’ mu ˙ c hie ˆ ˙ n tho ` ’ i và thu ’ mu ˙ c cá nhân Tên cu ’ a thu ’ mu ˙ c hie ˆ ˙ n tho ` ’ i ghi trong bie ˆ ´ n môi tru ’ o ` ’ ng vo ´ ’ i tên PWD, và giá tri ˙ cu ’ a bie ˆ ´ n này thay d ¯ o ˆ ’ i sau mo ˆ ˜ i la ˆ ` n cha ˙ y chu ’ o ’ ng trình cd (cu ˜ ng nhu ’ mo ˆ ˜ i la ˆ ` n thay d ¯ o ˆ ’ i thu ’ mu ˙ c hie ˆ ˙ n tho ` ’ i theo ba ˆ ´ t ky ` cách nào, ví du ˙ , qua Midnight Commander). Tu ’ o ’ ng tu ˙ ’ nhu ’ va ˆ ˙ y tên d ¯ a ˆ ` y d ¯ u ’ (go ˆ ` m ca ’ d ¯ u ’ o ` ’ ng da ˆ ˜ n) cu ’ a thu ’ mu ˙ c cá nhân cu ’ a ngu ’ o ` ’ i dùng, cha ˙ y tie ˆ ´ n trình d ¯ ã cho, ghi trong bie ˆ ´ n HOME. 3.6.6 Câu le ˆ ˙ nh export Khi he ˆ ˙ vo ’ cha ˙ y mo ˆ ˙ t chu ’ o ’ ng trình hay câu le ˆ ˙ nh nào d ¯ ó, nó (he ˆ ˙ vo ’ ) cung ca ˆ ´ p cho chúng mo ˆ ˙ t pha ˆ ` n bie ˆ ´ n môi tru ’ o ` ’ ng. D ¯ e ˆ ’ có the ˆ ’ cung ca ˆ ´ p bie ˆ ´ n môi tru ’ o ` ’ ng cho tie ˆ ´ n trình cha ˙ y tu ` ’ he ˆ ˙ vo ’ , ca ˆ ` n gán giá tri ˙ cho bie ˆ ´ n này vo ´ ’ i le ˆ ˙ nh export, tu ´ ’ c là thay vì kênh giao tác [user]$ name=value ca ˆ ` n gõ: This is trial version www.adultpdf.com 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?.? This is trial version www.adultpdf.com 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. This is trial version www.adultpdf.com 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 This is trial version www.adultpdf.com 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 This is trial version www.adultpdf.com 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. This is trial version www.adultpdf.com 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. This is trial version www.adultpdf.com 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. This is trial version www.adultpdf.com 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" This is trial version www.adultpdf.com . "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 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. 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