C¬ b¶n vÒ Shell

A. Giíi thiÖu chung

1. Giíi thiÖu vÒ shell

Khi chóng ta muèn thùc hiÖn mét lÖnh nµo ®ã trong hÖ ®iÒu hµnh Unix chóng ta cÇn ph¶i ra lÖnh ®Ó Unix hiÓu ®−îc chóng ta muèn lµm g×. ViÖc ra lÖnh nµy ®−îc thùc hiÖn qua shell. Nh−

vËy chóng ta cã thÓ hiÓu mét cçh ®¬n gi¶n shell lµ giao diÖn ®Ó giao tiÕp gi÷a ng−êi sö dông vµ Unix. Shell nhËn lÖnh tõ ng−êi sö dông sau ®ã dÞch vµ chuyÓn ®Õn hÖ thèng nh÷ng ho¹t

®éng cÇn thùc hiÖn ®Ó ®¸p øng yªu cÇu.

HiÖn nay cã mét sè lo¹i shell trong cç hÖ thèng Unix, trong mét sè tr−êng hîp trong mét hÖ thèng nµo ®ã cã thÓ cã mét hoÆc nhiÒu shell cïng tån t¹i. Mét sè lo¹i phæ biÕn ®ang tån t¹i nh−: Bourne shell, Korn shell, C shell, ... Mçi lo¹i cã sù khç nhau nh−ng tÊt c¶ ®Òu cung cÊp

®Çy ®ñ c«ng cô ®Ó thiÕt lËp m«i tr−êng giao tiÕp gi÷a ng−êi sö dông vµ Unix.

2. Môc ®Ých cña shell

Shell cã 3 môc ®Ých chÝnh nh− sau:

- T−¬ng tç (interactive use)

- §Æt biÕn m«i tr−êng ®èi víi mçi ng−êi sö dông

- LËp tr×nh

T−¬ng tç

Tr−êng hîp ®−îc coi lµ ®¬n gi¶n khi sö dông shell, shell ®îi ng−êi sö dông gâ cç lÖnh t¹i dÊu nh¾c, sau ®ã göi tíi hÖ thèng yªu cÇu tõ lÖnh nhËn ®−îc.

§Æt biÕn m«i tr−êng ®èi víi mçi ng−êi sö dông Unix shell xç ®Þnh cç biÕn ®Ó ®iÒu khiÓn m«i tr−êng cña ng−êi sö dông ®èi víi mçi phiªn sö dông. ViÖc ®Æt cç biÕn nµy sÏ xç ®Þnh víi hÖ thèng nh÷ng tham sè nh− th− môc nµo sÏ ®−îc sö dông lµm th− môc chÝnh, n¬i ®Æt mail, nh÷ng th− môc nµo ®−îc sö dông mÆc

®Þnh khi b¹n gäi ®Õn cç lÖnh Unix, ... Mét sè biÕn hÖ thèng cã thÓ ®−îc ®Æt trong tÖp khëi

®éng (start-up file) vµ ®−îc ®äc khi b¹n login (®¨ng nhËp). Trong tÖp khëi ®éng b¹n cã thÓ ®Æt cç lÖnh cña Unix, nh−ng chó ý lµ nh÷ng lÖnh nµy sÏ ®−îc thùc hiÖn mçi khi b¹n login.

LËp tr×nh

Shell cung cÊp tËp hîp cç lÖnh ®Æc biÖt mµ tõ ®ã cã thÓ t¹o nªn nh÷ng ch−¬ng tr×nh, khi

®ã ®−îc gäi lµ shell script. Trong thùc tÕ hÇu hÕt cç lÖnh nµy cã thÓ sö dông trong cña sæ lÖnh cña Unix vµ ng−îc l¹i, cç lÖnh cña Unix ®Òu cã thÓ viÕt trong shell script. Shell script rÊt tiÖn lîi trong viÖc gép nhiÒu lÖnh ®éc lËp vµo mét vµ thùc hiÖn nhiÒu lÇn.

Ngoµi nh÷ng lÖnh ®¬n gi¶n cña hÖ thèng Unix, shell cßn ®−îc bæ sung thªm cç cÊu tróc phøc t¹p nh− ®iÒu khiÓn rÏ nh¸nh (if/case), vßng lÆp (for/while).

VietHung soft group - viethung_group@email.com

Mét tÖp ch−¬ng tr×nh cña shell kh«ng quan träng ®Õn tªn vµ ®u«i, kh«ng cÇn dÞch còng nh−

