搜集资料,交流经验……

unix系统shell编写(一)

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

A'?r$Ef5R0 Unix下shell程序编写 一51Testing软件测试网CM u5T3Q
                    51Testing软件测试网hC7?!f$qLB

9zo1Q2l| n!e-L?0U2k0                  *Shell是什么?

0b4s['RrR$e0

VRBp#[6|:P0                    任何发明都具有供用户使用的界面。UNIX供用户使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要强大的多)。

(MgvM'qB0

9U)K*z]WF6o-yl0                  Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。 51Testing软件测试网*o,q?5Z8X1GPFz

51Testing软件测试网KV8R ^ZvO

                    为了不同的需要,UNIX提供了不同的Shell。现在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)为例,一步步的领略UNIX 51Testing软件测试网0F[P+A$SA

51Testing软件测试网2T BNh8BO/_d

                  Shell的强大功能,占先其强大魅力,达到更方便灵活的管理、应用UNIX的目的。

k|h:C e9t)f2S0

4s]hq\d v*r0                    1.UNIX内核和Shell的交互方法

:s%c)O?m*{o0 51Testing软件测试网\Ta#I.IY1f

                    启动UNIX时,程序UNIX(内核)将被调入计算机内存,并一直保留在内存中直到机器关闭。在引导过程中,程序 51Testing软件测试网3?r5{6f JDk,EF N^
                  init将进入后台运行一直到机器关闭。该程序查询文件/etc/inittab,该文件列出了连接终端的各个端口及其特征。当发现一个活动的终端时,init程序调用getty程序在终端上显示login等登陆信息。(username和passwd),在输入密码后,

5M&~nxFa-t5b0

6h(gZ;fh+r-I C0                  getty调用login进程,该进程根据文件/etc/passwd的内容来验证用户的身份。若用户通过身份验证,login进程 51Testing软件测试网 ??.M'zrM?;}8v

B#c*ztg0                  把用户的home目录设置成当前目录并把控制交给一系列setup程序。setup程序可以是指定的应用程序,通常setup程序
\$M1oF5E Q1u1Okh0                  为一个Shell程序,如:/bin/sh 即Bourne Shell(command出来了,呵呵)。 51Testing软件测试网LE~X0g6sVh%A

u3Z+h } N-r:W6~0                    得到控制后,Shell程序读取并执行文件/etc/.profile以及.profile。这两个文件分别建立了系统范围内的和 51Testing软件测试网a^w mjU?|K

"YMi3hLOT_0                  该用户自己的工作环境。最后Shell显示命令提示符,如$。(这是以bsh为例,若是csh,为.cshrc,ksh为.kshrc,bash为.bashrc等等) 51Testing软件测试网(nV1?V uB'Q

51Testing软件测试网 e,o6WG;F*J}mSh

                      51Testing软件测试网Afi-o'C

51Testing软件测试网,K.b\5NF| H#C(og&r

                    注不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或
'T!{$dUCZ^0                  config.sys文件)

?K3a5x(Fh0

$REk!\Jn0                    当shell退出时,内核把控制交给init程序,该程序重新启动自动登陆过程。有两种方法使shell退出,一是用户执行exit命令,二是

2H7g ruA `1FUDc0 51Testing软件测试网 vPU1xY-{

                  内核(例如root用kill命令)发出一个kill命令结束shell进程。shell退出后,内核回收用户及程序使用的资源。 51Testing软件测试网2F+{"T;[+LR-W

!uh |(Xq$Kz7R0                    用户登陆后,用户命令同计算机交互的关系为:命令进程--->Shell程序--->UNIX内核--->计算机硬件。当用户输入一个命令,如$ls, 51Testing软件测试网e8J8h Fk2h VB

z S5k+ti h:[0                  Shell将定位其可执行文件/bin/ls并把其传递给内核执行。内核产生一个新的子进程调用并执行/bin/ls。当程序执行完毕后,内核取消 51Testing软件测试网 EUg id7S0qJ

51Testing软件测试网0};O%_c-h,jt)U

                  该子进程并把控制交给其父进程,即Shell程序。例如执行:

0^&JzG E uk0

!`t]$yC"is8RT0                      $ps 51Testing软件测试网^Z/KnE:p

51Testing软件测试网/^4e3{%z0o d[ S0E+p#^1u

                      该命令将会列出用户正在执行的进程,即Shell程序(下来详细说说,别急现在)和ps程序。若执行:

1Y,U po5\$Ci7C0

;S4o+S,]Ge'd O0                      $sleep 10 & 51Testing软件测试网e}-H9@e1b wb WL-|M
                      $ps 51Testing软件测试网y*g7{/e)et V0u[

r9I7cFV0                    其中第一条命令将产生一个在后台执行的sleep子进程。ps命令执行时会显示出该子进程。

"v t"u,{,Zt(z9b0

O)y5M3NfI0                    每当用户执行一条命令时,就会产生一个子进程。该子进程的执行与其父进程或Shell完全无关,这样可以使Shell去做其他工作。(Shell只是把用户的意图告诉内核,然后该干嘛干嘛)

X{c2I0a|0 51Testing软件测试网V ~I6x.S(dx9C

                  现在windows有个计划任务(在固定的时间,日期自动执行某任务),其实UNIX很早就有这个功能了,也就是所谓的Shell的自动执行。一些UNIX

%{j](Q U mz'G0

)Vg6L S9Q ke0                  资源,如cron可以自动执行Shell程序而无需用户的参与,(这个功能好象在/var/spool/crotab目录里)。 51Testing软件测试网{ G!g wx%z#o/A

4i4e1c?8gv1r;z0                  Crontab 程序对于系统管理员来说是非常有用的。Cron 51Testing软件测试网)[7\Y U+^
                  服务用于计划程序在特定时间(月、日、周、时、分)运行。我们以root的crontab 为例。根用户的
D?YQ5O!v%[_6R&m8Y0                  crontab 文件放在 /var/spool/crontab/root 中,其格式如下: 51Testing软件测试网6w;Vh8D}'K6t

pK8j_z!v4PUq`0                    (1)  (2)  (3)  (4)  (5)  (6)
Yv[:r be,{IP0A(cM+@1W0                     0   0   *   *   3   /usr/bin/updatedb
(zT2h/i x1HS0                        1. 分钟 (0-60) 51Testing软件测试网%_/Q.fu5Q
                        2. 小时 (0-23) 51Testing软件测试网NyU6o&x8io
                        3. 日 (1-31) 51Testing软件测试网e RJ&v)s.KU
                        4. 月 (1-12) 51Testing软件测试网.a!y!}{%Kd"V4c2d
                        5. 星期 (1-7) 51Testing软件测试网6t\Hu5K L r&s
                        6. 所要运行的程序 51Testing软件测试网%r#V1A_+i3`j)u
                    2.Shell的功能和特点
WfGB A(?%k0                    1>命令行解释 51Testing软件测试网2^ `.`Nfw
                    2>使用保留字
jV"b9x,f6Sns0                    3>使用Shell元字符(通配符)
&u2f}5k:^;oo6B$A0                    4>可处理程序命令
z n*\N#?%P1MV,E0                    5>使用输入输出重定向和管道 51Testing软件测试网f%@'X.B?v/Dd-B [
                    6>维护一些变量 51Testing软件测试网-gycSo;?+[9r H
                    7>运行环境控制
,N4y;_K:Y0                    8>支持Shell编程 51Testing软件测试网P @9X8W!U2PX*? y

-K?v0Y:vPi0                    对于"命令行解释"就不多说了,就是在shell提示符(例如:"$","%","#"等)后输入一行unix命令,Shell将接收用户的输入。 51Testing软件测试网l;g"t~ s Xc

51Testing软件测试网2VA8eNt!b il9M

51Testing软件测试网wv ` ?,T*v_ue$`:^
                    "使用保留字":Shell有一些具有特殊意义的字,例如在Shell脚本中,do,done,for等字用来控制循环操作,if,then等控制条件操作。 51Testing软件测试网5`](j'np@

51Testing软件测试网%iS)X Qyj K

                  保留字随Shell环境的不同而不同。 51Testing软件测试网0kmC aK(gw

aSw$P TNgU:[0                    "通配符":* 匹配任何位置 51Testing软件测试网b'oO|$lh
                         ? 匹配单个字符
.M-~2D8qsOt0                         [] 匹配的字符范围或列表 例如: 51Testing软件测试网*AA:Q1ZkE5x
                          51Testing软件测试网!y]3R*h(c\)YM
                            $ls [a-c]* 51Testing软件测试网H!FS8g7x@i,Z
                            51Testing软件测试网)_:\] |~mo~
                            将列出以a-c范围内字符开头的所有文件
wB-O,Ko+u(IW[0                            $ls [a,m,t]*
/{6{9c3rULR {M?Z0                           将列出以e,m或t开头的所有文件 51Testing软件测试网#| o9M"g Z?Y

zz#`cN U ?*| W0                    "程序命令"
ndfH``OBu}0                  :当用户输入命令后,Shell读取环境变量$path(一般在用户自己的.profile中设置),该变量包含了命令可执行文件可能存在的目录列表。 51Testing软件测试网#p;A Tc+] ~.T8U"cf%MH

51Testing软件测试网ai E?Y

                  shell从这些目录中寻找命令所对应的可执行文件,然后将该文件送给内核执行。 51Testing软件测试网9`i4L*c"ne3Uh

51Testing软件测试网u!k%n:j r/@f S

                    "输入输出重定向及管道" :重定向的功能同DOS的重定向功能:

;i`k2c.i;|"S0 51Testing软件测试网9s$\~nd`N

                       ">" 重定向输出
-m5m0FO4b`0                       "<" 重定向输入

K5]0@/wsP^0

r%H m9S-F.yG0                    而管道符号,是unix功能强大的一个地方,符号是一条竖线:"|",用法:
Q-HO9@$w#kav;D0                  command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为command 51Testing软件测试网J v7a RC6H7Y.Fq
                  2的输入传给command 2,例如: 51Testing软件测试网#mt b&_;[ {-C|^

2z,A}I`9dE5j0                      $ls -s|sort -nr|pg

J%ip7G*^8XQ0 51Testing软件测试网.f+z3t&[ \,{M

                    该命令列出当前目录中的所有文件,并把输出送给sort命令作为输入,sort命令按数字递减的顺序把ls的输出排序。然后把排序后的 51Testing软件测试网;@,GP'} n2U6R!Ec#@+W

Y3B L }7X0                  内容传送给pg命令,pg命令在显示器上显示sort命令排序后的内容。

;NeN]'_5s+{0_s0 51Testing软件测试网%d6`"k Xkp4d}J$i

                    "维护变量"
3^/n&v\kM1]0                  :Shell可以维护一些变量。变量中存放一些数据供以后使用。用户可以用"="给变量赋值,如:

OVD2?tk dQ0

t7tR:j)L c3p,G&Q0                           $lookup=/usr/mydir 51Testing软件测试网%T$}1X.Q"yN~Nh~

2R&CpsA0                  该命令建立一个名为lookup的变量并给其赋值/usr/mydir,以后用户可以在命令行中使用lookup来代替/usr/mydir,例如:

,W_#Is(A p&A0 51Testing软件测试网C5N.j-yE"P$oj$VC|3B

                            51Testing软件测试网W0rU&tQ
                           $echo $lookup
#td9c5{,? ?$o0                           结果显示:/usr/mydir 51Testing软件测试网z7p ?STr B'u

51Testing软件测试网;N j&j{CB

                           为了使变量能被子进程使用,可用exprot命令,例如: 51Testing软件测试网#h/gA Q!Z [%Kbb2C

WEP Z*M2K0                           $lookup=/usr/mydir 51Testing软件测试网HJ ^6x%MD5uz,`v
                           $export lookup 51Testing软件测试网 De"I G6A+]k_z

Lv7C~Na0                    "运行环境控制" 51Testing软件测试网m)~6Q`+by4TF&P W3D;I
                  :当用户登陆启动shell后,shell要为用户创建一个工作的环境,如下:

E3X:G!pFm"U#^0

&C.Opk gL y0                    1>当login程序激活用户shell后,将为用户建立环境变量。从/etc/profile和.profile文件中读出,在这些文件中一般都用$TERM 51Testing软件测试网*v0Q4Q"M*O

@XdZ*Vw-f;xa4Kg0                  变量设置终端类型,用$PATH变量设置Shell寻找可执行文件的路径。

CA ~kVb Z[+?0 51Testing软件测试网Ijt6UG-Fg d

                    2>从/etc/passwd文件或命令行启动shell时,用户可以给shell程序指定一些参数,例如"-x",可以在命令执行前显示该命令及其参数。后面详细介绍这些参数。

"`+R5s(l"wge0 51Testing软件测试网Sm#g n F

51Testing软件测试网8{%[b5K]1p
                    "shell编程" :本文主要介绍的内容。

y3K"a3\6nZr0 51Testing软件测试网r9yD8u#YnBB*y

                    shell本身也是一种语言(*可以先理解为unix命令的组合,加上类C的条件,循环等程序控制语句,类似dos批处理,但要强大的多),用户可以 51Testing软件测试网&lw~fo['V ^ i

51Testing软件测试网8h8f j:{aW5} H

                  通过shell编程(脚本,文本文件),完成特定的工作。 51Testing软件测试网YE9on7~t%Hi

T^"?g9P+m?0                  SHELL变量 51Testing软件测试网0Vpj5c bJ

dE` M+G!q0                    下面我们详细的介绍Bourne Shell的编程:

_#^Rz7V3k0 51Testing软件测试网qHsH!Iq \,T

                    自从贝尔实验室设计了Bourne
2yL5e$kD&{T1~^0                  Shell。从那时起许多厂商根据不同的硬件平台设计了许多版本得unix。但在众多版本的unix中,Bourne Shell 51Testing软件测试网E(Ny2T/mT]
                  一直保持一致。
@m0v YL(p;Qu0                    1>Bsh的启动:用户在登陆后,系统根据文件/etc/passwd中有关该用户的信息项启动Shell。例如某用户在passwd中 51Testing软件测试网:[a g*I{!q:mr

+~ N-v"G-z#q:T |!Y{0                  的信息项为:

{/bpJe.f0 51Testing软件测试网&~[2K&ebE

                      ice_walk:!:411:103:Imsnow 51Testing软件测试网2~!HVqU0@F v1VVq
                  ,ice_walk:/home/ice_walk:/bin/bsh 51Testing软件测试网I L[] R

51Testing软件测试网3P1w'B-W;M:]A~

                    则表明,用户名是ice_walk等信息,在最后一项"/bin/bsh"表明用户的sh环境类型是bsh,于是系统启动之。在启动或执行(包括下面我们要讲 51Testing软件测试网Ob#neL

51Testing软件测试网+`l(l|Sb

                  的shell程序--脚本)过程中可以使用以下一些参数,我们一一说明: 51Testing软件测试网p3W_I%G0M0y4S

*IZzjo+og0                    -a 将所有变量输出 51Testing软件测试网H'~j(o&iIx!x9p8M9Q
                    -c "string"从string中读取命令
~)D,vpx{y0                    -e 使用非交互式模式
h"ef0Pgbb'U~^0                    -f 禁止shell文件名产生 51Testing软件测试网*o(r#a|_i%U:? h.U
                    -h 定义
3vY3ab m^0                    -i 交互式模式
y#wO!OB.N-V&[B0                    -k 为命令的执行设置选项
BqyMoitd B\0                    -n 读取命令但不执行 51Testing软件测试网 p8Qi o8V:J
                    -r 受限模式 51Testing软件测试网2yTt%dEt1t8Y6t)H
                    -s 命令从标准输入读取 51Testing软件测试网4A t(b)B z hM^
                    -t 执行一命令,然后退出shell
lkhNH'b0                    -u 在替换时,使用未设置的变量将会出错 51Testing软件测试网)_3l g,ye8m }
                    -v 显示shell的输入行 51Testing软件测试网se8{?kF*W
                    -x 跟踪模式,显示执行的命令

;vne&X;Ys0

g NE;u%Mf,o0                  许多模式可以组合起来用,您可以试试了,但-ei好象不行,你说why呢? 51Testing软件测试网5cg,D`? |;v_f

v+}rzO6G0                    使用set可以设置或取消shell的选项来改变shell环境。打开选项用"-",关闭选项用"+",多数unix允许打开或关闭a、f、e、h、k、n、 51Testing软件测试网U:Li6M!b/T

6zxYyq,J{;J0                  u、v和x选项。若显示Shell中已经设置的选项,执行: 51Testing软件测试网O(NjnJ)g.^*~

I#l)K.a$bC%B0                      $echo $- 51Testing软件测试网p2Gvr.rG

51Testing软件测试网6bi5F eB)]/R

                    Bsh中每个用户的home目录下都有一个.profile文件,可以修改该文件来修改shell环境。为了增加一个可执行文件的路径(例如/ice_walk/bin),

5uF ^|1i5Q.n0

J(\5K(Mi3q-J3}kL s v+v0                  可以把下面代码加入.profile中 51Testing软件测试网L6NK wNS _9Y

sSv} ~#l\$C/U4i0                      PATH=$PATH:/ice_walk/bin;exprot PATH

%zj"pZ:BFK&` q+c W vK0 51Testing软件测试网?J&[R-N2Jz9y:]0]

                     .profile中shell的环境变量意思如下: 51Testing软件测试网s_^/L%s$UyC

51Testing软件测试网7f/FK1rQ,h

                      CDPATH 执行cd命令时使用的搜索路径
EI0M;vT0                      HOME 用户的home目录 51Testing软件测试网l#tq?H G%C0a(Y3i
                      IFS 内部的域分割符,一般为空格符、制表符、或换行符
u'u!A BF Do0                      MAIL 指定特定文件(信箱)的路径,有UNIX邮件系统使用
E*T'wOv j0                      PATH 寻找命令的搜索路径(同dos的config.sys的 path)
WL:}\ Y@1R#nV0                      PS1 主命令提示符,默认是"$"
;K-R1w#Px'@"SSG/Ra0c4D0                      PS2 从命令提示符,默认是">"
(F.}x5g3sw ?8z0                      TERM 使用终端类型

P%lzxR/u*n2F0 51Testing软件测试网;b/CC'p'u

                    2>Bsh里特殊字符及其含义 51Testing软件测试网&GEC] TfX"S+\ p

.y w*WMb^ z0                    在Bsh中有一组非字母字符。这些字符的用途分为四类:作为特殊变量名、产生文件名、数据或程序控制以及引用和逃逸字符控制。他们 51Testing软件测试网j"a DC Yx9l0Yi

#ld^1|Q C h^[#`0                  可以让用户在Shell中使用最少的代码完成复杂的任务。 51Testing软件测试网8he c)w%{kG

51Testing软件测试网 @)b*P8D Gx#^9t.{

                       *> Shell变量名使用的特殊字符 51Testing软件测试网*D9b gT5~:G5~
                          $# 传送给命令Shell的参数序号 51Testing软件测试网D pGx'N7gLm
                          $- 在Shell启动或使用set命令时提供选项
5cY0j_rGr}#_/R0                          $? 上一条命令执行后返回的值 51Testing软件测试网'Ec3G*TA
                          $$ 当前shell的进程号
(X#h {d7@0                          $! 上一个子进程的进程号
a)Q*e}~b0                          $@ 所有的参数,每个都用双括号括起 51Testing软件测试网 t{"Tw h l F&x1N
                          $* 所有参数,用双括号括起
D/rT1ZMz9a6o0                          $n 位置参数值,n表示位置 51Testing软件测试网 L8o7M;k P }`v9n
                           当前shell名 51Testing软件测试网_p7h;L:Ra-b6s
                       *>产生文件名的特殊字符 51Testing软件测试网-_Mj4c5Y9N-{ v5B.d
                          包括"*","?","[]",上面讲过,不再多说。
%~zU[s8w$O0                       *>数据或程序控制使用的特殊字符
:yk#rE&dp ^l0                          >(file) 输出重定向到文件中(没有文件则创建,有则覆盖) 51Testing软件测试网p n"kyrbz
                          >>(file) 51Testing软件测试网ugIH1Y+j}
                  输出重定向到文件中(没有则创建,有则追加到文件尾部) 51Testing软件测试网N]8fJeq nfU4I
                          <(file) 输入重定向到文件
5X],L:J3I5}'Bdg%ZJZ0                          ; 命令分割符 51Testing软件测试网;e)` zPf;?V'Rm"Z
                          | 管道符 51Testing软件测试网)i!FA X E2v#b `WE:F
                          & 后台运行(例如:sleep 10 &) 51Testing软件测试网'`$D{ wSt)v%Gi p
                          ` ` 命令替换,重定向一条命令的输出作为另一命令的参数 51Testing软件测试网P }^ g2Oj9M
                       *>对于引用或逃逸的特殊字符

