搜集资料,交流经验……

unix下shell编程(二)

上一篇 / 下一篇  2008-04-18 23:36:43 / 个人分类:操作系统

aQW)Z(R5t03>在Shell中使用数据变量 51Testing软件测试网!N9}`/['p7}+u;N@

-jg:A-A8s.aq0                    用户可以在Shell中使用数据变量,例如ba.sh程序:

W/{8? G j*K!Gqi7n0 51Testing软件测试网6_r5e,|g m

                      cd/usr/icewalk
0iaqc[ejs3l0                      ls|cpio -o > /dev/fd0 51Testing软件测试网IL Ob2fDf

51Testing软件测试网B^!Y.e7g#t

                    该程序中要备份的目录为一常量,即该程序只能用来备份一个目录。若在该程序中使用变量,则会使其更通用:

-w8L1MG:{7Tm]0 51Testing软件测试网3} vw"XXK1?

                      workdir= 51Testing软件测试网(e+ut1z d,z3Z5j ^
                      cd $workdir
P)xo(_j9Yu0Nn0                      ls * |cpio -o > /dev/fd0 51Testing软件测试网-T1hOZ!aj/Yi

51Testing软件测试网f8N#bnbd:e

                    通过这一改变,用户可以使用程序备份变量$workdir指定的目录。例如我们要备份/home/www的内容,只要运行ba.sh 51Testing软件测试网.]+X_B4DM

51Testing软件测试网u j8ZA3Nq

                  /home/www即可实现。(若不明白 51Testing软件测试网}PMIF0h
                  ,下面将详细介绍shell参数的传递,代表本sh程序-ba.sh的第一个参数) 51Testing软件测试网 FxtG7mkY

1u(M7I+^Lsv:qc0                    4>在Shell程序中加上注释 51Testing软件测试网f \:KQ`)t1D

51Testing软件测试网8vfx {6E?~ ^

                    为了增加程序的可读性,我们提倡加入注释。在Shell程序中注释将以"#"号开始。当Shell解释到"#"时,会认为从"#"号起一直到该行行尾为注释。 51Testing软件测试网WZ ]}8X

51Testing软件测试网R8toEu]j


pH4~n&fe+n3L0                    5>对Shell变量进行算术运算

i6uSN'mN8\e0 51Testing软件测试网 f0g7mL*]9EM

                    高级语言中变量是具有类型的,即变量将被限制为某一数据类型,如整数或字符类型。Shell变量通常按字符进行存储,为了对Shell变量进行算术运算,必须使用expr命令。 51Testing软件测试网,pPd O~R

^lW@}Zj+T051Testing软件测试网Nc,sL3FZ~,p
                    expr命令将把一个算术表达式作为参数,通常形式如下:

+q1\2} Q_7|T@ T#G#LUv0 51Testing软件测试网,ye0|5VYK

                      expr [数字] [操作符] [数字]

AZ{0a0e{;H s)Z/t!i0

5qCw'][t^0                    由于Shell是按字符形式存储变量的,所以用户必须保证参加算术运算的操作数必须为数值。下面是有效的算术操作符:

w1r"wgC4k*aO B6J e#|0 51Testing软件测试网.l8R|c.w;k%g@B

                      +   两个整数相加 51Testing软件测试网}({3EKa
                      -   第一个数减去第二个数
7Y-BP4^\%ll0                      *   两整数相乘
G*}7j M0E'f}|%|0                      /   第一个整数除以第二个整数 51Testing软件测试网 _T1w*SL-h
                      %   两整数相除,取余数 51Testing软件测试网.}(_*O0LbU \M V
                    例如: 51Testing软件测试网.H_R-{ W'EVW
                      $expr 2 + 1
I{0}\-]/mj1|:R0                       结果显示:3
3R/]}6A9MA sA0                      $expr 5 - 3 51Testing软件测试网,AZ h D-l1u$C2Y"K
                       结果显示:2