kh«ng cã m«i tr−êng ph¸t triÓn. ViÖc so¹n th¶o mét tÖp shell cã thÓ sö dông bÊt kú mét c«ng cô so¹n th¶o nµo, chØ cÇn ghi tÖp ®ã víi d¹ng text, sau ®ã ®æi thµnh d¹ng tÖp cã thÓ ch¹y

®−îc. Xem vÝ dô 1 trong phÇn sau ®Ó hiÓu thªm chi tiÕt.

Shell lu«n g¾n liÒn víi hÖ ®iÒu hµnh Unix, nh−ng ®Ó hiÓu vµ häc shell kh«ng nhÊt thiÕt b¹n cÇn hiÓu s©u vÒ hÖ thèng còng nh− cç lÖnh cña Unix. Tuy nhiªn th«ng qua nh÷ng vÝ dô chóng t«i nªu ë ®©y cç b¹n cã thÓ hiÓu thªm cçh sö dông lÖnh vµ biÕn hÖ thèng.

Chó ý: Chóng t«i chØ nh¾c ®Õn hÖ ®iÒu hµnh Unix khi giíi thiÖu còng nh− h−íng dÉn sö dông, nh−ng thùc tÕ hiÖn nay Linux lµ mét hÖ ®iÒu hµnh kÕ thõa cña Unix. Linux còng cã nh÷ng shell t−¬ng tù vµ b¹n cã thÓ sö dông nh÷ng giíi thiÖu vÒ shell ë ®©y víi cç hÖ thèng Linux.

3. Nh÷ng lo¹i shell hiÖn thêi

HiÖn nay cã kh¸ nhiÒu lo¹i shell ®−îc sö dông trong cç hÖ thèng Unix, nh−ng ë ®©y chóng t«i chØ ®Ò cËp ®Õn 3 lo¹i c¬ b¶n vµ phæ biÕn, ®ã lµ:

- Bourne shell, ®−îc coi lµ shell chuÈn, c« ®äng vµ lµ lo¹i ®¬n gi¶n nhÊt.

- Korn shell, cao cÊp h¬n Bourne shell vµ cho phÐp so¹n dßng lÖnh.

- C shell, sö dông có ph¸p cña ng«n ng÷ lËp tr×nh C vµ cã thªm nhiÒu chøc n¨ng tiÖn lîi.

Th«ng th−êng cç hÖ thèng cã Ýt nhÊt lµ mét lo¹i shell vµ th«ng th−êng Bourne shell ®−îc sö dông ®Ó viÕt shell script, cßn sö dông mét lo¹i khç cho viÖc t−¬ng tç.

TÖp /etc/passwd sÏ xç ®Þnh lo¹i shell nµo sÏ ®−îc sö dông mÆc ®Þnh trong hÖ thèng cho mçi phiªn lµm viÖc cña b¹n. Trong phÇn cuèi cña dßng chøa tªn b¹n, b¹n cã thÓ t×m thÊy th«ng tin vÒ lo¹i shell nµo ®−îc sö dông. Mçi khi b¹n login, hÖ thèng sÏ ®äc tÖp nµy ®Ó lÊy th«ng tin khëi t¹o cho shell.

Th«ng tin cã thÓ gåm mét trong nh÷ng d¹ng sau:

/bin/sh Bourne

shell

/bin/jsh

Bourne shell, cã thªm phÇn ®iÒu khiÓn tç vô (job control)

/bin/ksh

Korn

shell

/bin/csh

C

shell

B¹n cã thÓ thay ®æi shell mÆc ®Þnh sang mét lo¹i khç b»ng cçh sö dông lÖnh: VÝ dô chuyÓn tõ Bourne shell sang C shell:

exec csh

hoÆc cã thÓ ®æi shell míi b»ng lÖnh:

chsh [<tªn shell>]

CÊu tróc lÖnh chsh nh− sau:

chsh [-s <tªn shell>] [ -l ] [<tªn ng−êi>]

chsh

-l

liÖt kª cç lo¹i shell hiÖn cã (th«ng tin chøa trong tÖp /ect/shells).

Trong phÇn tiÕp theo, chóng t«i sÏ giíi thiÖu vÒ Bourne shell, lo¹i tiªu chuÈn, ®¬n gi¶n vµ

phæ dông nhÊt hiÖn nay trong cç hÖ thèng Unix.

VietHung soft group - viethung_group@email.com

B. Bourne shell

1. In mét dßng ch÷ ra mµn h×nh

VÝ dô 1: B¹n t¹o ra mét tÖp víi tªn vidu1, sau ®ã gâ vµo nh÷ng dßng sau:

#!/bin/sh

#vi du dau tien

echo “Vi du dau tien voi shell.”

B¹n cã thÓ sö dông vi, emacs, .. ®Ó so¹n th¶o tÖp trªn. Sau ®ã dïng lÖnh chmod ®Ó chuyÓn tÖp vidu1 thµnh tÖp cã thÓ ch¹y ®−îc, lÖnh ®ã nh− sau: chmod +x thidu1

§Ó ch¹y thö b¹n chØ viÖc gâ: vidu1 <enter> ViÖc t¹o vµ dïng chmod ®Òu cÇn thùc hiÖn ®èi víi mçi tÖp sau khi t¹o ra vµ cÇn chuyÓn thµnh tÖp ch¹y ®−îc, chóng t«i sÏ kh«ng nh¾c l¹i vÒ sau n÷a. Nh−ng ®èi tÖp ®∙ ®−îc chuyÓn mod mét lÇn th× kh«ng cÇn lµm l¹i khi thay ®æi néi dung hay ®æi tªn.

Gi¶i thÝch:

- Dßng ®Çu tiªn lµ dßng ®Æc biÖt, dïng ®Ó xç ®Þnh lo¹i shell ®−îc sö dông vµ gäi ch−¬ng tr×nh th«ng dÞch shell t−¬ng øng.

- Dßng thø hai b¾t ®Çu b»ng dÊu # ®Ó chØ mét dßng chó thÝch.

- LÖnh echo dïng ®Ó in ra mµn h×nh x©u ký tù hay cç biÕn, echo cã cÊu tróc nh− sau: echo [-n] [x©u ký tù]

NÕu cã chøc n¨ng -n, con trá kh«ng bÞ ng¾t xuèng dßng sau khi in x©u ký tù.

Ngoµi ra, bªn trong x©u x©u ký tù cç b¹n cßn cã thÓ sö dông mét sè chøc n¨ng khç nh−:

\b

lïi l¹i mét ký tù (backspace).

\c

kh«ng xu«ng dßng (nh− -n).

\n

xuèng

dßng.

\t

in ra ký tù tab.

\\

in ra ký tù \.

\0n

in ra ký tù cã sè n (sè thËp ph©n) trong b¶ng m∙ ASCII.

Cç b¹n cã thÓ in ra nh÷ng ký tù ®Æc biÖt b»ng cçh ®Æt sau ký tù \, vÝ dô: \” ®Ó in ký tù nh¸y kÐp (”) ra mµn h×nh.

VÝ

dô:

echo “\”Thong bao co loi! \”, \c \007”

2. Thùc hiÖn cç lÖnh hÖ thèng

VÝ dô 2: VÝ dô thùc hiÖn mét lÖnh cña hÖ thèng.

#!/bin/sh

#vi du 2

echo

VietHung soft group - viethung_group@email.com

echo “Danh sach cac thu muc va tep:”

ls –l

echo

echo “Vi tri hien thoi: ”`pwd`

Trong ®ã lÖnh ls -l lµ mét lÖnh cña hÖ thèng ®−îc thùc hiÖn mµ kh«ng cÇn gâ tõ dÊu nh¾c.

Ngoµi ra tÊt c¶ cç lÖnh vµ tham sè khç cña hÖ thèng ®Òu cã thÓ ®−îc thùc hiÖn mét cçh t−¬ng tù, vÝ dô nh−: cd, cp, mkdir, chmod, cat, ...

3. BiÕn vµ tham sè hÖ thèng

Còng nh− cç ng«n ng÷ lËp tr×nh, shell cã thÓ sö dông biÕn nh−ng kh«ng cÇn khai b¸o vµ

®Þnh nghÜa kiÓu. Cç tham sè cña m«i tr−êng vµ hÖ thèng cã thÓ sö dông trùc tiÕp b»ng tªn.

Tªn cña cç tham sè th−êng lµ mét c¸i tªn, mét ký tù, sè hay mét trong cç ký hiÖu *, @, #,

?, -, $, !\^.

VÝ dô 3: VÝ dô vÒ dö sông tham sè hÖ thèng.

#!/bin/sh

#Vi du 3

echo

"Ten

tep

[$0]"

echo "Bien vao thu nhat [$1]"

echo "Bien vao thu hai [$2]"

echo "Chi so cua process [$$]"

echo "So bien dau vao [$#]"

echo "Tat ca cac bien dau vao [$@]"

echo

"Co

cua

process [$-]"

Cç b¹n cã thÓ hiÓu thªm khi thùc hiÖn lÖnh: vidu3 vi du 3