@*G4J,rD:{0

'k7Y~,eS0                  Bsh用单引号' '和双引号" 51Testing软件测试网E)Q,YJ"m7O/~{
                  "将特殊字符或由空白分隔的字引用起来组成一个简单的数据串.使用单引号和双引号的区别是双引号中的内容可进行参数和变量替换.逃逸字符也一样.

$a5b$]E9gWuL`0

o-rG/Mt(_E051Testing软件测试网qe}Kk
                          $echo "$HOME $PATH"
,M lU m w]uXV0OW0                           结果显示$/u/ice_walk/bin:/etc:/usr/bin
ly&[;OY/Z)L0                          而$echo '$HOME $PATH' 结果显示$HOME $PATH

1Un)R*s tH0

:W9K1\[0m0                    shell的逃逸符是一个"\",表示其后的字符不具有特殊的含义或不是shell的函数 51Testing软件测试网&_)f g+m@3gN/U

51Testing软件测试网"{$t&fY-vLh^[#g(rJ

                          $echo $HOME $PATH
D'a go aWKU0                          结果显$$HOME /bin:/etc:/usr/bin:

PbE~-J\0 51Testing软件测试网P5t3e7`K:j

                  3>Bsh的变量 51Testing软件测试网O$e5Y-K6]C

I0j[$C O#W0                    前面我们在多个地方引用了变量,当Shell遇到一个"$"符时(没有被引用或逃逸),它将认为其后为一变量。不论该变量是环境变量还是用户自定义的变量,在命令行中变量名要被变量值替换。例如命令:ls 51Testing软件测试网r]J$|*~T nSy4}

yi]'t0`5EV0                  $HOME将列出变量HOME对应目录下的文件。 51Testing软件测试网0c2u8X9R tg7H&Y
                  用户可以在命令行中的任何地方进行变量替换。包括命令名本身,例如: 51Testing软件测试网/f$tcC X.c'l.Qat