U-k)_1U{a0

E-x;EV&Bh;Jr0                  若expr的一个参数是变量,那么在表达式计算之前用变量值替换变量名。 51Testing软件测试网-n%}W/tAC
                      $int=3 51Testing软件测试网iq0Qz3~)@tg
                      $expr $int + 4 51Testing软件测试网1t*s(W1y"P1v
                      结果显示:7
G4f5d8Be6FI Em*L/l0                    用户不能单纯使用"*"做乘法,若输入: 51Testing软件测试网fNOS Umc*Cv'A
                      $expr 4*5 51Testing软件测试网_R`m2N+?tY+G
                    系统将会报错,因为Shell看到"*"将会首先进行文件名替换。正确形式为: 51Testing软件测试网7o1r Q s$DF
                      $expr 4 \* 5
"|L2Ca%~s,M0                       结果显示:20 51Testing软件测试网3b1QEiK
                    多个算术表达式可以组合在一起,例如:
[s HJ |L |NH0                      $expr 5 + 7 / 3 51Testing软件测试网r7v6zxSu9A0w
                      结果显示:7 51Testing软件测试网^1A\+o3l
                    运算次序是先乘除后加减,若要改变运算次序,必须使用"`"号,如:
E$e|;t~f0                      $int=`expr 5 + 7`
L8{`C5kc])x'D0                      $expr $int/3
D:]$Z7tH0                       结果显示:4
(J:~/v)\:|nu;b0                      或者:
x Y$M V_3wly |v ?0                      $expr `expr 5+7`/3 51Testing软件测试网)McS3]-wq)@i
                      结果显示:4

G-l*U}&j0

E-n_SM XnH%bI0                    6>向Shell程序传递参数

gcP7WGl~9sf0

| WD2c.\1_Xo0                    一个程序可以使用两种方法获得输入数据。一是执行时使用参数。另一种方法是交互式地获得数据。vi编辑程序可以通过交互式的方法获得数据,而ls和expr则从参数中取得数据。以上两种方法Shell程序都可以使用。在"交互式读入数据"一节中将介绍Shell程序通过交互式的方法获得参数。

C1r3b"WI-y8L0 51Testing软件测试网5{:d2ZTR[

51Testing软件测试网 ^JA'{$w$N;D1f
                    通过命令行给Shell程序传递参数可以扩大程序的用途。以前面提到的ba.sh程序为例:
~ PC%[,o(r[K&U"Jw0                    $cat >re.sh
A7R\3u;\ K0                    cd $workdir
#T3tRq-r']0                    cpio -i < /dev/fd0 51Testing软件测试网@bZ?4yy
                    ^d

y-i:DrR/h7@9E;p n1\0

l4H4N^-I C`9E4Y0                    程序re.sh恢复了ba.sh程序备份的所有文件。若只从软盘上恢复一个指定的文件,可以用该文件名作为参数,传递给Shell程序re.sh: 51Testing软件测试网AT,[O_F"f

c ~P }U*W%Vm0
XRth}V0                    程序改写如下:
aqF!P` K/y0                    $cat >re2.sh
ioW~2Sy@)io0                    cd $workdir 51Testing软件测试网 FE D,G7Q!D
                    cpio -i < /dev/fd0 51Testing软件测试网}!B1n&e_9c6cW
                    ^d

6QR"n#dn^|K B0

3?"QwQsk?UA0                    用户可以指定要恢复的文件,例如fname 51Testing软件测试网|3ZkC)h.L{#p

51Testing软件测试网LA,?8W }-A!\dY

                    $re2.sh fname 51Testing软件测试网Mb Hc8\$Gv

"`%t(N z!\z A4B0                  此时文件fname作为第一个位置参数传递给re2.sh,re2.sh的缺点是要恢复两个或多个文件要重复运行,我们可以用$*变量传递不确定的参数给程序:

1Q]a5f R)~_5K0 51Testing软件测试网 f(X;o'^Lf


LY6z^P.Jf5mL0                    $cat >re3.sh 51Testing软件测试网D`$F ~M:w N#]E u
                    cd $workdir
Gu5S$U$UWG[e0                    cpio -i $* < /dev/fd0
8g-i1Z)r a0                    ^d 51Testing软件测试网 y lmOgA

51Testing软件测试网Z oM#K[S

                    我们就可以恢复多个文件,例如fname1,fname2,fname3
FlG*Ce&[0                    $re3.sh fname1 fname2 fname3 51Testing软件测试网*Qm)l'N8U.]$C S
                    (以上程序re.sh,re2.sh,re3.sh,假设用户已经chmod了可执行权利) 51Testing软件测试网ly:LB"P,[eIg

0i3~me[u&c0                    因为没有赋值的变量可以作为NULL看待,所以若是程序re3.sh在执行时候没赋予参数,那么一个空值将被插入到cpio命令中。该命令将恢复所有保存的文件。 51Testing软件测试网gQUqd4l$G"AOs\S

WWq+S;GBy)_0
A9an8`P \bs8V0                  条件判断语句

-Y#H)Sy!l.D(U!Z0 51Testing软件测试网7X8b)w4K"Y

                    条件判断语句是程序设计语言中十分重要的语句,该语句的含义是当某一条件满足时,执行指定的一组命令。

_'~#Rq?l E'I6F0

0sD;Ht+E;{[g0                  1>if - then语句

8mmST1x4[Yw0 51Testing软件测试网Op"}"g)}JhZM

                    格式: if command1
DF2z1p-M Z7a!r0                       then
?_Hj2YP5cp0                         command2 51Testing软件测试网"u!G R1yKED W&p
                         command3 51Testing软件测试网u]1ir8D6j"W-w
                       fi      ---(if 语句结束)
v-i/^!_&}(@R#W0                         command4

Jl-@II0H3g0 51Testing软件测试网 PD;c7P6fkME/|

                    每个程序或命令执行结束后都有一个返回的状态,用户可以用Shell变量$?获得这一状态。if语句检查前面命令执行的返回状态,若该命令成功执行,那么在then和fi之间的命令都将被执行。在上面的命令序列中,command1和command4总要执行。若command1成功执行,command2和command3也将执行。 51Testing软件测试网 f Bt:K.G'v? fi:d

*H4{ [M+S1d di0
TQ ~ZC@0                    请看下面程序:
r#Yu*qz){j0                      #unload -program to backup and remove files 51Testing软件测试网H|0D;vz(ybzH
                      cd
%ClxY(^0                      ls -a | cpio -o > /dev/mnt0
%g6TgbH!n[1}!l;E g0                      rm * 51Testing软件测试网NXqae!G1lj_

i(tB B;vl&AG5d0                    该程序在备份资料后,删除档案,但当cpio命令不能成功执行时,rm命令还是把资料删除了,我们可不希望这样,为了避免此情况,可以用if

B$bEa+?&B;~KW1V0 51Testing软件测试网0vVh:h.?4i

                  - then语句:
y:r1per7up0                      #--卸载和判断删除程序 51Testing软件测试网T]z.`0?i]/rK

)]N!T;k:eHH7em0?!}0                      cd 51Testing软件测试网_k?xF1u&` Q,_ n
                      if ls -a | cpio > /dev/mnt0 51Testing软件测试网h4B6{*IP!dm
                      then 51Testing软件测试网7cx'Kx&RWX EH@
                        rm *
K.J?"R[&pq0                      fi 51Testing软件测试网/j#E }7wCwX
                    上面程序在cpio执行成功后才删除档案 51Testing软件测试网3g[M-P@Q

51Testing软件测试网&h;_UG0`I%b

                  同时,若执行没有成功,我们希望得到提示,sh中的echo命令可以向用户显示消息,并显示后换行,上面程序可以写成: 51Testing软件测试网%MKjK%w$bq
                       #--卸载和判断删除程序
t2Ltc5Tw0                      cd
` z0K'AHe)yP rJ0                      if ls -a | cpio > /dev/mnt0 51Testing软件测试网&taL(sH1@'S3pj'i
                      then
'` A@LJO0                        echo "正删除文件资料... ..."
K7\*VT p/^+M&q0                        rm * 51Testing软件测试网A bVm Gn&U \
                      fi

6k*yzj-C2N0 51Testing软件测试网/g!BJS1Cx

                    echo命令可以使用一些特殊的逃逸字符进行格式化输出,下面是这些字符及其含义:

;}$BUcCe|S,j)J0 51Testing软件测试网hRz7r7Y P7{r

                      \b  Backspace
T7B7y?C9e"[:o0                      \c  显示后不换行 51Testing软件测试网7@(Cz{Ur8ID
                      \f  在终端上屏幕的开始处显示
f.i y;^^m0                      \n  换行
`[)Bn po X0                      \r  回车
X*z!X9\ mk3mf4j0                      \t  制表符 51Testing软件测试网}8S(? jI |.e Wh
                      \v  垂直制表符
6eKI9E6i"LRQv0                      \   反斜框
(~vaYZc2t(nI0                      nnn 用1,2或3位8进制整数表示一个ASCII码字符

']d!IJuB3whq0 51Testing软件测试网:[6A `8u2m"qE;?Y6@ `

                  2>if - then - else语句

a;X'RD:W,a+}/g J,w0 51Testing软件测试网 s"ux0Ct)cT

                    不用多说它的作用,别的高级语言中都有,格式为:
3Z6^}Vf+pP#L`0                    if command1
'~'w{7CO B0                    then 51Testing软件测试网!Nm TXd;x
                      command2 51Testing软件测试网 r cWAYZH4y]
                      command3 51Testing软件测试网:UQ@w#h
                    else
