BÀI 11 L P TRÌNH SHELL TRÊN LINUX
V. Cú pháp ngôn ng Shell
Bài t p 11.1 (Sách bài t p)
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 118/271
I. Gi i thi u v SHELL Và L p Trình SHELL
I.1. Gi i thi u v Shell
Shell là ch ng trình luôn đ c th c thi khi chúng ta đ ng nh p h th ng. Nó là ch ng trình cho phép chúng ta t ng tác v i h th ng. Hi n t i có nhi u shell có s n trong h th ng.
Shell cung c p cho ng i dùng m t t p l nh đ ng i dùng thao tác v i h th ng. Khi ng i dùng th c hi n l nh shell, shell s d ch chúng thành các l i g i h th ng và chuy n cho kernel x lý. Shell c ng là m t trong các ng d ng mà kernel qu n lý. Kernel ch u trách nhi m c p phát tài nguyên duy trì các ti n trình shell. Linux là h th ng đa ng i dùng, khi m i ng i dùng đ ng nh p h th ng, h s nh n đ c m t b n sao chép c a shell đ thao tác v i h th ng.
I.1.1 M t s đ c đi m c a shell
- X lý t ng tác ( Interative processing) : Ng i dùng t ng tác v i shell d i d ng đ i tho i tr c quan.
- Ch y n n : Các ch ng trình trên shell có th i gian th c thi lâu và chi m ít tài nguyên có th cho phép ch y n n bên d i trong khi đó ng i dùng có th th c hi n các công vi c khác.
i u này t ng hi u qu s d ng h th ng.
- Chuy n h ng (Redirection): Có th linh ho t chuy n đ i các d li u ra vào chu n và l i.
- ng d n (pipe): Cho phép th c hi n nhi u l nh liên ti p trong đó d li u ra c a l nh này đ c s d ng nh d li u vào c a l nh kia.
- T p tin l nh (shell script): T o các t p tin ch a các l nh làm vi c theo trình t . C p quy n và th c thi t p tin này.
- Bi n shell: shell h tr s d ng các bi n l u tr các thông tin đ đi u khi n ho t đ ng.
- S d ng l i các l nh đã th c hi n ( history command). ây là tính n ng r t có ích cho ng i dùng. th c hi n l i các l nh mình đã th c hi n tr c đó thay vì ph i gõ l i.
- C u trúc l nh nh ngôn ng l p trình: Shell cho phép s d ng l nh nh ngôn ng l p trình, b i nó có th k t h p x lý các tác v ph c t p.
- T đ ng hoàn t t tên t p tin, ho c l nh : Chúng ta có th gõ ph n đ u c a l nh ho c t p tin sau đó dùng <Tab> đ hoàn t t ph n còn l i.
- Bí danh cho l nh (command alias). B n có th dùng m t tên m i cho m t l nh. Sau đó s d ng tên này thay th l nh : $alias dir=’ls –l’. Lúc này ta s d ng l nh dir dùng nh ls –l I.1.2 Các shell trong Linux.
Tên shell L ch s ra đ i
sh ( Bourne) Shell nguyên th y trong Unix Csh, tcsh và zsh Shell s d ng c u trúc l nh c a ngôn ng C
làm ngôn ng script. Shell này đ c t o b i Bill Joy, đây là shell thông d ng th 2 sau
bash
Bash Bash(bourne Again shell)là shell s d ng chính trong Linux, ra đ i t d án GNU. Bash có u đi m là mã ngu n m , có th download
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 119/271 t đa ch http://www.gnu.org
Rc Là shell m r ng c a c shell v i nhi u t ng thích v i ngôn ng C, ra đ i t d án GNU
Shell bash là shell m c đnh trên Linux, ta có th dùng l nh #echo đ xem tên shell s d ng hi n t i c a h th ng.
#echo $SHELL
I.2. L p c u hình môi tr ng đ ng nh p
Khi ng i dùng đ ng nh p vào h th ng, h s làm vi c trong môi tr ng do Linux đnh ngh a s n. Môi tr ng Linux ch a các thi t l p và d li u có tính n ng ki m tra phiên làm vi c c a b n trong su t th i gian đ ng nh p. Tuy nhiên, b n c ng có th thay đ i nh ng thi t l p này theo ý riêng c a mình. Môi tr ng phiên làm vi c g m hai thành ph n:
- Thành ph n th nh t g i là môi tr ng terminal đ đi u khi n terminal (chính là màn hình và bàn phím) c a b n.
- Thành ph n th hai g i là môi tr ng shell đ đi u khi n nhi u khía c nh khác nhau c a shell, cùng v i m i ch ng trình b n th c hi n.
I.2.1 Thi t l p môi tr ng terminal
Th c ra phiên đ ng nh p c a b n bao g m hai ch ng trình riêng bi t nh ng ch y cùng lúc v i nhau, t o cho b n c m giác r ng máy đang ph c v cho riêng mình. M c dù shell là ch ng trình nh n l nh và thi hành, song tr c khi shell nh n đ c l nh, t t c nh ng gì mà b n gõ vào đ u ph i đi qua m t trình đi u khi n thi t b g i là device driver. Driver ki m soát terminal, nh n nh ng kí t b n gõ vào r i sau đó quy t đnh xem x lý nh th nào tr c khi giao cho shell thông d ch.
T ng t nh th , m i kí t phát sinh t shell ph i đi ngang driver thi t b tr c khi đ n terminal.
Khi làm vi c trên h th ng Linux, ch ng trình xem t t c các thi t b n i k t v i h th ng đ u nh nhau, m t s phím quan tr ng:
Phím Mô t
Interrupt ình ch th c hi n m t ch ng trình. Linux dùng t h p phím
<Ctrl+C>.
Erase Xóa kí t cu i cùng trong vùng đ m. ó là phím <Backspace>
Kill Xóa toàn b nh ng gì trong vùng đ m tr c khi chuy n sang shell ho c ch ng trình ng d ng. Thông th ng đó là phím <@>. Không gi ng
nh tr ng h p b m phím d ng, b n s không th y hi n ra d u nh c shell khi b m phím kill, b i vì driver ch b n gõ ti p vào.
End-of-line Báo cho driver bi t b n đã gõ xong các kí t , và mu n chúng đ c thông d ch và chuy n sang shell ho c ch ng trình. Linux s d ng
phím <Enter>
End-of-file Báo cho shell thoát ra và hi n th d u nh c đ ng nh p. Kí t cu i t p tin là <Ctrl+d>.
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 120/271 I.2.2 Thi t l p môi tr ng Shell
Khi đ ng nh p vào h th ng, ng i dùng s làm vi c trong môi tr ng shell c a mình do Linux đnh ngh a tr c. Trong môi tr ng shell g m nhi u bi n. Khai báo m i bi n có d ng <BI N=giá- tr >, ý ngh a c a m t bi n nh th nào là tùy b n ch đnh. Tuy nhiên, có m t s bi n đã đ c đnh ngh a s n. Ví d nh bi n: TERM, PATH. B ng sau đây li t kê nh ng bi n môi tr ng ph bi n trong shell Bourne:
Bi n Mô t
HOME=/home/đ ng- nh p
HOME l p home directory c a b n.
ng-nh p là ID đ ng nh p. Ví d , n u ID đ ng nh p c a b n là jack,
thì HOME s là /home/jack LOGNAME=đ ng-
nh p
Máy s t đ ng l p LOGNAME b ng ID đ ng nh p c a b n PATH=đ ng-d n Tùy ch n đ ng-d n tr đ n danh
sách các th m c mà shell s duy t qua đ tìm l nh. Ví d , b n có th
l p đ ng d n nh sau:
PATH=/usr:/bin:/usr/local/bin PS1=d u-nh c PS1 là d u nh c shell đ u tiên đ
yêu c u b n xác đnh hình dáng c a d u nh c riêng theo ý c a mình. N u
b n không có thay đ i gì d u nh c m c đnh s là d u $( cho ng i dùng không ph i là root). B n có th
thay đ i, ch ng h n nh : PS1=Enter Command >
PWD=th -m c Xác đnh v trí c a b n trong h th ng t p tin
SHELL=shell SHELL xác đnh shell mà b n đang s d ng.
TERM=lo i-terminal Ki u terminal b n dùng
L u ý: n u mu n xác l p nh ng bi n môi tr ng, b n hãy xác đnh trong t p tin .bash_profile (n u ch y shell bash), trong t p tin .login (n u ch y shell C) và trong t p tin .profile (n u ch y shell Bourne).
I.2.3 S d ng các bi n Shell đ c bi t
Bi n HOME: luôn xác đnh home directory c a b n. Khi v a đ ng nh p thành công, b n ngay trong home directory.
- Mu n tr v home directory c a mình, b n ch c n gõ l nh cd.
- B n có th dùng bi n HOME khi biên so n shell script đ xác đnh nh ng t p tin trong home directory.
- $HOME luôn đ i di n cho home directory c a b t k ai s d ng l nh. N u b n gõ l nh b ng
$HOME thì nh ng ng i khác c ng có th dùng chung l nh.
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 121/271 Bi n PATH: Li t kê các th m c mà shell s đ n tìm nh ng câu l nh. Shell tìm các th m c theo th t đã li t kê.
Ví d : N u PATH=/bin:/usr/bin: M i khi thông d ch m t câu l nh, shell s tìm tr c tiên trong th m c /bin. N u ch a phát hi n ra l nh c n tìm, shell ti p t c duy t sang th m c /usr/bin. N u v n ch a có k t qu , shell l i dò sang th m c (th m c hi n hành). Chúng ta nên x p t t c các shell script c a mình vào m t th m c và ghi vào bi n PATH. Nh th , sau này cho dù b n đang
th m c nào thì c ng th c thi đ c nh ng shell script đó.
Bi n MAIL: Ch a tên t p tin l u tr email c a b n. M i khi nh n email, h th ng s đ a vào t p tin do bi n MAIL xác đnh. N u b n có ch ng trình thông báo m i khi có mail đ n, ch ng trình này s liên h v i t p tin k t h p v i bi n MAIL. Bi n PS1: ch a nh ng chu i kí t mà b n nhìn th y t i d u nh c s kh i.
Bi n TERM: Dùng đ nh n d ng lo i terminal. Nh ng ch ng trình nào ch y ch đ toàn màn hình, ví d nh vi, s tham kh o bi n TERM
Bi n LOGNAME: Ch a chu i kí t mà h th ng dùng đ nh n d ng ra user đ ng nh p. Bi n này còn giúp h th ng bi t b n là ch s h u các t p tin và th m c, là ng i ra l nh ch y m t s ch ng trình, và là tác gi c a email g i b ng l nh write.
II. M c đ ích và ý ngh a c a vi c l p trình Shell
Shell là l p v bên ngoài h t nhân, là ph n trung gian cho ng i dùng thao tác v i h t nhân. B n đã r t quen thu c v i các shell trong DOS nh command.com s d ch các l nh nh del, copy, … thành nh ng ng t c p th p c a h đi u hành DOS đ th c hi n. Ngoài ra DOS còn cho chúng ta t o các t p tin .bat g m nhi u l nh th c hi n trình t . Shell trong DOS nói chung còn r t đ n gi n và không s d ng nhi u các tác v h th ng. Linux cung c p các shell phong phú, uy n chuy n h n. Nó cho phép b n t o nh ng t p tin d ng bat v i c u trúc l p nh C, hay có th s d ng ph i h p nhi u l nh shell v i nhau.
Ví d : b n có th k t h p l nh ls và more đ xem danh sách các t p tin th m c theo t ng trang.
ls –l | more
Linux cho phép k t h p d li u vào ra gi a các l nh v i nhau thông qua c ch chuy n ti p (redirect) và ng d n (pipe). Ngoài ra, Linux cho phép s d ng các l nh có c u trúc gi ng C nh if, case, for … ây là đi m m nh c a shell trong Linux. V i các c u trúc đi u khi n nh v y chúng ta x lý đ c nhi u tr ng h p b ng cách k t h p các l nh shell v i các đi u ki n x lý.
Ngoài ra shell còn h tr ch đ ra vào d li u, t ng tác các bi n môi tr ng.
Nh ng ch ng trình shell s giúp ng i dùng s d ng và qu n lý h th ng và d ch v trên Linux.
Ví d nh kh i đ ng hay ng ng m t ng d ng, b n có th vi t m t đo n ch ng trình shell th c hi n tác v này. Chính s đa d ng trong shell cho phép ng i dùng t o ra ch ng trình shell qu n lý d ch v h th ng m t cách hi u qu .
III. i u khi n Shell t dòng l nh
Ng i dùng có th s d ng các l nh shell t dòng l nh. Khi ng i dùng ch a hoàn t t l nh thì shell hi n th d u > đ chúng ta thêm vào.
Ví d :
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 122/271
$ if [ $file –d ] ;
> echo ls $file
> else echo “$file is not file”
> fi
Chúng ta s d ng nhi u l nh trên m t dòng cách nhau b ng d u ch m ph y (;) Ví d :
cd /etc ; ls –l
B n ch c n gõ Enter thì s th c hi n các l nh trên dòng đó. i u b t ti n nh t khi s d ng trên dòng l nh là kh n ng s a ch a l i khi chúng ta nh m l n. Do v y ng i ta th ng ghi các l nh vào trong t p tin, r i cho nó th c hi n tu n t . T p tin ch a các l nh này đ c g i là t p tin l nh hay các shell script.
IV. i u khi n t p tin l nh
T p tin l nh có th đ c th c thi theo 2 cách.
Cách 1: B n g i shell và dùng t p tin là tham s :
$ /bin/sh tên-t p-tin.
Ví d : $/bin/sh hello.
Cách 2: B n s g i t p tin l nh t d u nh c c a shell nh th c hi n các l nh thông th ng. Theo cách này, tr c h t b n ph i c p quy n th c thi (excute) trên t p tin này. Tùy theo nhu c u s d ng t p tin l nh b n có th c p quy n cho ng i s h u, cho nhóm s h u hay cho m i ng i.
L nh c p quy n nh chúng ta đã h c là chmod. L nh c p cho m i ng i có quy n th c thi : chmod +x <tên-t p-tin>
Ch cho ng i s h u th c thi : chmod o+x tên-t p-tin
Ch y t p tin l nh: B n gõ l nh trong console ./đ ng-d n/tên-t p-tin ho c xác đnh bi n môi tr ng PATH s d ng th m c ch a t p tin và gõ tên-t p-tin trong c a s console. N u b n đang làm vi c t i th m c ch a t p tin, b n có th ch y b ng l nh:
./tên-t p-tin
Ví d : C p quy n và th c thi ch ng trình hello :
$cd /home/hv/baitap
$chmod +x hello
$./ hello
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 123/271 B n mu n t p tin này có th th c thi đ c t b t c n i đâu ch mà ch c n gõ hello thì b n s đ t l i bi n môi tr ng PATH trong t p tin .bash_profile trong th m c home:
PATH=$PATH:/home/hv/baitap. N u b n mu n t p tin này cho nh ng ng i dùng khác s d ng thì b n chép nó vào th m c /usr/local/bin. B n nên nh c p quy n l i cho t p tin này n u b n không mu n nó b xóa hay b s a ch a . o n l nh sau có ý ngh a : Chép t p tin hello vào th m c /usr/local/bin và chuy n quy n s h u t p tin cho root, c p cho root toàn quy n trên t p tin này, nh ng ng i khác ch có quy n đ c và th c thi.
$cp hello /usr/local/bin
$chown root /usr/local/bin/hello
$chgrp root /usr/local/bin/hello
$chmod u=rwx go=rx /usr/local/bin/hello
V. Cú pháp ngôn ng Shell
Ngôn ng Shell là d ng ngôn ng script, không có đ uy n chuy n hay ph c t p nh các ngôn ng l p trình chuyên nghi p C, Pascal hay Java… Ch ng trình Shell đ c so n th o d i d ng v n b n (text) và không đ c biên d ch thành t p tin binary nh các ngôn ng khác. Khi ch y ch ng trình shell, shell s biên d ch và th c thi. Trong Linux chúng ta g p r t nhi u các ch ng trình shell x lý nh ng công vi c r t h u hi u. Là nhà qu n tr b n c n ph i n m v ng cú pháp ngôn ng shell đ không ch vi t nh ng đo n ch ng trình mà ít ra c ng hi u đ c các script có s n đi u khi n h th ng c a mình. Các thành ph n trong ngôn ng shell:
- Bi n: ki u chu i, tham s và bi n môi tr ng.
- i u ki n: ki m tra lu n lý.
- Các l nh đi u khi n: if, for, while, until, case.
- Hàm.
- Các l nh n i trú c a shell.
V.1. Ghi chú, đ nh shell th c thi, thoát ch ng trình
Dòng chú thích s d ng trong các source ch ng trình dùng đ gi i thích ý ngh a các l nh ho c ch c n ng c a m t bi n hay m t đo n ch ng trình. Nh ng dòng này không đ c biên d ch đ i v i các ngôn ng l p trình, và nó không đ c th c thi đ i v i ch ng trình shell. B t đ u m t dòng chú thích là d u # .
Ví d : m t đo n ch ng trình s d ng dòng ghi chú.
# Ki m tra có t n t i tham s đ u tiên if test $1 –z ; then
echo “Khong co tham so“
fi # k t thúc if
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 124/271 Tr ng h p đ c bi t sau d u # là d u ch th ! (#!) dùng đ gi i thích đây chính là dòng l nh g i shell đ thông d ch các l nh trong t p tin này. B n th ng th y dòng đ u tiên trong các ch ng trình shell là #! /bin/bash. i u này có ngh a là b n s dùng shell bash đ thông d ch l nh. Shell chúng ta ch y có th xem là shell ph và chúng có th th c thi các l nh mà không làm bi n đ i các bi n môi tr ng c a shell chính. Cú pháp chung c a ch th này là :
#!shell-th c-thi
N u chúng ta không khai báo thì shell m c nhiên trong Linux là bash. Các h Unix khác thì shell m c nhiên là sh. Ch th #! Còn dùng đ ch y các ch ng trình khác tr c khi th c thi các l nh ti p theo.
V.2. S d ng bi n
Bi n dùng trong ch ng trình shell không c n ph i khai báo tr c nh các ngôn ng C, Pascal, ... Nó s t đ ng khai báo khi ng i dùng s d ng l n đ u tiên. Bi n ch có th l u tr d li u d i d ng chu i dù nó có th ch a s . Trong tr ng h p mu n s d ng giá tr bi n nh là s thì ph i có các phép bi n đ i mà b n s tìm hi u trong ph n sau. M t v n đ mà b n ph i l u ý là shell phân bi t ch hoa và ch th ng. Ví d hai bi n tong và Tong là khác nhau.
V.2.1 Phép gán giá tr cho bi n
đ t giá tr m i cho bi n chúng ta s d ng phép gán.
Cú pháp:
Ten-bien=giatri Ví d :
Ten=Hung So=200
Giá tr đ c gán có th là h ng, bi n ho c bi u th c.
L u ý: Là b n không đ c dùng d u kho ng tr ng gi a tên-bi n=giá-tr Ví d : ten =Hung là không h p l
V.2.2 L y giá tr c a bi n
Mu n l y giá tr c a bi n chúng ta thêm d u $ vào phía tr c tên bi n:
$tên-bi n Ví d : tp=HaNoi echo $tp
$tp s mang giá tr “HaNoi.”
V.2.3 Hi n th giá tr c a bi n ra màn hình
L nh echo dùng đ hi n th bi n ra màn hình. Ta có th dùng m t trong 3:
echo “Dòng hi n th ”
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 125/271 echo “dòng hi n th ”
echo ‘dòng hi n th ’
Nh ng kí t n m trong d u ‘ ‘ đ c xem nh là h ng chu i. T t c các kí t s hi n th h t ra màn hình, k c các kí t đ c bi t.
Ví d :
echo ‘ Gia tri cua bien la $bien ‘
K t qu hi n th : Gia tri cua bien la $bien
Khác v i ý ngh a c a d u ‘’, d u “ ” dùng đ xác đnh chu i bao g m c các ký t hi n th và các giá tr bi n. Mu n hi n th các ký t đ c bi t chúng ta ph i thêm d u \ vào tr c ví d :
echo ten=Dung
echo “Su dung dau nhay kep”
echo “Gia tri bien la $ten ” echo “Ky hieu tien la \$”
K t qu hi n th : Su dung dau nhay kep Gia tri bien la Dung Ky hieu tien la $
V.2.4 Nh p giá tr cho bi n t bàn phím Cú pháp: read <tên-bi n>
G p l nh này ch ng trình s đ i ng i dùng nh p giá tr vào, khi d li u đã xong thì n Enter.
Giá tr s đ c gán vào bi n tên-bi n.
Ví d :
echo “Nhap vao ten cua ban “ read ten
echo “Ten vua nhap la $ten”
Trong ví d trên khi xu t hi n dòng thông báo “Nhap vao ten cua ban “, ng i dùng nh p vào tên
“ Nguyen Hung Dung” thi k t qu hi n th là “Ten vua nhap la Nguyen Hung Dung “ V.2.5 Bi n môi tr ng
Bi n môi tr ng là bi n đ c đnh ngh a tr c và mang giá tr m c đnh khi shell kh i đ ng. Nó giúp các ch ng trình c ng nh h th ng trong vi c x lý các công vi c. Tên c a bi n môi tr ng th ng là ch hoa đ phân bi t v i các tên bi n do ng i dùng đ t trong ch ng trình.
M t s bi n môi tr ng thông d ng:
Bi n môi tr ng
Ý ngh a
H c ph n 4 - Ch ng ch qu n tr m ng Linux Trang 126/271 HOME Ch a th m c home c a ng i
dùng, là th m c s d ng sau khi đ ng nh p h th ng
PATH Danh sách các th m c tìm ki m khi th c hi n các l nh
PS1 D u nh c hi n th l nh, d u # đ i v i ng i dùng root, d u $ đ i v i ng i dùng th ng.
PS2 D u nh c th c p th ng là >
IFS D u phân cách các tr ng trong danh sách chu i. Th ng s d ng d u kho ng tr ng, tab và xu ng hàng
PPID S ID c a ti n trình cha trong SHELL
RANDOM S ng u nhiên
SECONDS Th i gian làm vi c tính theo giây
V.2.6 Bi n tham s
Khi g i các l nh chúng ta th ng thêm vào sau l nh các tham s , các tham s đó s là giá tr c a các bi n tham s c a ch ng trình.
Ví d cp sourc.txt dest.txt
Trong ví d sourc.txt và dest.txt là hai tham s c a ch ng trình cp. Thao tác v i các bi n tham s t trong ch ng trình chúng ta s d ng các ký hi u sau
Ký hi u bi n Ý ngh a
$1, $2, $3 Giá tr các bi n tham s th nh t, th 2.. t ng ng v i các tham s t trái sang ph i trong dòng tham s .
$0 Tên t p tin l nh g i
$* Danh sách tham s đ y đ
$# T ng s tham s .
$$ S ti n trình mà ch ng trình đang ho t đ ng
V.3. L nh ki m tra
L nh test ho c d u [ ] dùng đ ki m tra giá tr đúng sai c a bi u th c. L nh test cho phép ki m tra 3 ki u d i đây.