A rmg {4H0                      $dir=ls
9c#} ] UBGWKF0                      $$dir f*

W"`-S^9^0

;e H+k3]*`}5n)q0                    将列出以f开头的文件。 51Testing软件测试网(@U+D#GgsA$~

o#Kz%xYWu.L*Q0                    现在详细的介绍下Bsh的变量。Bsh中有四类变量:用户定义的变量、位置变量(shell参数)、预定义变量及环境变量。 51Testing软件测试网:zAM!xJ

51Testing软件测试网 _8h g7Lt!n;yG

                    用户定义的变量:

@!y-Z;\:uw0B0

ax6im3N+j0                    用户定义的变量由字母和下划线组成,并且变量名的第一个字符不能为数字(0~9)。与其他UNIX名字一样,变量名是大小写敏感的。用户可以在命令行上用"="给变量赋值,例如:

C3c|\%xu"tFC`0

mnP)b#_1b0
u;?}F:o|0                      $NAME=ice_walk

J6\WoZ~1M0

Qt|!Is E7_0                    给变量NAME赋值为ice_walk,在应用变量NAME的时候,在NAME前加"$"即可,前面已说,不再废话(别说我废话多,关键是没当过老师)。可以用变量和其他字符组成新的字,例如: 51Testing软件测试网,MO4S)A6od