tj;?V4T}0                      command4 51Testing软件测试网@O+b QA\_}
                      command5
6s$PMd;o+n5xG0                    fi

g:T[5w9u0 51Testing软件测试网weDp#q(J/mM3q

                    在此结构中,command1中是先执行,当command1成功执行时,将执行command2和command3,否则执行command4和command5 51Testing软件测试网 ~}V;s A h z\$k

%@`_L,jV0
%R0b4bN$_*g0                    注意看下面程序: 51Testing软件测试网/W s|[B5IL
                      #备份程序
`GVO };o]*|$M0                      cd 51Testing软件测试网fG,S#P6tTjoF
                      if ls -a |cpio -o > /dev/mnt0 51Testing软件测试网e*Ras9~/gS;I
                      then
]2X;Hyue"g0                        echo "删除源资料... ..."
]-q5[4\G/@H$@}0                        rm * 51Testing软件测试网 [N.W^/nK4w6X
                      else
;Cr"V2`:O3Rl0                        echo "磁带备份失败!" 51Testing软件测试网9^;~2^q(h w L] f2M
                      fi

j#J%?q+~ g0

qct\e K*l0                  3>test命令进行条件测试

qksR{$BSn0 51Testing软件测试网;{,Jm!\6s8j&A

                    if语句可以通过测试命令执行的返回状态来控制命令的执行,若要测试其他条件,在bsh中可以使用test命令。该命令检测某一条件,当条件为真时返回0,否则返回非0值。test命令可以使Shell程序中的if语句象其他程序语言中的条件判断语句一样,具有很强的功能。 51Testing软件测试网Np@]B/u6P7y"~

51Testing软件测试网0mg&M8c[

51Testing软件测试网!z6BLi ?3`9tHg6u2}
                    test命令的使用方法为:
`u3f}8mv%z&U"h0                      test condition
q&~ SL[M5b0                    可测试的条件分为4类:
b8_#D8E M)EeS0                    1)测试两个字符串之间的关系。 51Testing软件测试网c!?5N)I/F
                    2)测试两个整数之间关系。 51Testing软件测试网\ }p%\"p2R-`5F })yw
                    3)测试文件是否存在或是否具有某种状态或属性。 51Testing软件测试网 m0e*WCRP&u"t
                    4)测试多个条件的与(and)或(or)组合。

#abHKw~)ZWeyp ~0

Hu| X qK;HS^0                  1、条件语句>>test语句