Gi¶i thÝch:

- Trong ®ã, $0 lµ biÕn chøa tªn cña tÖp võa ch¹y.

- $n, n=1,..9 lµ cç tham sè dßng lÖnh ®−îc ®−a vµ khi ch¹y.

- $$ lµ chØ sè cña tÖp võa ch¹y (ID process).

- $# lµ sè tham sè dßng lÖnh ®∙ ®−¬c ®−a vµo.

- $@ liÖt kª tÊt c¶ cç tham sè dßng lÖnh.

- @- cê cña process.

T−¬ng tù nh− cç ng«n ng÷ lËp tr×nh khç, shell script cung cÊp cç phÐp “g¸n” vµ “lÊy”

gi¸ trÞ cña biÕn. VÝ dô cã biÕn víi tªn var, viÖc g¸n vµ lÊy gi¸ trÞ ®−îc hiÓu nh− sau: var = <gi¸ trÞ>

gi¸ trÞ ë ®©y cã thÓ lµ mét sè, mét x©u ký tù hay tõ mét biÕn khç.

$ var

dïng ®Ó lÊy giçña biÕn var.

VietHung soft group - viethung_group@email.com

4. LÖnh vµo ra

LÖnh in ra echo nh− ®∙ ®−îc giíi thiÖu trong cç vÝ dô tr−íc, lÖnh read ®−îc dïng ®Ó ®äc vµo tõ bµn phÝm.

VÝ dô 4: VÝ dô vÒ lÖnh ®äc vµo vµ in ra d÷ liÖu.

#!/bin/sh

#Vi du 4

echo “Ban ten gi: “

read ten

echo “Chao ban $ten”

Gi¶i thÝch:

- read dïng ®Ó nhËn gi¸ trÞ tõ bµn phÝm sau ®ã g¸n vµo biÕn ten.

- $ ten tr¶ ra gi¸ trÞ mµ nã l−u tr÷.

LÖnh read cßn cã thÓ nhËn nhiÒu biÕn cïng mét lóc vµ cã cÊu tróc nh− sau: read <biÕn 1> [biÕn 2] [biÕn 3] ...

VÝ

dô:

read ten dienthoai diachi

Khi b¹n gâ vµo: Hung 0123456 334 Nguyen Trai B¹n dïng cç lÖnh sau ®Ó in thö cç biÕn ra mµn h×nh: echo “Ten : $ten”

echo “Dien thoai : “ $dienthoai”

echo “Dia chi : $diachi”

Trªn mµn h×nh sÏ in ra:

Ten

:

Hung

Dien

thoai:

0123456

Dia chi: 334 Nguyen Trai

Nh− vËy cã thÓ hiÓu nh− sau: Cç biÕn ®−îc nhËn gi¸ trÞ lÇn l−ît cho ®Õn dÊu cçh, biÕn cuèi cïng sÏ ®−îc nhËn toµn bé phÇn cßn l¹i. §èi víi biÕn cuèi cïng, nÕu kh«ng cßn d÷ liÖu th× sÏ

nhËn gi¸ trÞ rçng (null).