7I1mO&crY"~:{051Testing软件测试网`*T0yi6H0dkt)WwP
                      $SUN=sun 51Testing软件测试网,SM~tA%mEe2Kv*An
                      $echo $day

H` b4Efi0 51Testing软件测试网BK%Q ~(QV#W

                    在应用shell变量时候,可以在变量名字两边$后面加上{},以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能。

h8N DO0G~)Z4cp0

T"Gvp^0                   
af:fI7o0                    结果显示:sunday(注意不能echo
(U!lgr/@c^7Ji0                  $SUNday,因为SUNday变量没定义,读者试下执行结果) 51Testing软件测试网.e:Q'Uw.FR,g e7T B
                  用户也可以在命令行上同时对多个变量赋值,赋值语句之间用空格分开:

HO3Uj4b EZYih]0 51Testing软件测试网$A"HB}#d)MMa

                      $X=x Y=y

0bqT`cI0 51Testing软件测试网 F$V_-lQ&?N0Ksp ep

                      注意变量赋值是从右到左进行的 51Testing软件测试网}-y.R }1JM-sE#i8UB

51Testing软件测试网Hj ]8LV&I

                      $X=$Y Y=y
bLH0L5^Q0                      X的值是y
2F7DsHj0E$f0                      $X=z Y=$Z 51Testing软件测试网+JCf'CT(v