&s/w8f.K#D%Bh9|0 51Testing软件测试网Xn$U(R*t0U

                  1>测试字符串间的关系 51Testing软件测试网8[4d4W.S,i!V ^

51Testing软件测试网c5hKm)p6`F*D"o

                    bsh把所有的命令行和变量都看作字符串。一些命令如expr和test可以把字符当作数字进行操作。 51Testing软件测试网p9v9\nn*YT{7R

!]+vO4i2b#C0                    同样任何数字也可以作为字符串进行操作。

(z:_\y ~5X0

N,KKwVR-p0                    用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下:
@HZ qB4o"go1h+\0                      str1 = str2      当两个串有相同内容、长度时为真
(i0MNz*@Q ln0                      str1 != str2      当串str1和str2不等时为真
cU }g y)K i qu4@0                      -n str1        当串的长度大于0时为真(串非空) 51Testing软件测试网@7j:e#Y,y`,u5J8p
                      -z str1        当串的长度为0时为真(空串)
7`f+L1a P"k_0                      str1         当串str1为非空时为真 51Testing软件测试网 p-iU:hTVfs

?7[}:Q { R F"{T0                    不但Shell程序可以使用test进行条件判断,test命令也可以独立执行,如: 51Testing软件测试网!QU3NG$c"Xr5p

xPi hj1B0                      $str1=abcd
o h"LVX.QK^0                      $test $str1 = abcd
x0x9p"{eH~0                      $echo $? 51Testing软件测试网6N9oe b*h3mtzhxn
                      结果显示:0 51Testing软件测试网 I3D/YR+hRK

O6| a5s8i6dc/r0                  与上例中第一行赋值语句中的等号不同,test命令中的等号两边必须要有空格。本例test命令共有3个参数。注意两个串相等必须是长度和内容都相等。 51Testing软件测试网8z[Bb|7g-Y

51Testing软件测试网gN*xX q


Y!xr7l;\S W7X0                      $str1="abcd "
]{8Z U [B\J$G0                      $test "$str1" = abcd 51Testing软件测试网PtQF5e\0p G
                      $echo $? 51Testing软件测试网#x.}{dD$ig
                      结果显示:1 51Testing软件测试网b8p ]v RtY RNn'p W

51Testing软件测试网$r \4w js+Z

                    上面str1包含5个字符,其中最后一个为空格符。而test命令中的另一个串只有4个字符,所以两串不等,test返回1。 51Testing软件测试网Y'rA,R"p"n!e'@

y`F%A#X/H0                    不带任何操作符和使用-n操作符测试一个串结果是一样的,例如: 51Testing软件测试网qC |(]N(G"KI

~*lg(x3O'N k(J[Y0                      $str1=abce 51Testing软件测试网ZS^k @5C8Cx
                      $test $str1 51Testing软件测试网|:LSDR
                      $echo $?
.W/E'|#_ImN0                      结果显示:0     51Testing软件测试网+t%h.W"W"gH3N0d
                      $test -n $str1
)f6m,^mZ)Z9o;^0                      $echo $? 51Testing软件测试网[|s*i'b)Y9w
                      结果显示:0 51Testing软件测试网 HSh^CqC+T-m![

Ht }5g]'C o'lfA0                    但是,上面两条命令也有一点差别,反映出了使用test命令潜在的问题,请看下例: 51Testing软件测试网 {NE7D)]tE/X

Zy }PR^0                      $str1="   " 51Testing软件测试网1v1th1sQ*A!e s\
                      $test $str1
OpZ)l!xp/k'@ WI0                      $echo $?
"F:]6f&a:R,C0                      结果显示:1
,UH4~`-W*]0                      $test -n "$str1" 51Testing软件测试网j"r*m"a@
                      $echo $? 51Testing软件测试网)twU8j"`gOV
                      结果显示:0 51Testing软件测试网[G ]+~:f]3[8J
                      $test -n $str1
T fI)Eel+\)?%B"{*eO0                      结果显示:test:argument expected

}5b-}&nReCJ9c0 51Testing软件测试网;t/|3{;K2u'G

                    上例中,第一次测试为假因为Shell在执行命令行之前首先要进行变量替换,即把$str1换成空格,然后shell又将命令行上的空格删除,故test命令测试到的为空串。而在第二次测试中,变量替换后空格位于括号内,故不会被删除,test测试到的是一个包含空格的串,在第三次测试中,shell把空格删除,只把-n传个test命令,所以显示参数错。 51Testing软件测试网!CZ-g aG/X

51Testing软件测试网M;j5\ZF!V.M7b


%i#i/|nd,N0                  2>测试两个整数之间关系

Y5~dv^uA7^f0M0 51Testing软件测试网#FV)V uEm@B }L

                    test命令与expr命令一样,也可以把字符转变成整数,然后对其操作。test命令对两个数进行比较,使用的操作符如下: 51Testing软件测试网TWT`|

n m9n.y"be q0                      int1 -eq int2    两数相等为真 51Testing软件测试网LCZ"D)H0S"m1@
                      int1 -ne int2    两数不等为真
^OZ%cV7^Yo0                      int1 -gt int2    int1大于int2为真
P#GBN B:d\ q0                      int1 -ge int2    int1大于等于int2为真
d ~'R~{7h0                      int1 -lt int2    int1小于int2为真
1@#LJ} I+A-p(y0                      int1 -le int2    int1小于等于int2为真 51Testing软件测试网e-O x~kC

r@A9pfh0                    下面的例子反映了字符串比较与数字比较的不同: 51Testing软件测试网DRp^%t9Y

a2[Ytlr6Nh3jA0                      $str1=1234 51Testing软件测试网g%@9CT v2S q'X
                      $str2=01234
6m9u^}2X:K@ J/v)F0                      $test $str1 = $str2 51Testing软件测试网X(p'^epQT
                      $echo $?
3B+d*g3n _!h*p'`s W0H0K0                      结果显示:1 51Testing软件测试网.O`;?c$]V8fW&Ys
                      $test $str1 -eq $str2 51Testing软件测试网kL?-z J'v9R~
                      $echo $?
q Z'M9DM8f4e0                      结果显示:0 51Testing软件测试网4hds2cJu

51Testing软件测试网.}ca9d^

                  3>有关文件的测试

gL(w8BEk$RJ0

w$j.v d:a0                    使用test进行的第三类测试是测试文件的状态,用户可以测试文件是否存在,是否可写以及其他文件属性。下面是文件测试时使用的选项。注意只有文件存在时,才有可能为真。 51Testing软件测试网Sv} d G"_

Q x3RW&Q0
5vXZ_d6q^7mg$Q&T;n0                    -r file     用户可读为真 51Testing软件测试网 T%Y(w R`D:N'T
                    -w file     用户可写为真 51Testing软件测试网$}z&~+j%lo1C
                    -x file     用户可执行为真