5. Ph©n biÖt dÊu huyÒn ( ` ), nh¸y ®¬n ( ' ) vµ nh¸y kÐp ( " ) Trong shell cã ba dÊu `, “, ‘ ®−îc dïng trong cç lÖnh in ra mµn h×nh hay lÖnh g¸n, nh−ng ý nghÜa vµ ph−¬ng thøc thùc hiÖn ®èi víi nh÷ng dÊu nµy lµ khç nhau.

5.1 DÊu ( ` )

VÝ dô trong mét tÖp shell cã nh÷ng lÖnh sau:

currentdir = `pwd`

VietHung soft group - viethung_group@email.com

linecount = `wc –l $filenamè

LÖnh thø nhÊt sÏ ®−îc thùc hiÖn vµ g¸n ®−êng dÉn hiÖn thêi vµo biÕn currentdir, lÖnh thø hai

®−îc thùc hiÖn vµ ®Õm sè dßng trong tÖp cã tªn trong $filename råi g¸n vµo biÕn linecount.

Nh− vËy b¹n cã thÓ hiÓu mét cçh ®¬n gi¶n lµ nh÷ng g× viÕt trong gi÷a hai dÊù ` sÏ ®−îc coi lµ lÖnh cña hÖ thèng vµ ®−îc thùc hiÖn, nh÷ng tham sè sau cç lÖnh hÖ thèng còng ®−îc tù

®éng g¸n trong phÇn nµy.

5.2 DÊu ( ' ) vµ ( " )

Khç víi dÊu huyÒn ( ` ), nh÷ng th«ng tin gi÷a hai dÊu nh¸y (nh¸y ®¬n hoÆc nh¸y kÐp) ®−îc coi lµ th«ng tin ®−îc sö dông trong lÖnh echo vµ sÏ ®−îc in ra mµn h×nh hay ®−îc g¸n vµo biÕn d¹ng x©u. Nh− vËy, kh«ng thÓ viÕt cç lÖnh hÖ thèng gi÷a hai dÊu nh¸y mµ chØ cç ®Ó cç x©u ký tù hay cç biÕn. Chóng ta xem xÐt nh÷ng dßng vÝ dô sau: myname = "Viet Hung" # g¸n gi¸ trÞ cho mét biÕn echo "$myname" # kÕt qu¶ ra mµn h×nh: Viet Hung echo '$myname' # kÕt qu¶ ra mµn h×nh: $myname B¹n cã thÓ dÔ thÊy sù khç biÖt cña hai dÊu nh¸y ®¬n vµ nh¸y kÐp qua nh÷ng dßng lÖnh trªn,

®èi víi nh¸y kÐp (“), khi in ra sÏ ®−îc thùc hiÖn víi gi¸ trÞ cña biÕn sau dÊu $. §èi víi dÊu nh¸y ®¬n (‘) th× sÏ in ra y nguyªn nh− trong dßng v¨n b¶n. Th«ng th−êng dÊu nh¸y ®¬n Ýt

®−îc sö dông nh−ng l¹i rÊt tiÖn lîi khi muèn in y nguyªn mét dßng v¨n b¶n, ®Æc biÖt lµ khi cã cç ký tù ®Æc biÖt nh− $, \.

6. Cç cÊu tróc phøc t¹p

Nh− ®∙ giíi thiÖu, ngoµi nh÷ng lÖnh ®¬n gi¶n nh− ®äc, in ra mµn h×nh vµ thùc hiÖn cç lÖnh hÖ thèng, shell cßn hç trî viÖc sö dông cç lÖnh phøc t¹p h¬n nh− if-then-else, for/while.

PhÇn d−íi ®©y chóng t«i sÏ giíi thiÖu ®Õn nh÷ng cÊu tróc nµy.

6.1 CÊu tróc vßng lÆp: for

CÊu tróc vßng lÆp for ®−îc x©y dùng nh− sau: for <biÕn ký tù> in <x©u>

do

<cç lÖnh cÇn thùc hiÖn>

done

Qua vÝ dô d−íi ®©y b¹n cã thÓ hiÓu râ h¬n cÊu tróc vßng lÆp for.

VÝ dô 5: VÝ dô vÒ vßng lÆp for.

#!/bin/sh

#Vi du 5

VietHung soft group - viethung_group@email.com

word=

"abcde"

#

khëi

t¹o

mét

x©u

dem

=

0

#

khëi

t¹o

biÕn

count

for letter in $word # vßng lÆp víi biÕn letter do #

lÖnh

b¾t

®Çu

vßng

lÆp

count=èxpr $count + 1` # t¨ng biÕn count lªn 1

echo "Letter $count is [$letter]" # in ra biÕn letter done #

lÖnh

kÕt

thóc

vßng

lÆp

Cã thÓ gi¶i thÝch nh− sau: víi mçi letter trong word th× thùc hiÖn nh÷ng lÖnh n»m trong do-done, trong vÝ dô trªn bao gåm t¨ng biÕn count vµ in biÕn letter ra mµn h×nh.

Chó ý: Trong vÝ dô trªn cã dïng lÖnh expr ®Ó gäi lÖnh thùc hiÖn tÝnh to¸n cña hÖ thèng tÝnh phÐp céng tr−íc khi g¸n vµo biÕn count.

6.2 CÊu tróc vßng lÆp: while

CÊu tróc cña vßng lÆp while ®−îc thÓ hiÖn nh− sau: while [ <®iÒu kiÖn> ]

do

<cç

lÖnh>

done

VÝ dô 6: VÝ dô vÒ vßng lÆp while.

#!/bin/sh

#Vi du 6

word=

"abcde"

#

khëi

t¹o

mét

x©u

dem

=

0

#

khëi

t¹o

biÕn

count

while [ $count –lt 5 ] # vßng lÆp víi biÕn letter do #

lÖnh

b¾t

®Çu

vßng

lÆp

count=èxpr $count + 1` # t¨ng biÕn count lªn 1

echo "Letter $count is [$letter]" # in ra biÕn letter done #

lÖnh

kÕt

thóc

vßng

lÆp

Cç b¹n cã thÓ thÊy ngay cÊu tróc hai vßng lÆp trªn gÇn hoµn toµn gièng nhau, chØ khç dßng for/while. Trong vÝ dô trªn, $count -lt 5 ®−îc coi lµ ®iÒu kiÖn cña vßng lÆp. PhÐp so s¸nh “-lt” lµ phÐp so s¸nh “nhá h¬n hoÆc b»ng” (less-than) trong lÖnh test cña Unix/Linux.

LÖnh kiÓm tra ®iÒu kiÖn trªn sÏ tr¶ ra gi¸ ®óng (1) trÞ hoÆc sai (0) ®Ó thùc hiÖn tiÕp hay tho¸t khái vßng lÆp.

Ngoµi phÐp so s¸nh “-lt" cßn cã -gt-lín h¬n, -eq-b»ng, -ne-kh«ng b»ng. Trong phÇn phô lôc chóng t«i cã liÖt kª l¹i cç lÖnh, tham sè vµ phÐp to¸n cña shell, cç b¹n cã thÓ ®äc ®Ó biÕt thªm cç phÐp to¸n khç.

VietHung soft group - viethung_group@email.com

Chó ý: Trong phÇn ®iÒu kiÖn cña vßng lÆp while còng nh− trong nh÷ng ®iÒu kiÖn khç, sau dÊu “[“ vµ tr−íc dÊu “]” b¾t buéc ph¶i cã dÊu tr¾ng (dÊu cçh).

6.3 CÊu tróc vßng lÆp: until

Chóng ta cã thÓ hiÓu vßng lÆp until t−¬ng tù nh− while. CÊu tróc cña vong lÆp until nh− sau: until [ <®iÒu kiÖn> ]

do

<cç

lÖnh>

done

6.4 CÊu tróc rÏ nh¸nh: if - else

CÊu tróc rÏ nh¸nh cã thÓ ®−îc hiÓu qua cç tõ khãa cã cÊu tróc nh− sau: if [ <®iÒu kiÖn> ]

then

<lÖnh>

[ elif <lÖnh> then <lÖnh> ] ...

[ else <lÖnh> ]

fi

§èi víi cÊu tróc nµy cã hai d¹ng, ®¬n gi¶n vµ phøc t¹p. Sau ®©y chóng t«i sÏ giíi thiÖu hai vÝ dô ®Ó cç b¹n hiÓu cçh sö dông.

VÝ dô 7: CÊu tróc if ®¬n gi¶n.

#!/bin/sh

#Vi du 7a

echo “Nhap so a: ”

read a

echo “Nhap so b: ”

read b

if [ $a –lt $b ] #kiÓm tra a nhá h¬n b kh«ng then

echo “so a nho hon so b.”

elif [ $a –eq $b ] #kiÓm tra nÕu a b»ng b then

echo “so a bang so b.”

else

#tr−êng hîp cßn l¹i

echo “so a lon hon so b.”

fi #kÕt

thóc

VÝ dô trªn thùc hiÖn ®èi víi cç sè, d−íi ®©y lµ vÝ dô ®èi víi ®−êng dÉn vµ tÖp trªn ®Üa.

VietHung soft group - viethung_group@email.com

#!/bin/sh

#Vi du 7b

if [ -f $dirname/$filename ]

then

echo "Tep [$filename] da ton tai."

elif [ -d $dirname ]

then

echo "Duong dan [$dirname] da ton tai."

else

echo "Ca duong dan [$dirname] va tep [$filename] khong ton tai."

fi

Trong vÝ dô trªn, f lµ cê kiÓm tra sù tån t¹i cña mét tÖp, d lµ cê ®Ó kiÓm tra sù tån t¹i mét th−

môc.

VÝ dô 8: CÊu tróc if phøc t¹p. Trong vÝ dô nµy b¹n sÏ hiÓu cçh sö dông ®iÒu kiÖn kÐp; && (vµ), || (hoÆc).

#!/bin/sh

#Vi du 8a

echo “Nhap so a: ”

read a

echo “Nhap so b: ”

read b

echo “Nhap so c: ”

read c

if [ $a –lt $c ] && [ $b –lt $c ] #xem c cã lín nhÊt kh«ng then

echo “so c lµ so lon nhat.”

fi

Trong vÝ dô trªn, && (vµ) lµ dÊu kiÓm tra kÐp ®Ó kÕt hîp hai ®iÒu kiÖn. Ta cã thÓ hiÓu ®iÒu kiÖn sau if nh− sau: “NÕu a nhá h¬n c vµ b nhá h¬n c th× ...” Ngoµi ra cßn cã || (... hoÆc ...).

#!/bin/sh

#Vi du 8b

if [ -f $dir/$file ] || [ -f $dir/$newfile ]

then

echo "Hoac tep [$file] "

echo "hoac tep moi [$newfile] da ton tai"

VietHung soft group - viethung_group@email.com

elif [ -d $dir ]

then

echo "Duong dan [$dir] da ton tai"

else

echo "Ca duong dan [$dir], tep [$file va tep moi $newfile]

deu khong ton tai"

fi

6.5 CÊu tróc rÏ nh¸nh nhiÒu tr−êng hîp: case

CÊu tróc case cã thÓ ®−îc hiÓu qua tËp cç tõ khãa sau: case <biÕn>

in

biÕn-1)