"l OWJE0                      Y的值是空(变量未赋值时,shell不报错,而是赋值为空) 51Testing软件测试网 ` k'd*zV$g7B4{&f

/z-[e-V0q4Dn0                    用户可以使用"unset <变量>"命令清除给变量赋的值 51Testing软件测试网 xt [X%F'L5?HJ"{G

51Testing软件测试网}$z S0`TV c

                  用户使用变量时要在其前面加一"$"符,使变量名被变量值所替换。Bsh可以进行变量的条件替换,即只有某种条件发生时才进行替换。替换条件放在一对大括号{}中,如:

C|d/q+bX/]N4Gs0

-vzZ-Y#O]0
tv3Ofy_ rf0                      ${variable: -value}
pgfo/W|0                  variable是一变量值,value是变量替换使用的默认值

"Ede8w@1_~/Np5z^k Q0 51Testing软件测试网npd_? ?9X;F

                      $echo Hello $UNAME
$f4d1K o(f LfC x0                      结果显示:Hello 51Testing软件测试网IFx}kP*|VD
                      $echo Hello ${UNAME: -there} 51Testing软件测试网vu"sY"e4JFE
                      结果显示:Hello there 51Testing软件测试网&fq8_ @)g%~j`,f j
                      $echo $UNAME
H1O%fs;od0                      结果显示: (空)
"l6x+d6C]2w0dc0                      $UNAME=John 51Testing软件测试网2iS [ m R`
                      $echo Hello ${UNAME: -there} 51Testing软件测试网V&x&N#O)SW*_
                      结果显示:Hello John

r;o KY*g|"g0

D-`,{7f0y4?0                    可以看出,变量替换时将使用命令行中定义的默认值,但变量的值并没有因此而改变。另外一种替换的方法是不但使用默认值进行替换,而且将默认值赋给该变量。其形式如下:

5b Q a"a"qS{:l0 51Testing软件测试网XJkg:SA

51Testing软件测试网6b1C~,T!q:HZ
                      $

@h},]A n)xTV\-S.H0

A N'i*M ` uL0                    该形式在变量替换后同时把值value符给变量variable。 51Testing软件测试网+g\5JN&Y(R

51Testing软件测试网 kVLun]t$S9l*|

                      $echo Hello $UNAME
#F2d$m_ X8K^@9h&^:o0                      结果显示:Hello
S*o)M7cX7|;y$~0                      $echo Hello $
H!}-k6B_q0                      结果显示:Hello there 51Testing软件测试网9j*^)r[,ty9Q i
                      $echo $UNAME
g5Za _tlp0                      结果显示:there 51Testing软件测试网+~)jQu#uPus3_X
                      $UNAME=John