2aT|`,C N0                    -f file     文件为正规文件为真
s?~~"Z0                    -d file     文件为目录为真
5Q,z-JHU(T2wx0                    -c file     文件为字符特殊文件为真
-lTC!l'K#Hy \%B6ck0                    -b file     文件为块特殊文件为真
/A5^BU6p)v-J.C&@`0                    -s file     文件大小非0时为真 51Testing软件测试网V_'l y(lD@
                    -t file     当文件描述符(默认为1)指定的设备为终端时为真
l#CUv S7Y `0                  4>复杂的条件测试(and 、or 、not) 51Testing软件测试网3~-N&U}p b
                    -a         与 51Testing软件测试网qgl(rGi
                    -o        或
.Y'{%tBU&a0                    !        非 51Testing软件测试网T6wA`!mKT
                    就是组合条件了,任何高级语言中都有的(NOT 、AND 、OR),例如:
^Un1^ ?Z1of'D1}0                      $test -r em.null -a -s em.null 51Testing软件测试网mL.[FW W_8n*p ^
                      $echo $? 51Testing软件测试网(i0t*K#w&ms
                      结果显示:1 51Testing软件测试网,a?p#? c
                      说明了em.null并不是可读并且非空的文件

3iC&d2r;P:Aw+\0

5X,~\l"I(U S#d0                  5>另一种执行test的方法 51Testing软件测试网wU#[/Zzk|8}i

51Testing软件测试网@&l p5E#Uf7e

                    bsh中还有另一种执行test命令的方法,就是把测试条件放到一对[
3q Nq P y@7S0                  ]中,例如: 51Testing软件测试网h7x2I+BT'[
                      $int1=4 51Testing软件测试网drA)|'Z | `6]T,U
                      $[ $int1 -gt 2 ]
1Owia$\3Ul~ b0                      $echo $? 51Testing软件测试网P0@MU-dm1X_P
                      结果显示:0

$XAn{1qt0 51Testing软件测试网&O2Ho3?8pNf(sh

                  要注意在[ 的后面和 ]符号的前面要有一个空格。 51Testing软件测试网1uA9fT5|+V
                    下面我们用test命令写个简单但比较完善的程序: 51Testing软件测试网 T8k;pxm]E;]\L

51Testing软件测试网 hCq2~0m Q7N.hU&t

                      #-- 备份程序
%G/Uvg \ j P6]|Y0                    
c9tu&]1s D(Y%k0                      #-- 检查参数
Z#wn!E*|l [#K [0                      if [ $# -ne 1 ]
L Vdh1T|&SqJ'c!|%N0                      then

v:eB)c B0 51Testing软件测试网e/BPc@QU+R

                        echo "请在程序名后面指出要备份文件所在目录!" 51Testing软件测试网 }~3L.v4? f+MM-k
                        exit 1
#yc jo|"BB3d"C0                      fi
4x`:a:{c0                      #-- 检查目录名是否有效 51Testing软件测试网M|xYC|@&F-e
                      if [ !-d "" ]
_%OI5`0o6y0                      then 51Testing软件测试网)[B8~n7E0AO4_ ~
                        echo " 不是一个目录!" 51Testing软件测试网4v Z9RdJ
                        exit 2 51Testing软件测试网U k%[D RU7Ml0]/g L
                      fi 51Testing软件测试网#^+U.B0x!S/kr
                      cd
L'y \W/YC_m0                      ls -a | cpio -o >/dev/mnt0
!Tf#k^%~"xl0                      if [ $? -eq 0 ]
4IV9CVg&^oTL#?0                      then 51Testing软件测试网h4P_K7vr c
                        rm *
^0X-kZ9Xo/^H!\~0                      else
6Mu7h/i {pQ-|&A0                        echo "cpio执行不成功!备份失败..."
e _0_(F&}Z0                        exit 3
-U'C-dg v5P(B!s0                      fi 51Testing软件测试网&[V'B#K)Y9v

51Testing软件测试网:p/v#xo9`'~L+BD

                  6>空命令

}0fvh-_#SCZ-p0

dlRP/|3ot0                    在Bsh中用 : 代表空命令,就是充个数,什么都不做

j+FsJ3L.@p-M3[0 51Testing软件测试网d3hnjF9@O

                  7>嵌套if语句和elif结构 51Testing软件测试网8B:Y-})Os