<lÖnh>

biÕn-2)

<lÖnh>

biÕn-3)

<lÖnh>

...

*) #cßn

l¹i

exit

esac

VÝ dô 9: VÝ dô vÒ case ®èi víi tham sè ®Çu vµo cña mét tÖp ch−¬ng tr×nh.

#!/bin/sh

#Vi du 9

size=0

page=200

option = “”

while [ "$1" != "" ]

do

case

$1

in

-?) echo “Su dung cac tham so –l,-p,-s.”

exit;;

-l) line = 50

page = 500

option = “$option page[$page] line[$line] “

shift;;

-p) line = 40

VietHung soft group - viethung_group@email.com

option = “$option page[$page] line[$line] “

shift;;

-s) size = 10;

shift 2;;

*) echo "Tham so vao khong co trong [p, l, s]"; exit;;

esac

if [ $size = 0 ]

then

size=ècho "$page / $lines" | bc`

else

lines=ècho "$page / $size" | bc`

fi

done

echo “$option $lines $size”

Trong vÝ dô trªn ®∙ ®−a ra cçh sö dông cÊu tróc case, ®ång thêi giíi thiÖu cçh nhËn vµ xö lý tham sè ®Çu vµo khi ch¹y mét tÖp shell script. LÖnh shift lµ lÖnh dÞch tham sè ®Çu vµo sang tr¸i 1 ®Ó thùc hiÖn cç tham sè tiÕp theo. §Æc biÖt trong ®ã cßn chØ cçh gäi m¸y tÝnh sè víi sè cÇn tÝnh ®−îc ®−a vµo tr−íc.

