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á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 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ìnhno ˆ ˙ i dung cu ’ a 10 ta ˆ ˙ p tin (ne ˆ ´ u có): "fu1", , "fu10". This is trial version www.adultpdf.com 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: This is trial version www.adultpdf.com 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 This is trial version www.adultpdf.com 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. This is trial version www.adultpdf.com 3.10 Câu le ˆ ˙ nh sh 51 This is trial version www.adultpdf.com . 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í. fu$a done Câu le ˆ ˙ nh (script) này d ¯ u ’ a ra màn hìnhno ˆ ˙ i dung cu ’ a 10 ta ˆ ˙ p tin (ne ˆ ´ u có): "fu1", , "fu10". This is trial version www.adultpdf.com 48 Bash 3.8.6 Toán. 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 )