6@7]"M8jD @@0Af0                      $echo Hello $
DJLowl\.f0                      结果显示:Hello John 51Testing软件测试网T S([ E1d/Qz}9ml%L

51Testing软件测试网nU]0~h&TB#f

                    变量替换的值也可以是` `括起来的命令: 51Testing软件测试网Y$hVC3\yA

51Testing软件测试网fD'ZD*\Lw K

                      $USERDIR={$Mydir: -`pwd`}

$j7w*B~a _ }(i0 51Testing软件测试网4CTC_}9|8Fv

                    第三种变量的替换方法是只有当变量已赋值时才用指定值替换形式: 51Testing软件测试网d"ni0GR?D\ v

C,n2@+P1z6T@0                      ${variable: +value} 51Testing软件测试网sDX jF#?

51Testing软件测试网 a*~;pu,G5Qr

                      只有变量variable已赋值时,其值才用value替换,否则不进行任何替换,例如:

c7kqwgM0 51Testing软件测试网*oV]'{8] M2S

                      $ERROPT=A 51Testing软件测试网v3n}MCKb#A+~
                      $echo ${ERROPT: +"Error tracking is acitive"}
6ZoQ3[Ej.xB*N0                      结果显示:Error tracking is acitive
;eu:JGZ Gg0                      $ERROPT=
ywd%Ui]6x/N~`0                      $echo ${ERROPT: +"Error tracking is acitive"}
t!X,y*[5PS c0                      结果显示: (空) 51Testing软件测试网2Ov UL AQ0DA

:Q q N.er0                    我们还可以使用错误检查的条件进行变量替换:

D6n6L;W)US I0

%N X ^.P dx)I6Bx0                      $ 51Testing软件测试网 v(j.[TOVng

k*a-x N*l/t0                  当变量variable已设置时,正常替换。否则消息message将送到标准错误输出(若此替换出现在shell程序中,那么该程序将终止)。 例如:

2r,s9zdb4u~0 51Testing软件测试网+_1W8sz3H.yWL'z

51Testing软件测试网W _d l7_7gk2q
                      $UNAME=
"i ezT,H"x+L0                      $echo $ {UNAME:?"UNAME HAS NOT BEEN SET"} 51Testing软件测试网'p$GR Tl]Ne
                      结果显示:UNAME HAS NOT BEEN SET

-~*}%b(A1_i0

H0XQ2fZaU0                      $UNAME=Stephanie
zm"]`&T+]#Z&`0                      $echo $ {UNAME:?"UNAME HAS NOT BEEN SET"}