6.6 Hµm

Shell hç trî khai b¸o vµ sö dông hµm con, ®©y lµ mét hç trî rÊt h÷u Ých nh−ng cÇn ph¶i khai b¸o trong phÇn khëi ®éng cña ng−êi sö dông, cô thÓ lµ trong tÖp .profile.

Mét vÝ dô ®¬n gi¶n:

uppercase()

{

echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' \

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

}

Hµm trªn dïng ®Ó sö dông lÖnh tr cña hÖ thèng nh»m chuyÓn cç ch÷ th−êng thµnh ch÷ hoa.

ViÖc gäi hµm trªn chØ cÇn viÕt:

uppercase “thu chuyen doi”

hoÆc

smallword = “thu chuyen doi”

uppercase “$smallword”

Nh−ng nh− ®∙ nãi vÒ sù khç biÖt cña kÕt qu¶ trong dÊu nh¸y kÐp, kÕt qu¶ cña hai dßng lÖnh sau:

largeword = ùppercase “$smallword”`

VietHung soft group - viethung_group@email.com

largeword = ùppercase $smallword`

lµ khç nhau. Dßng thø nhÊt tr¶ ra: “THU CHUYEN DOI”, cßn dong thø hai se tra ra:

“THU”.

7. Lµm viÖc víi cç tÖp

Trong vÝ dô 7b chóng t«i ®∙ giíi thiÖu cçh kiÓm tra sù tån t¹i cña mét tÖp hay m«t ®−êng dÉn nªn trong phÇn nµy sÏ kh«ng ®Ò cËp ®Õn n÷a mµ chØ ®−a ra cçh ®äc vµ ghi mét tÖp.

#!/bin/sh

#Vi du dem so tep trong thu muc

count=1

for file in `ls -1 *`

do

echo "$count: $file" >> $mnu0

count=èxpr $count + 1`

done

#Vi du doc va ghi tu tep inputfile sang tep outputfile filelength=`wc -l $inputfile | cut -c1-8`

filelength=èxpr $filelength + 0`

while $filelength

do

line=`tail -$filelength $inputfile | head -1`

