1) SIGHUP 2) SIGIN 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
3.7.2. Mr ng thams
Hình nh shel1 không cung c p c u trúc m ng ? úng v y, nh ng có m t cách khác c ng t ng t có th s d ng, đó là vi c thay th tên bi n, còn g i là m r ng tham s . Hãy xét ví d sau: #!/bin/sh l_tmp ="Hello" 2_tmp="There" 3_tmp=:"World" for i in 1 2 3 do echo $i_tmp done
Ta có 3 bi n 1_tmp, 2_tmp, 3_tmp, vòng l p for trong script d đnh ch dùng m t l nh echo đ in ra n i dung c a c 3 bi n m t cách tu n t . Th nh ng k t qu k t xu t trái l i, s nh n đ c 3 chu i r ng. Hi n nhiên ! b i vì l nh echo $i_tmp in ra n i dung c a bi n mang tên i_tmp ch không ph i 1_tmp hay 2_tmp nh ta mong mu n. Do i_tmp ch a có, nên k t q a là nh ng dòng tr ng đ c in ra.
Shell cung c p cú ph p { } đ b c các ph n c a bi n mà ta mu n thay th . L nh
for gi đây có th hi u ch nh l i đ ch y nh mong mu n theo cách sau: for i in 1 2 3
do
echo ${i}_tmp
done
K t q a khi duy t for l nh echo s thay th ${i} b ng 1, 2 và 3 , k t q a echo cho in ra đ n i dung c a 3 bi n 1_tmp, 2_tmp và 3_tmp.
Shell cho r t nhi u cách thay th tham s khác nhau. Th c s thì thay th tham s là công c r t m nh và dùng r t nhi u trong các script chuyên nghi p. D i đây là b ng
48
trình b y m t s ph ng pháp m r ng và thay th tham s r t h u ích.
M r ng Ý ngh a
${param:-default} N u giá tr c a param=null thì gán tr m i là default ${#param} Tr v chi u đài c a param.
${param%word} B t đ u t cu i chu i param lo i b chu i con ng n nh t c a param so kh p v i chu i word. Tr v k t qu là chu i còn l i .
${param%%w rd} B t đ u t cu i chu i param lo i b chu i con dài nh t c a param so kh p v i chu i word. Tr v k t qu là chu i còn l i.
$({param#word} B t đ u t đ u chu i param lo i b chu i con n n nh t c a param so kh p v i chu i word. Tr v k t qu là chu i còn l i.
${param##word} B t đ u t đ u chu i param lo i b chu i con dài nh t c a param so kh p v i chu i word. Tr v k t qu là chu i còn l i.
Vi c thay th chu i trong tham s đ c bi t h u d ng trong tr ng h p x lý tên đ ng d n, t p tin, th m c nh trong ví d sau:
Ví du 3-32 param_expansion.sh #!/bin/sh unset foo echo ${foo:-bar} foo=fud echo ${foo:-bar} foo=/usr/bin/X11/startx echo ${foo#*/} echo ${foo##*/} bar=/usr/local/etc/local/networks echo ${bar%local*} echo ${bar%%local*} exit 0 K t xu t s là $./param_expansion.sh bar fud usr/bin/X11/startx startx /usr/local/etc
49 /usr
Cách ch ng trình làm vi c:
L nh đ u tiên ${foo:-bar} gán tr bar cho bi n foo b i hi n t i foo đang là r ng vào lúc th c thi l nh. Tuy nhiên sau khi gán foo=fud thì l nh ${foo:-bar} không làm thay đ i tr c a foo.
Ta có th có m t vài cách m r ng sau:
${foo:=bar} s tr v tr bar n u foo t n t i tr c đó và foo đang ch a tr khác r ng. Ng c l i tr tr v s là bar và n i dung bar c ng s đ c gán cho foo. ${foo:?bar} s in ra foo: bar và ch m d t l nh th c thi n u bi n foo ch a t n t i ho c foo đang là r ng.
Cu i cùng, ${foo:+barr} tr v tr bar n u foo t n t i và khác r ng.
L nh {foo#*/ } so kh p và ch lo i b ký t / bên trái c a bi n chu i (* mang ý ngh a đ i di n, nó có th dùng đ so kh p m t ho c nhi u ký t ).
L nh {foo##* /} so kh p và lo i b càng nhi u ký t càng t t, vi c lo i b b t đ u t bên ph i đ i v i t t c ký t đ ng tr c d u / sau cùng.
L nh echo ${bar%local*} so kh p và lo i b các ký t b t đ u t bên ph i cho đ n khi g p chu i local đ u tiên xu t hi n.
Ng c l i echo ${bar%%local*} s c g ng lo i b càng nhi u ký t càng t t cho đ n khi g p chu i local sau cùng.
M t ví d khác cho th y cách s d ng thay th chu i trong tham s r t h u d ng nh sau:
cjpeg là ch ng trình chuy n nh ,gif thành ánh .jpg. cpeg đ c s d ng nh sau: $cjpeg image.gif > image.jpg
N u mu n chuy n đ ng lo t t t cá các flle *.gif trong th m c thành *.jpg thì sao. Hãy dùng script sau:
Ví du 3-33 giftojpg.sh
#!/bin/sh
for image in *.gif do
cjpeg $image > ${image%%gif}jpg done