E n/e\:Cw0W5N |0                    检查条件1 51Testing软件测试网9HyE!b(~O)[h
                    A:当条件1为真,则执行一部分操作 51Testing软件测试网8[,aLq:Wg@E
                    B:若条件1为假,检查条件2 51Testing软件测试网_}E8r@:SjD
                      1)若条件2为真,执行另外一部分操作 51Testing软件测试网+[{Ep8H:S
                      2)若条件2为假,检查条件3
K(|-e+CkKP$i8F[J0                      3)若条件3为真,执行其他一部分操作 51Testing软件测试网E6?8Ax9m'bc8l
                    语法如下: 51Testing软件测试网,U!dFTj8Y0xc
                      if command
E[)Hv9u)D0                      then
L1t KvxIn kb^0                        command
ibF,Drs0                      else 51Testing软件测试网k8lc DQ\T
                        if command 51Testing软件测试网%F)MK)cKM:M
                        then
!Q(s2g0A5]csX0L1ZH0                          command
Y |'BI/~u0                        else 51Testing软件测试网K(i1msw w
                          if command 51Testing软件测试网w7d,\ w9m2R3G/C
                          then
+{"s H(I"iU KK0                            command
MgSyn5YK0                          fi
I4U0fLH&O0                        fi
$f,s.`o eD*rUU0                      fi

Fz2Z,_8X0 51Testing软件测试网i-I3FA/ju]%]

                  8>elif语句

5q&hbkn H3T|0 51Testing软件测试网3|Bo ^&M7gs`

                    嵌套if语句有时会给用户带来混乱,特别是什么时候fi语句很难判断。因此Bourne
-r1Mg J+yp2Xq0u0                  Shell又提供了elif语句。elif是else-if的缩写,它表示是if语句的继续。格式为:

DC)~.` ]0 51Testing软件测试网+vz pAjAH.n l

                      if command 51Testing软件测试网J)[HMhS'y9Sa}5e$}
                      then
cP_8Ez"y3c$X ?0                        command
_By5p#Ol2i0                      elif command
'@i-X`&Bc0                      then
#c o/oy*l6Z%mA.d8e1if0                        command
"swXl^czS|L y0                      elif command
`O0y ['DL"f0                      then 51Testing软件测试网 d/Y"Hf`
                        command 51Testing软件测试网:]8Q@1lGF
                      fi 51Testing软件测试网]`n-x1iB:m/~ [

0~6r mW s@0                    上面介绍的嵌套if语句和elif语句完成相同的功能,用户可以根据自己的喜好选择一种使用。 51Testing软件测试网 P1Z$f`L UH.}