3n}aT:u)Ps)|#C"f0

W"k4HQT+wd5Wj/Rf0                      结果显示:Stephanie 51Testing软件测试网P2~9g};J G5ym4o1k
                      当没有指定message时,shell将显示一条默认的消息,例如:

kS%B%x}feu1[0

u;l%},z }%q'dC)T B0                      $UNAME=
B.d*cZM4m0                      $echo $
h |+ZUA(R|0                      结果显示:sh:UNAME:parameter null or not set 51Testing软件测试网&I]G.?L'EN(x

BH*E E4L!y7iu0                  4>位置变量或Shell参数 51Testing软件测试网F"t*B*|Sa

0HaC2iaX0                    在shell解释用户的命令时,将把命令行的第一个字作为命令,而其他的字作为参数。当命令对应的可执行文件为Shell程序时,这些参数将作为位置变量传送给该程序。第一个参数记为,第二个为....第九个为。其中1到9是真正的参数名,"$"符只是用来标识变量的替换。 51Testing软件测试网!b*SMv!u0o#w5Z/i2V

51Testing软件测试网Vw3Ar*H#c


iKv TJ9_0`4f d0                    位置变量指命令对应的可执行文件名。在后面将详细介绍位置变量。

~)f8i^]\,]h0 51Testing软件测试网-ty2|5s%JI'X3S8vM

                    1.只读变量

u%{ t&CKM P Zd;u0 51Testing软件测试网;K)xvL V4[{%w

                    用户将变量赋值后,为了防止以后对该变量的修改,可以用以下命令将该变量设置为只读变量: 51Testing软件测试网s sD\K#qDU1_ c

X@3br3a{0                      readonly variable

%V(XAPyQ3`*\@^b2i0 51Testing软件测试网E(mF!CQp:a

                    2.export命令 51Testing软件测试网,D ND C.jn y%G4B C

51Testing软件测试网.e1Qi'Vx7?R

                    shell执行一个程序时,首先为该程序建立一个新的执行环境,称为子shell。在Bourne
{y P/S#y2WlP0                  Shell中变量都是局部的,即他们只在创建他们的Shell中有意义。用户可以用export命令让变量被其他子Shell识别。但某用户的变量是没法让其他用户使用的。

&ws8x{Jz%U0

z!F#[N#y[&N0
2{6F`V5PtEA0                    当用户启动一个新shell时,该shell将使用默认的提示符。因为赋给变量PS1的值只在当前shell中有效。为了让子Shell使用当前Shell中定义的提示符号,可以使用export命令: 51Testing软件测试网pMA,Is.C4u

\l(k RZ]Z0
9Vse3`9`0                      $PS1="Enter command:"
5Nb%G2A6_3[a8K0                      Enter command:export PS1 51Testing软件测试网,F*g9CG7gH;la a
                      Enter command:sh 51Testing软件测试网f$X#eL?-zW(|6o
                      Enter command:

*ra#r0kO%r6L bF0 51Testing软件测试网TZ;VTp F L

                      此时变量PS1变成了全局变量。它可以被其子Shell使用。当变量被设置成全局的以后,将一直保持有效直到用户退出该变量所在的Shell。用户可以在文件.profile中给一个变量永久赋值。详见"规范Shell"。 51Testing软件测试网K9s rd Z+b

4d{5~ iHn`5F051Testing软件测试网 L JbB;l:X.U7h)A
                  基本语句

vy| yAY0

s!Z r$n2Etm b0                    从本节起,我们将详细介绍Shell程序设计的基本知识,通过编写Shell脚本,用户可以根据自己的需要有条件的或者重复的执行命令。通过Shell程序,可以把单个的UNIX命令组合成一个完全实用的工具,完成用户的任务。 51Testing软件测试网Uzn&o2G*x

51Testing软件测试网-^ jn-ceu

51Testing软件测试网,sFP @.^f;](\Y v
                    1>什么是Shell程序

&wt"{ tqjrv0 51Testing软件测试网!Sv/W6HG ^

                    当用户在UNIX Shell中输入了一条复杂的命令,如:

B&p'z1EggPNJ0

7bL;Z3oq5| W"t il0                      $ls -R /|greo myname |pg

XM wfTT0

p MU"Eu7V9m0                    我们可以称用户在对Shell编程,当把这条语句写在一个文件里,并且符给该文件可执行权限,那么该文件就是我们传统上说的Shell程序。

/W&q:onnVW4U0 51Testing软件测试网~0lW ^ii/f(y[

51Testing软件测试网2s2ae!mb9qT
                    2>简单的Shell程序

Si7G'r2i7dH2A7O|\[0 51Testing软件测试网dc_W3?R3q

                    假设用户每天使用下述命令备份自己的数据文件: 51Testing软件测试网t(fq|&h~S

51Testing软件测试网]1i)?J&A

                      $cd /usr/icewalk;ls * |cpio -o > /dev/fd0

+CN~A6i3G0

!m!~ f'O|o4C0                    我们可以把它写在一个文件,如:ba.sh中: 51Testing软件测试网F^@5S.En&j

51Testing软件测试网kXX"aG%XWR

                      $cat >ba.sh
}'H*NP0fW^0                      cd /usr/icewalk 51Testing软件测试网 {!n;Xe-FjO.l_;[
                      ls * |cpio -o > /dev/fd0 51Testing软件测试网 E#a qpxIUU;h$Z
                      ^D  (ctrl_d) 51Testing软件测试网1V-U0^~)vn3RU

51Testing软件测试网5}.gl`s#U

                    程序ba.sh就是Shell脚本,用户可以用vi或其他编辑工具编写更复杂的脚本。

'x:A @C#`G0 51Testing软件测试网U D!y&v}(gv D)v Y

                    此时用户备份文件只需要执行Shell程序ba.sh,执行时需在当前Shell中创建一个子Shell: 51Testing软件测试网+\X!sJM:e$SBJ