words=`s_count_args $lineècho "$line = $words words" >> $outputfile file_length=èxpr $filelength - 1`

done

Trong vÝ dô trªn cã sö dông mét vµi kü thuËt nh− ®äc phÇn cuèi cña tÖp ®Çu vµo (víi lÖnh tail)sau ®ã l¹i lÊy dßng ®Çu cña ®o¹n ®ã (víi lÖnh head -1) ®Ó lÊy ra ®−îc tõng dßng tõ trªn xuèng cña tÖp ®Çu vµo. Hai tham sè -c1-8 cña lÖnh wc dïng ®Ó bá phÇn tªn tÖp trong kÕt qu¶

liÖt kª sè dßng trong tÖp ®ã. Ngoµi ra, cç b¹n cã thÓ dïng lÖnh: Cat >> <tªn tÖp> <<-EOA

®Ó t¹o ra mét tÖp tr−íc víi tªn trong <tªn tÖp>.

8. T×m hiÓu lÖnh test

test lµ lÇ lÖnh kiÓm tra sù tån t¹i cña cç tÖp, th− môc vµ so s¸nh biÕn sè. CÊu tróc cña lÖnh test nh− sau:

test <®iÒu kiÖn>

hoÆc [<®iÒu kiÖn>]

VietHung soft group - viethung_group@email.com

Cã cç tham sè nh− sau:

§iÒu kiÖn víi cç tÖp, th− môc:

-f <tªn>

sù tån t¹i cña tÖp th«ng th−êng.

-d <tªn>

sù tån t¹i cña th− môc.

-c <tªn>

sù tån t¹i tÖp d¹ng ký tù.

-r <tªn>

sù tån t¹i vµ cã thÓ ®äc ®−îc.

-s <tªn>

sù tån t¹i vµ cã kÝch th−íc lín h¬n 0.

-w <tªn>

sù tån t¹i vµ cã thÓ ghi ®−îc.

-x <tªn>

sù tån t¹i vµ cã thÓ ch¹y ®−îc.

§iÒu kiÖn víi cç x©u ký tù:

-n s1

x©u s1 cã ®é dµi lín h¬n 0.

-z s1

x©u s1 cã ®é dµi b»ng 0.

s1 = s2

hai x©u s1 vµ s2 gièng nhau.

s1 != s2

hai x©u s1 vµ s2 kh«ng gièng nhau.

s1 < s2

x©u s1 ®øng tr−íc x©u s2 theo thø tù cña b¶ng m∙ ASCII.

s1 > s2

x©u s1 ®øng sau x©u s2 theo thø tù cña b¶ng m∙ ASCII.

string

biÕn

string kh«ng rçng (not null).

§iÒu kiÖn víi cç sè:

n1 -eq n2

so s¸nh b»ng.

n1 -ge n2

so s¸nh lín h¬n hoÆc b»ng.

n1 -gt n2

so s¸nh lín h¬n.

n1 -le n2

so s¸nh nhá h¬n hoÆc b»ng.

n1 -lt n2

so s¸nh nhá h¬n.

n1 -ne n2

so s¸nh kh«ng b»ng.

VÝ dô:

if test $# -gt 0 nÕu cã tham sè

if [ -n “$1” ] nÕu tham sè khç trèng

if [ $count -lt 5 ] nÕu gi¸ trÞ cña biÕn count nhá h¬n 5

Phô lôc

Danh sçh phÐp to¸n, lÖnh vµ tham sè m« tr−êng $0

tªn tÖp ®ang ®−îc thùc hiÖn

$1

tham sè thø nhÊt

$2

tham sè thø hai

...

$#

sè tham sè

$@ liÖt kª tÊt c¶ cç tham sè

$$

chØ sè cña process

VietHung soft group - viethung_group@email.com

$- cê (flag)

+ phÐp céng

- phÐp

trõ

* phÐp nh©n

/ phÐp

chia

%

phÐp lÊy phÇn d−

==

so s¸nh b»ng

!=

so s¸nh kh«ng b»ng

<

so s¸nh nhá h¬n

>

so s¸nh lín h¬n

>=

so s¸nh lín h¬n hoÆc b»ng

<=

so s¸nh nhá h¬n hoÆc b»ng

| |

hoÆc

&& vµ

$USER tªn ng−êi sö dông hiÖn t¹i

echo

in ra mµn h×nh

read

®äc tõ bµn phÝm

$HOME/$home

th− môc chÝnh cña ng−êi dïng hiÖn t¹i

$dir

$path

VietHung soft group - viethung_group@email.com