7T%p0o8JuLRD0                  9>case语句 51Testing软件测试网%{W(i&XJoK D

51Testing软件测试网1T)u|0W6_i;u`@

                    前面说的elif语句替代if-then-else语句,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个elif语句实现,但还有一种更简单的方法就是用case语句。

\0bQ F1X5O&t/jB0 51Testing软件测试网&FAx\dgo t5oe!i


`#B?P4X&x0                    case语句不但取代了多个elif和then语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case语句使用的语句。 51Testing软件测试网q8{-Rj/u-~

51Testing软件测试网](g!h-V7PGl2m

51Testing软件测试网B(p,U$P8j9Y~9k(gj'E
                    case value in
K{S;~BV0                     pattem 1) 51Testing软件测试网+v l U` WpL
                      command
Z3z.r,j#z L!Z0                      command;;
:mM#Dj\W*wO5Qb'@0                     pattem 2) 51Testing软件测试网3~o D9_D [
                      command
gQ2BxcI-\(y0                      command;;
8R6S_S(lt0                     ....
.j}/|#p4Zt:c7U2m8a0                     pattem) 51Testing软件测试网n Q.Ay3D
                      command; 51Testing软件测试网.F0T+O ZL F
                    esac 51Testing软件测试网B%KV1lh0U

,C)m&g3DSG0                    case语句只执行其中的一组命令,当变量值与多个模式相匹配时,只有第一个匹配的模式对应的命令被执行。";;"表示该模式对应的命令部分程序。 51Testing软件测试网-c y;C3{]/kDj0x.v ^

51Testing软件测试网Q&l j%xC @v,U


7~:f:d5A3qNG-AQ0                    通过学习下面的read语句,我们们再举例子说明case语句的用法。

s$@PU KP]b.B0 51Testing软件测试网'S5k.?d L;a

                  10>read语句 51Testing软件测试网kL8Bu(CBG

51Testing软件测试网!au3A @IX

                    Shell程序不但可以通过命令行参数得到输入数据,还可以使用read命令提示用户输入数据,其语法格式为: 51Testing软件测试网UT Z+N'C"n1r*W,g

AH"{|2y0                    read var1 var2... ...varn 51Testing软件测试网 k,F8UV `*sv

51Testing软件测试网;Rp%A{ Lt+rH8l!@

                  当Bsh遇到一个read语句时,在标准输入文件中读取数据直到一个换行符。此时Shell在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空格。然后Shell将输入行的第一个字的内容给变量1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字的个数超过变量个数,Shell将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分隔的一个字母和数字组成的字符串。 51Testing软件测试网}b:j;kj-O'R.i C

51Testing软件测试网{9i*aJ/S/`2f!m

51Testing软件测试网s-tskH
                    $read var1 var2 var3
SI\"}'J+|0                      输入:Hello my friend
Zye$[5S:k:p0                     51Testing软件测试网e4[2H UJ-@Fl
                    $echo $var1 $var2 $var3
*j4z)|zE0                      结果显示:Hello my friend
$d"G(F2b X9RDj0                    $echo $var2 51Testing软件测试网,Zq(hA(?q)TF
                      结果显示:my

0p*GGd%vLv8?f S0

d&R8b`:}T0                  下面用个read和case的例子结束本部分的学习: 51Testing软件测试网*BIu;t_8ANvxt

yS1x })^N0                    #--交互式备份,恢复程序 51Testing软件测试网 P3M;@ M$n,S g&y
                    echo "输入要备份文件所在目录:\c"
)f_(x3},[B9Vk C\0                    read WORKDIR 51Testing软件测试网 i ?:E_"aKGVR
                    if [ !-d $WORKDIR ] 51Testing软件测试网V+c+r2Hj6gvbb
                    then
c ];t6y#c0                      echo "Sorry,$WORKDIR is not a directory"
1B#rw nU$K!z%D|0                      exit 1
fe6V p!x0                    fi
#mp)wm)wRVD!hQ0                    cd $WORKDIR
zSa|A n"N-K\"q P[0                    echo "输入选择:"
wI7UC5b3~0Vb0~ H0                    echo _
2`tjeI/DA%E S0                    echo "1.恢复到 $WORKDIR"
&tIm;J7P%G-G8\#L0                    echo "2.备份 $WORKDIR" 51Testing软件测试网l~3ZV1X1q
                    echo "0.退出"
/U Hk8D:l0d0                    echo 51Testing软件测试网9Z$A2o j?!l
                    echo "\c" 51Testing软件测试网cKD5b|zr.@U
                    read CHOICE
`` i fX `y0                    case "$CHOICE" in 51Testing软件测试网k/E)ylJ,~"L hH
                     1)echo "恢复中... ..."