#CuU9S$]0                      $sh ba.sh 51Testing软件测试网+gHzm!f6o0~

51Testing软件测试网m,^:?t$l&W

                    程序sh与用户登陆时执行的Bourne 51Testing软件测试网!_&v]U5G7p
                  Shell相同,但当Sh命令带参数ba.sh后,它将不再是一个交互式的Shell,而是直接从文件ba.sh中读取命令。 51Testing软件测试网%r!y[Q ^/y sb

1AhTi-P}7EY'N0                    执行ba.sh中命令的另一方法是给文件ba.sh执行权限:

zP ] Aw0 51Testing软件测试网] c,_u`*z6v^

                      $chmod +x ba.sh 51Testing软件测试网0mO9_(Z.\|5~

51Testing软件测试网xhf$x0Mn8W{'k

                    此时,用户可以输入文件名ba.sh做为一个命令来备份自己的数据,需要注意的是,用这种方法执行命令的时候,文件ba.sh必须存在于环境变量$PATH所指定的路径上。

m;S`)}#W'mk*m051Testing软件测试网~lg bpz
51Testing软件测试网-tM(uQCDs
Link URL: http://mytesting.bokee.com/viewdiary.15819711.html

TAG:

 

评分:0

我来说两句

日历

« 2024-05-04  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

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

RSS订阅

Open Toolbar