(Ue$Mz4b }#t2etw7@0                      cpio -i < /dev/mnt0;; 51Testing软件测试网4N]u-mX$F(p:hz
                     2)echo "备份中... ..." 51Testing软件测试网p y{1r I^%zH?v
                      ls | cpio -o > /dev/mnt0;;
H ^ C/v/MJL0                     0)exit 1
cd H,P.N`0                     *)exit 1
'r6vt0oV|0                    esac 51Testing软件测试网!k&dh@i
                    if [ $? -ne 0 ]
k2\R S[4@+M;|S0                    then 51Testing软件测试网Z#g6M^)Vm9R
                     echo "程序运行中出现错误!"
;[}0fHPO7\ ?3JL0                    else
/i(o8t6\cRs0                     echo "操作成功!" 51Testing软件测试网@N$`mJLv }~3^
                    fi   51Testing软件测试网-x,MtFm4[:rqQ(x
                    51Testing软件测试网$x F]y^c&P
                    在上面代码中,"*"定义了其他模式下不匹配时的默认操作。 51Testing软件测试网N%B.G7U1~

W7\m"]-G0                  循环语句 51Testing软件测试网+BL#Z,?2H ` r ^

Nj9k"hS&]NY0                    前面介绍的程序和所学的语句都是从头到尾成一条主线下来,或是成分支结构,在日常管理UNIX的过程中,经常要重复的做一些操作,处理批量的问题,这就涉及到了循环结构,同高级语言相似,UNIX的Shell也提供了强大的循环处理语句。

-u0lN~w"T)^0

?#E){6{-y#qv MD051Testing软件测试网 k+Hi|M/|I4|
                    Bsh语言中有三种循环语句-while循环、until循环、for循环,下面通过具体的例子分别介绍这三种结构。 51Testing软件测试网g-PP!w-S/y3Pk K.n

w*[j0^%_B3^9z0C0                  While循环

n |4PPy|*q k0

.s^2t{ w0                    在while循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下: 51Testing软件测试网QZ2V4ow Vw

3sEM1KW0EoA0                  while command
t)WI+me2o1s0                  do
zx*hw/Sv}-Fn6Z0                    command 51Testing软件测试网kgUIe
                    command 51Testing软件测试网;Z,Y8rnj;D(yyUr3_
                    … …
nzyx3Tb|-A1o'G0                  done

#H?6VF2\8a~g8a px0

Tdm P4q w0                  示例代码如下:

L~)g5t![0

"c4Dv#AE"M-k2k0                  #测试while循环小程序 51Testing软件测试网4q4n-Y7?d

51Testing软件测试网5~(Q,B:l/l5I|,FLJ-o6Q

                  x_t=1 51Testing软件测试网 j%BfuZ6D e
                    while [ $x_t -lt 5 ]
;E!j|#Mcr8C5}mL1X6M|#`0                    do 51Testing软件测试网9n5s6I0f l+N
                       mm=` expr $x_t \* $int `  #注意"\"的作用 51Testing软件测试网.Q$t aHRL%E Y%W
                       echo "$mm" 51Testing软件测试网9Jqhs3Sw @O
                       x_t=` expr $x_t + 1 `   #注意expr的用法
&oV J"sx&Yh_0                    done 51Testing软件测试网{X7R"b7Ik EN:^
                    echo "THE WHILE IS END!\n"

1f!X\:~-UkG0 51Testing软件测试网4DPjz-fV

                  程序的执行结果如下: 51Testing软件测试网4@0h'K4gbxtbv
                  1 51Testing软件测试网2nM;? }.d m Q
                  4
6\ r~z~0Bu1D0                  9 51Testing软件测试网$WjR!i~r$p%b
                  16 51Testing软件测试网.n ab"q^;FQ&c!K
                  THE WHILE IS END 51Testing软件测试网@Gd*V| O [D4t

7e7QO;ua&t#e\d`0                    在上述程序中,当变量x_t的值小于5的时候,执行while循环中的语句。在第五次循环时,
X/kDAq2u,@0                  [ $x_t-lt5]命令返回非零值,于是程序执行done后面的代码。
au8|,oX c Uz#k(w.R0                  现在利用while循环,可以改进我们早些时候用的备份数据的例子,当用户指定的目录备份完毕后,使用while循环使程序执行一次可以备份多个用户指定的目录。代码如下:

_Q {'e4c7y U-{)U AU0

` ~!m2E0p$M ^}4[0
.]6B M@3lw/J-L&s4S0                  echo "欢迎使用备份小程序" 51Testing软件测试网1L"WdtC3x

51Testing软件测试网6dlF/?Q/B du/Xj*cz

                    ANS=Y 51Testing软件测试网OX*~ R"y
                    while [ $ANS = Y -o $ANS = y ]
!X A S0s"qE n[p]Lt0                    do 51Testing软件测试网[E!HpV
                      echo _ 51Testing软件测试网wE F4G!_E7LU2gc(bef
                      #读目录名 51Testing软件测试网!R5\{A x%P OaI(i
                      echo "输入要备份的目录名:\c"
"e a%@-_n+q0                      read DIR
O7O$sb7vL a SZ8K0                      if [ ! -d $DIR ]
,~Ssp}b*dA0                      then
6n&Y$qx@ a@^0                          echo "$DIR不是一个目录!" 51Testing软件测试网4G ThL&dxw2B
                          exit 1
Kq@:se4~0                      fi 51Testing软件测试网9I&r qx]"@'g]0F)s
                      cd $DIR
M2E-WcfPk4c0                      echo "请选择:"
']mZVG)?el)~0                      echo _
$\&Hr1N2A p9F0                      echo "1 恢复数据到 $DIR"
V^(L.aOV&p fm1Y0                      echo "2 备份$DIR的数据" 51Testing软件测试网{}8Z KO6?
                      echo
B ]6J4L5i+H^0                      echo "请选择:\c"
8RY-\h1[)ul3^+o v)Z5f b0                      read CHOICE 51Testing软件测试网*^lFpK6x"gX
                      case "$CHOICE" in
P:S3GkI$l&bq$Gcw0                         1) echo "恢复中… …"
%VkrY!]a L.j-W0                          cpio -i        2) echo "备份中… …" 51Testing软件测试网,P5O)b|Y
                          cpio -o >/dev/rmt0;;
0u*Yk.ho0                         *) echo "选择无效" 51Testing软件测试网0E q}7rh
                      esac
8w-xlp+dB"]#H0                      if [ $? -ne 0 ] 51Testing软件测试网l wlOd
                      then
XsZ:L2S8U d0                         echo "cpio执行过程中出现问题"
!RoE~k!Dk6]O%OF0                         exit 2 51Testing软件测试网 p5gc ?yIn7[y
                      fi
] at6aC v!`Jni*R0                      echo "继续别的目录吗?(Y/y)\c"
NL_aX4t"m0                      read ANS 51Testing软件测试网y@D(Ae
                    done 51Testing软件测试网X&pM#Uu%PH c

j;j,vu~9Z0                    在程序开始,我们给变量ANS符值为Y,根据whlie的判断条件,程序进入while循环,执行do-done中的语句,每次循环都要求用户输入ANS的值用来判断是否进行下次重复执行do-done中的语句。如果用户输入的条件不满足while语句条件,循环结束,程序执行done后面的语句。

1slgo6g$P W lq2G"C0 51Testing软件测试网 Gr3Z$DH

 51Testing软件测试网O$F'nPc8R.@)|z)g

U2D I+Bpq0q0 51Testing软件测试网0h(moW}'N

f"U4\:\"Lu| X0 

]an-mF[ Q H3g;bBJ3U,L0
h!_*qpU-L#eJ051Testing软件测试网{T7R zHz3q9f
Link URL: http://mytesting.bokee.com/viewdiary.15819720.html

TAG:

 

评分:0

我来说两句

日历

« 2024-05-01  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 12271
  • 日志数: 27
  • 建立时间: 2008-04-06
  • 更新时间: 2008-04-18

RSS订阅

Open Toolbar