shell pragrame (1)

Shell编程 在DOS 中,你可能会从事一些例行的重覆性工作,此时你会将这些重覆性的命令写成批次档,只要执行这个批次档就等於执行这些命令。大家会问在UNIX中是否有批次处理这个东东,答案是有的。在UNIX中不只有如DOS的批次处理,它的功能比起DOS 更强大,相对地也较复杂,已经和一般的高阶语言不相上下。在UNIX中大家都不叫做批次档,而叫做Shell Script。 一般而言,Shell Script的地位和其它的可执行档(或命令)是完全相同的,只不过Shell Script是以文字档的方式储存,而非二进位档。而执行Shell Script时,必须有一个程式将其内容转成一道道的命令执行,而这个程式其实就是Shell ,这也就是为什麽我们叫做Shell Script的原因(往後我们称为Script)。不同Shell 的Script基本上会有一些差异,所以我们不能将写给A shell 的Script用B shell 执行。而在UNIX中大家最常使用Bourne Shell以及C Shell ,所以这堂课就介绍这两种Script的写法。 将文字档设为可执行的Shell Script 如果我们已经写好Script,如何将其设成可执行档呢?因为Script其实是一个可执行档,所以必须将其存取权设定成可执行。我们可以使用下列命令更改存取权: chmod u+x filename 只有自己可以执行,其它人不能执行 chmod ug+x filename 只有自己以及同一群可以执行,其它人不能执行 chmod +x filename 所有人都可以执行 而我们如何指定使用那一个Shell 来解释所写的Script呢?几种基本的指定方式如下所述: 1. 如果Script的第一个非空白字元不是"#",则它会使用Bourne Shell。 2. 如果Script的第一个非空白字元是"#"时,但不以"#!"开头时,则它会使用C Shell。 3. 如果Script以"#!"开头,则"#!"後面所写的就是所使用的Shell,而且要将整个路径名称指出来。 这里建议使用第三种方式指定Shell ,以确保所执行的就是所要的。Bourne Shell的路径名称为/bin/sh ,而C Shell 则为/bin/csh。 1. 使用Bourne Shell ┌——————————┐ ┌——————————┐ │echo enter filename │ │#!/bin/sh │ │ . │ or │ . │ │ . │ │ . │ │ . │ │ . │ └——————————┘ └——————————┘ 2. 使用C Shell ┌——————————┐ ┌——————————┐ │# C Shell Script │ │#!/bin/csh │ │ . │ │ . │ │ . │ │ . │ │ . │ │ . │ └——————————┘ └——————————┘ 3. 使用/etc/perl ┌——————————┐ │#! /etc/perl │ │ . │ │ . │ │ . │ └——————————┘ 除了在Script内指定所使用的Shell 外,你也可以在命令列中强制指定。比如你要用C Shell 执行某个Script,你可以下这个命令: csh filename 此时的Script的存取权就不一定要为可执行档,其内部所指定的Shell 也会无效,详细的情形後面会讨论。 □Script的基本结构及观念 Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上"/" ,这个时候下一行的内容就会接到这一行的後面,成为同一行,如下 ┌———————————┐ │echo The message is / │ │too long so we have / │ │to split it into / │ │several lines │ └———————————┘ 当Script中出现"#" 时,再它後面的同一行文字即为注解,Shell 不会对其翻译。 在Script中要执行一个命令的方法和在命令列中一样,你可以前景或背景执行,执行命令时也会需要设定一些环境变数。 Script的流程控制和一般高阶语言的流程控制没有什麽两样,也和高阶语言一样有副程式。这些使得Script的功能更加强大。 为了达到与高阶语言相同的效果,我们也可以在Script中设定变数,如此使Script 成为一个名付其实的高阶语言。 □Bourne Shell 一、变数 Bourne Shell的变数型态只有字串变数,所以要使用数值运算则必须靠外部命令达成目的。而其变数种类有下列几种: 1. 使用者变数 这是最常使用的变数,我们可以任何不包含空白字元的字串来当做变数名称。 设定变数值时则用下列方式: var=string 取用变数时则在变数名称前加上一"$" 号。 ┌———————┐ │name=Tom │ │echo name │ │echo $name │ └———————┘ 结果如下: name Tom 2. 系统变数(环境变数) 和使用者变数相似,只不过此种变数会将其值传给其所执行的命令。要将一使用者变数设定为系统变数,只要加上: export var ┌———————┐ │name=Tom │ │export name │ └———————┘ 以下是使用者一进入系统之後就已设定好的系统变数: $HOME 使用者自己的目录 $PATH 执行命令时所搜寻的目录 $TZ 时区 $MAILCHECK 每隔多少秒检查是否有新的信件 $PS1 在命令列时的提示号 $PS2 当命令尚未打完时,Shell 要求再输入时的提示号 $MANPATH man 指令的搜寻路径 3. 唯读的使用者变数 和使用者变数相似,只不过这些变数不能被改变。要将使用者变数设成唯读的 ,只要加上: readonly var 而若只打readonly则会列出所有唯读的变数。还有一点,系统变数不可以设定成唯读的。 ┌———————┐ │name=Tom │ │readonly name │ │echo $name │ │name=John │ │readonly │ └———————┘ 结果如下: Tom name: is read only readonly name readonly ...... 4. 特殊变数 有些变数是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它 唯读的系统变数,而叫它特殊变数(有些书会叫它唯读的系统变数),因为这 些变数是一执行程式时就有了,况且使用者无法将一般的系统变数设定成唯读 的。以下是一些等殊变数: $0 这个程式的执行名字 $n 这个程式的第n个参数值,n=1..9 $* 这个程式的所有参数 $# 这个程式的参数个数 $$ 这个程式的PID $! 执行上一个背景指令的PID $? 执行上一个指令的返回值 当你执行这个程式时的参数数目超过9 个时,我们可以使用shift 命令将参数 往前移一格,如此即可使用第10个以後的参数。除此之外,吾人可以用set 命 令改变$n及$*,方法如下: set string 如此$*的值即为string,而分解後则会放入$n。如果set 命令後面没有参数, 则会列出所有已经设定的变数以及其值。 档名:ex1 参数:this is a test ┌———————————┐ │echo Filename: $0 │ │echo Arguments: $* │ │echo No. of args.: $# │ │echo 2nd arg.: $2 │ │shift │ │echo No. of args.: $# │ │echo 2nd arg.: $2 │ │set hello, everyone │ │echo Arguments: $* │ │echo 2nd arg.: $2 │ └———————————┘ 结果如下: Filename: ex1 Arguments: this is a test No. of args.: 4 2nd arg.: is No. of args.: 3 2nd arg.: a Arguments: hello, everyone 2nd arg.: everyone 值得一提的是,当你想从键盘输入一变数值时,你可以使用下面的命令: read var1 var2..... 这时read会将一个字分给一个变数。如果输入的字比变数还多,最後一个变数会将剩下的字当成其值。如果输入的字比变数还少,则後面的变数会设成空字串。 如果需要处理数值运算,我们可以使用expr命令。其参数及输出列於附录A。 二、执行命令 在Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不 同。 1. 直接下命令 这个方式和在命令列中直接下命令的效果一样。 2. 使用sh命令 sh command 这个档案必须是Bourne Shell的Script,但这个档案并不一定要设成可执行。 除此之外和直接下命令的方式一样。 3. 使用"."命令 . command 这时和使用sh命令相似,只不过它不像sh一般会产生新的process ,相反地, 它会在原有的process 下完成工作。 4. 使用exec命令 exec command 此时这个Script将会被所执行的命令所取代。当这个命令执行完毕之後,这个 Script也会随之结束。 5. 使用命令替换 这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数 时,就一定要使用这个方法。我们将命令列於两个"`" 号之间,而Shell 会以 这个命令执行後的输出结果代替这个命令以及两个"`" 符号。 str='Current directory is '`pwd` echo $str 结果如下: Current directory is /users/cc/mgtsai 这个意思是pwd 这个命令输出"/users/cc/mgtsai",而後整个字串代替原 来的`pwd` 设定str 变数,所以str 变数的内容则会有pwd 命令的输出。 number=`expr $number + 1` 这就是先前所提要作数值运算的方法,基本上expr命令只将运算式解,而後输出到标准输出上。如果要将某变数设定成其值,非得靠命令替换的方式不可。这个例子是将number变数的值加1 後再存回number变数。 三、流程控制 *************************看到此处 在介绍流程控制之前,我们先来看看test命令。test命令的参数是条件判断式,当 条件为真时则传回非零值,而条件为伪时则传回零。在所有的流程控制都必须用到 test命令来判断真伪。而test命令的使用方法则列於附录B。 test $# = 0 如果执行这个程式没有参数时,会传回非零值代表"$# = 0"这个条件成立。反 之则会传回零。 以下介绍各种流程控制: 1. if then语法以及流程图如下 │ FALSE if (condition) <condition>—┐ then │TRUE │ then-commands then-commands │ fi ├————┘ │ condition 是一个test命令。往後所介绍的各种流程中的condition 都是test 命令。 档名:chkarg ┌———————————┐ │if (test $# != 0) │ │ then │ │ echo Arg1: $1 │ │fi │ └———————————┘ $ chkarg Hello Arg1: Hello $ chkarg $ 2. if then else语法以及流程图如下 │ FALSE if (condition) <condition>—————┐ then │TRUE │ then-commands then-commands else-commands else ├————————┘ else-commands │ fi 3. if then elif语法以及流程图如下 │ FALSE if (condition1) <condition1>—┐ then │TRUE │ FALSE commands1 commands1 <condition2>—┐ elif (condition2) │ │ TRUE │ then │ commands2 commands3 commands2 ├—————┴————┘ else │ commands3 commands3 fi echo 'word 1: /c' read word1 echo 'word 2: /c' read word2 echo 'word 3: /c' read word3 if (test "$word1" = "$word2" -a "$word2" = "$word3") then echo 'Match: words 1, 2, & 3' elif (test "$word1" = "$word2") then echo 'Match: words 1 & 2' elif (test "$word1" = "$word3") then echo 'Match: words 1 & 3' elif (test "$word2" = "$word3") then echo 'Match: words 2 & 3' else echo 'No match' fi 4. for in语法以及流程图如下 │ FALSE for var in arg-list ┌—<arg-list还有东西吗?>—┐ do │ │TRUE │ commands │ 从arg-list取得一项 │ done │ 放到变数var │ │ │ │ │ commands │ └——————┘ │ ┌———————————┐ ┌—————┘ │for a in xx yy zz │ │ │ do │ │ echo $a │ │done │ └———————————┘ 结果如下: xx yy yy zz 5. for语法以及流程图如下 │ FALSE for var ┌—<参数中还有东西吗?>—┐ do │ │TRUE │ commands │ 从参数中取得一项 │ done │ 放到变数var │ │ │ │ │ commands │ └—————┘ │ 档名:lstarg ┌—————┘ ┌———————————┐ │ │for a │ │ do │ │ echo $a │ │done │ └———————————┘ $lstarg xx yy zz xx yy yy zz 6. while 语法以及流程图如下 │ FALSE while (condition) ┌—<condition>—┐ do │ │TRUE │ commands │ commands │ done └————┘ │ ┌————┘ │ ┌———————————————┐ │number=0 │ │while (test $number -lt 10) │ │ do │ │ echo "$number/c" │ │ number=`expr $number + 1` │ │done │ │echo │ └———————————————┘ 结果如下: 0123456789 7. until语法以及流程图如下 │ TRUE until (condition) ┌—<condition>—┐ do │ │FALSE │ commands │ commands │ done └————┘ │ ┌————┘ │ 它和while 的不同只在於while 是在条件为真时执行回圈,而until 是在条件 为假时执行回圈。 8. break及continue 这两者是用於for, while, until 等回圈控制下。break 会跳至done後方执行 ,而continue会跳至done执行,继续执行回圈。 9. case语法以及流程图如下 │ TRUE case str in <str=pat1>————commands1—┐ pat1) commands1;; │FALSE TRUE │ pat2) commands2;; <str=pat2>————commands2—┤ pat3) commands3;; │FALSE TRUE │ esac <str=pat3>————commands3—┤ │FALSE │ ├————————————┘ │ 而pat 除了可以指定一些确定的字串,也可以指定字串的集合,如下 * 任意字串 ? 任意字元 [abc] a, b, 或c三字元其中之一 [a-n] 从a到n的任一字元 | 多重选择 ┌———————————————┐ │echo 'Enter A, B, or C: /c' │ │read letter │ │case $letter in │ │ A|a) echo 'You entered A.';;│ │ B|b) echo 'You entered B.';;│ │ C|c) echo 'You entered C.';;│ │ *) echo 'Not A, B, or C';; │ │esac │ └———————— -------------------------------------------------------------------------------- 相关文章 Shell编程 (2002-01-29 20:11:53) shell编程例子 -- 一个makefile例子 (2001-10-01 12:00:00) shell编程例子 -- 一个.login例子 (2001-10-01 10:00:00) shell编程例子 -- 一个.cshrc例子 (2001-10-01 09:00:00) shell编程例子 -- 一个简单的目录菜单 (2001-10-01 08:00:00) 中文man手册:su - 运行替换用户和组标识的shell (2001-09-24 07:00:01) 中文man手册:smbtar - 直接备份SMB/CIFS共享资源到UNIX磁带设备的shell脚本 (2001-09-23 07:05:01) 中文man手册:chsh--改变你的登录 shell (2001-09-16 08:05:00) Shell源码:用命令find产生一个以当日日期为后缀的文件 (2001-08-24 15:00:01) Shell源码:find查找日期为某一天的文件 (2001-08-24 12:00:00) shell编程例子 -- 一个makefile例子 本文出自: 作者: (2001-10-01 12:00:00) unix.mkf ======== #=============================================================================# # Copyright (C) BS P4 2000. All Rights Reserved. Confidential # #=============================================================================# #=============================================================================# # module: unix.mkf # # description: global include for all makefiles # # system UNIX # # version: 2000.08.01 # # Author: Zhou zeyan # #=============================================================================# #=============================================================================# # processline # #=============================================================================# PLINE = PCFC #=============================================================================# # useful # #=============================================================================# NOTHING = BLANC = $(NOTHING) $(NOTHING) SAY = $(BLANC)echo$(BLANC) CONTINUE = $(BLANC)echo"">/dev/null$(BLANC) IF = $(BLANC)if$(BLANC) THEN = ;then$(BLANC) FI = ;fi$(BLANC) FSY = [ -f$(BLANC) FSN = [ ! -f$(BLANC) FSE = $(BLANC)]$(BLANC) CP = cp$(BLANC) RCP = rcp$(BLANC) PU = echo>/dev/null< RM = rm$(BLANC) DTOU = dos2unix SS = SM1 = .* #=============================================================================# # home device and directory # #=============================================================================# DEVHOME = / DIRHOME = home/$(PROJ) #=============================================================================# # global directories # #=============================================================================# GLOBALDOS = $(DEVHOME)$(DIRHOME)/dos/ GLOBALMKF = $(DEVHOME)$(DIRHOME)/mkf/ #=============================================================================# # Include application mkf # #=============================================================================# include $(GLOBAL_MKF_HOME)$(PROJ).mkf #=============================================================================# # oracle directories # #=============================================================================# ORAINC = $(ORACLE_HOME)/precomp/public/ #=============================================================================# # system directories # #=============================================================================# SYSINC = /usr/include/ SYSINC2 = /usr/include/sys/ #=============================================================================# # file extensions # #=============================================================================# EXTCOM = EXTORS = .pc EXTSRC = .c EXTINC = .h EXTOBJ = .o EXTLIB = .a EXTSHL = EXTBIN = EXTLIS = .lis #=============================================================================# # all include pathes # #=============================================================================# OCALLINC = $(BLANC)include=$(GLBINC) include=$(UTLINC) include=$(COMINC) include=$(PKSINC) include=$(ORAINC) include=$(SIIXINC) include=$(CCMINC) include=$(SYSINC) include=$(SYSINC2) #=============================================================================# # depencies for objects # #=============================================================================# GLBINC_ELE = $(GLBINC)ch_names.h $(GLBINC)cgl_inc.h $(GLBINC)tele_l1.h / $(GLBINC)tele_l2.h UTLINC_ELE = $(UTLINC)utl_inc.h $(UTLINC)utl_db_i.h COMINC_ELE = $(COMINC)comp.h $(COMINC)dbgp.h PKSINC_ELE = $(PKSINC)pks_comm.h MVAINC_ELE = MTINC_ELE = ORAINC_ELE = $(ORAINC)sqlca.h SIIXINC_ELE = $(SIIXINC)pdv_errno.h $(SIIXINC)ppx_errno.h CCMINC_ELE = $(CCMINC)pcm_defs_u.h SYSINC_ELE = $(SYSINC)stdio.h #=============================================================================# # depencies for binaries # #=============================================================================# GLBLIB_ELE = UTLLIB_ELE = $(UTLLIB)libutl.a COMLIB_ELE = $(COMLIB)libcom.a USERLIB_ELE = $(USERLIBHOME)userlib.a ORALIB_ELE = $(ORACLE_HOME)/lib/libsql.a SIIXLIB_ELE = CCMLIB_ELE = /opt/SiiXdvl/lib/libpics.a /opt/SiiXdvl/lib/libpdi.a / /usr/lib/libnsl.so SYSLIB_ELE = /usr/lib/libm.a SOCKLIB_ELE = /usr/lib/libsocket.a /usr/lib/libdl.so /usr/lib/libintl.so #=============================================================================# # libraries for binaries # #=============================================================================# LIBGLB = LIBUTL = $(BLANC)$(UTLLIB)libutl.a LIBCOM = $(BLANC)$(COMLIB)libcom.a LIBUSER = $(BLANC)$(USERLIBHOME)userlib.a LIBMVA = LIBMT = LIBORA = $(BLANC)-L$(PROLDLIBS) LIBSIIX = LIBCCM = $(BLANC)/opt/SiiXdvl/lib/libpics.a /opt/SiiXdvl/lib/libpdi.a / /usr/lib/libnsl.so.1 LIBSYS = $(BLANC)/usr/lib/libm.so LIBSOCK = $(BLANC)/usr/lib/libsocket.so /usr/lib/libdl.so /usr/lib/libintl.so #=============================================================================# # Oracle Compiler # #=============================================================================# # name of compiler OC = $(ORACLE_HOME)/bin/proc # compilerflags and -switches OCINC = include= OCOPT = config=$(GLOBALMKF)proc.cfg #=============================================================================# # Compiler # #=============================================================================# # name of compiler CC = /usr/bin/cc # compilerflags and -switches CCINC = -I CCDEBUG = $(debug:1=-g) # comment by zzy CCOPT = -c -DDEBUG $(CCDEBUG) CCOPT = -c $(CCDEBUG) # flag for objectfile CCOBJ = -o #=============================================================================# # create and make library # #=============================================================================# # create library CL = /usr/bin/ar -rc # make library ML = /usr/bin/ar -rcv # separator between objectfiles MLS = #=============================================================================# # Oracle Linker # #=============================================================================# # name of oracle linker OL = cc -o # linkerflags and -switches OLDEBUG = $(debug:1=-g) OLOPT = $(OLDEBUG) # librarymark for object library OLOL = # librarymark for shared-library OLSL = # separator between objectfiles OLS = $(BLANC) #=============================================================================# # Linker # #=============================================================================# # name of linker LD = /usr/bin/cc # linkerflags und -switches LDDEBUG = $(debug:1=-g) LDOPT = -o $(LDDEBUG) # librarymark for object library LDOL = # librarymark for shared-library LDSL = # separator between objectfiles LDS = #=============================================================================# # Copyright (C) BS P4 2000. All Rights Reserved. Confidential # #=============================================================================# host.mkf ======== #=============================================================================# # Copyright (C) BS P4 2000. All Rights Reserved. Confidential # #=============================================================================# #=============================================================================# # module: pcfc.mkf # # description: application include for all makefiles # # system UNIX # # version: 2000.08.01 # # Author: Zhou zeyan # #=============================================================================# #=============================================================================# # USERLIB directories # #=============================================================================# USERLIBHOME = $(DEVHOME)$(DIRHOME)/userlib/ #=============================================================================# # COMTCP directories # #=============================================================================# COMTCPHOME = $(DEVHOME)$(DIRHOME)/comtcp/ COMTCPWORKETC = $(COMTCPHOME)work/etc/ COMTCPWORKSRC = $(COMTCPHOME)work/src/ COMTCPWORKINC = $(COMTCPHOME)work/inc/ COMTCPWORKOBJ = $(COMTCPHOME)work/obj/ COMTCPWORKLIB = $(COMTCPHOME)work/lib/ COMTCPWORKBIN = $(COMTCPHOME)work/bin/ COMTCPWORKLIS = $(COMTCPHOME)work/src/ COMTCPSRC = $(COMTCPHOME)work/src/ COMTCPLIS = $(COMTCPHOME)work/src/ COMTCPETC = $(COMTCPHOME)etc/ COMTCPINC = $(COMTCPHOME)inc/ COMTCPOBJ = $(COMTCPHOME)obj/ COMTCPLIB = $(COMTCPHOME)lib/ COMTCPBIN = $(COMTCPHOME)bin/ #=============================================================================# # Copyright (C) BS P4 2000. All Rights Reserved. Confidential # #=============================================================================# application.mkf =============== #=============================================================================# # Copyright (C) BS AG 1998. All Rights Reserved. Confidential # #=============================================================================# #=============================================================================# # # # Project : # # BAO CRM3 CGL - Level 2 # # # # module name : # # de.mkf # # # # Task # # Makefile for programe de # # # # Author # # Zhou zeyan # # # # Begin of implementation # # Dec.31, 1998 # # # # Update # # Zhou zeyan # # # # Update date # # Feb.12, 1999 # # # # Release # # Version 1.00 # # # # Definition # # make -f de.mkf # # # # Parameters # # No parameters # # # # Return code # # No return code # # # #=============================================================================# #=============================================================================# # global include # #=============================================================================# include $(GLOBAL_MKF_HOME)$(OS).mkf #=============================================================================# # directories/files # #=============================================================================# DOS = $(DEWORKDOS) ETC = $(DEWORKETC) SRC = $(DEWORKSRC) INC = $(DEWORKINC) OBJ = $(DEWORKOBJ) LIB = $(DEWORKLIB) BIN = $(DEWORKBIN) MSC = $(DEWORKMSC) LIS = $(DEWORKLIS) RUNETC = $(DEETC) RUNSRC = $(DESRC) RUNINC = $(DEINC) RUNOBJ = $(DEOBJ) RUNLIB = $(DELIB) RUNBIN = $(DEBIN) RUNMSC = $(DEMSC) INAM_1 = qdr_inc SNAM_1 = qdr SNAM_2 = qdr_list SNAM_3 = de ONAM_1 = $(SNAM_1) ONAM_2 = $(SNAM_2) ONAM_3 = $(SNAM_3) LNAM_1 = qdr BNAM_2 = $(SNAM_2) BNAM_3 = $(SNAM_3)x IMOD_1 = $(INC)$(INAM_1)$(EXTINC) PMOD_1 = $(SRC)$(SNAM_1)$(EXTORS) SMOD_1 = $(SRC)$(SNAM_1)$(EXTSRC) PMOD_2 = $(SRC)$(SNAM_2)$(EXTORS) SMOD_2 = $(SRC)$(SNAM_2)$(EXTSRC) PMOD_3 = $(SRC)$(SNAM_3)$(EXTORS) SMOD_3 = $(SRC)$(SNAM_3)$(EXTSRC) OMOD_1 = $(OBJ)$(ONAM_1)$(EXTOBJ) OMOD_2 = $(OBJ)$(ONAM_2)$(EXTOBJ) OMOD_3 = $(OBJ)$(ONAM_3)$(EXTOBJ) LMOD_1 = $(LIB)$(LNAM_1)$(EXTLIB) BMOD_2 = $(BIN)$(BNAM_2)$(EXTBIN) BMOD_3 = $(BIN)$(BNAM_3)$(EXTBIN) LIST_1 = $(LIS)$(SNAM_1)$(EXTLIS) RUN_IMOD_1 = $(RUNINC)$(INAM_1)$(EXTINC) RUN_BMOD_2 = $(RUNBIN)$(BNAM_2)$(EXTBIN) RUN_BMOD_3 = $(RUNBIN)$(BNAM_3)$(EXTBIN) RUN_LMOD_1 = $(RUNLIB)$(LNAM_1)$(EXTLIB) #=============================================================================# # generate # #=============================================================================# all : src obj lib bin @ $(SAY) "$(@) done !" @ $(SAY) "" src : $(SMOD_1) $(SMOD_2) $(SMOD_3) @ $(SAY) "$(@) done !" @ $(SAY) "" obj : $(OMOD_1) $(OMOD_2) $(OMOD_3) @ $(SAY) "$(@) done !" @ $(SAY) "" lib : $(LMOD_1) @ $(SAY) "$(@) done !" @ $(SAY) "" bin : $(BMOD_2) $(BMOD_3) @ $(SAY) "$(@) done !" @ $(SAY) "" #=============================================================================# # sources # #=============================================================================# $(SMOD_1) : $(PMOD_1) $(IMOD_1) / $(GLBINC_ELE) $(UTLINC_ELE) $(COMINC_ELE) $(PKSINC_ELE) / $(SIIXINC_ELE) $(CCMINC_ELE) / $(ORAINC_ELE) $(SYSINC_ELE) $(SAY) "+--- make $(@) ---+" $(OC) iname=$(PMOD_1) $(OCINC)$(INC)$(OCALLINC) oname=$(@) / $(OCOPT) @ $(SAY) "" $(SMOD_2) : $(PMOD_2) $(IMOD_1) / $(GLBINC_ELE) $(UTLINC_ELE) $(COMINC_ELE) $(PKSINC_ELE) / $(SIIXINC_ELE) $(CCMINC_ELE) / $(ORAINC_ELE) $(SYSINC_ELE) $(SAY) "+--- make $(@) ---+" $(OC) iname=$(PMOD_2) $(OCINC)$(INC)$(OCALLINC) oname=$(@) / $(OCOPT) @ $(SAY) "" $(SMOD_3) : $(PMOD_3) $(IMOD_1) / $(GLBINC_ELE) $(UTLINC_ELE) $(COMINC_ELE) $(PKSINC_ELE) / $(SIIXINC_ELE) $(CCMINC_ELE) / $(ORAINC_ELE) $(SYSINC_ELE) $(SAY) "+--- make $(@) ---+" $(OC) iname=$(PMOD_3) $(OCINC)$(INC)$(OCALLINC) oname=$(@) / $(OCOPT) @ $(SAY) "" #=============================================================================# # objects # #=============================================================================# $(OMOD_1) : $(SMOD_1) $(IMOD_1) / $(GLBINC_ELE) $(UTLINC_ELE) $(COMINC_ELE) $(PKSINC_ELE) / $(SIIXINC_ELE) $(CCMINC_ELE) / $(ORAINC_ELE) $(SYSINC_ELE) @ $(SAY) "+--- make $(@) ---+" $(CC) $(CCOPT)$(LIS) / $(CCINC)$(INC) $(CCALLINC) $(CCOBJ)$(@) $(SMOD_1) @ $(SAY) "" $(OMOD_2): $(SMOD_2) $(IMOD_1) / $(GLBINC_ELE) $(UTLINC_ELE) $(COMINC_ELE) $(PKSINC_ELE) / $(SIIXINC_ELE) $(CCMINC_ELE) / $(ORAINC_ELE) $(SYSINC_ELE) @ $(SAY) "+--- make $(@) ---+" $(CC) $(CCOPT)$(LIS) / $(CCINC)$(INC) $(CCALLINC) $(CCOBJ)$(@) $(SMOD_2) @ $(SAY) "" $(OMOD_3): $(SMOD_3) $(IMOD_1) / $(GLBINC_ELE) $(UTLINC_ELE) $(COMINC_ELE) $(PKSINC_ELE) / $(SIIXINC_ELE) $(CCMINC_ELE) / $(ORAINC_ELE) $(SYSINC_ELE) @ $(SAY) "+--- make $(@) ---+" $(CC) $(CCOPT)$(LIS) / $(CCINC)$(INC) $(CCALLINC) $(CCOBJ)$(@) $(SMOD_3) @ $(SAY) "" #=============================================================================# # libraries # #=============================================================================# $(LMOD_1) : $(OMOD_1) @ $(SAY) "+--- make $(@) ---+" @ $(IF) $(FSN) $(LMOD_1) $(FSE) $(THEN) $(CL) $(LMOD_1) $(FI) $(ML) $(LMOD_1) $(OMOD_1) @ $(SAY) "" #=============================================================================# # binaries # #=============================================================================# $(BMOD_2) : $(OMOD_2) / $(MTLIB_ELE) $(COMLIB_ELE) $(CCMLIB_ELE) / $(ORALIB_ELE) $(SYSLIB_ELE) @ $(SAY) "+--- make $(@) ---+" $(OL) $(@) $(OMOD_2) $(LIBCOM) $(LIBUTL) $(LIBCCM) / $(LIBORA) $(LMOD_1) $(OLOPT) @ $(SAY) "" $(BMOD_3) : $(OMOD_3) / $(MTLIB_ELE) $(COMLIB_ELE) $(CCMLIB_ELE) / $(ORALIB_ELE) $(SYSLIB_ELE) @ $(SAY) "+--- make $(@) ---+" $(OL) $(@) $(OMOD_3) $(LIBCOM) / $(LIBUTL) $(LIBPKS) $(LIBCCM) $(LIBORA) $(LMOD_1) $(OLOPT) @ $(SAY) "" #=============================================================================# # export # #=============================================================================# export : / exportetc exportsrc exportinc exportobj exportlib exportbin exportmsc @ $(SAY) "$(@) done !" @ $(SAY) "" exportetc : @ $(IF)$(FSY)$(RUNETC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(RUNETC)"$(FI) @ $(IF)$(FSY)$(RUNETC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(RUNETC) $(FI) exportsrc : @ $(IF)$(FSY)$(RUNSRC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(RUNSRC)"$(FI) @ $(IF)$(FSY)$(RUNSRC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(RUNSRC) $(FI) exportinc : $(RUN_IMOD_1) @ $(IF)$(FSY)$(RUNINC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(RUNINC)"$(FI) @ $(IF)$(FSY)$(RUNINC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(RUNINC) $(FI) $(RUN_IMOD_1) : $(IMOD_1) $(CP) $(IMOD_1) $(RUN_IMOD_1) exportobj : @ $(IF)$(FSY)$(RUNOBJ)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(RUNOBJ)"$(FI) @ $(IF)$(FSY)$(RUNOBJ)*.*$(SM1)$(FSE)$(THEN) $(PU)$(RUNOBJ) $(FI) exportlib : $(RUN_LMOD_1) @ $(IF)$(FSY)$(RUNLIB)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(RUNLIB)"$(FI) @ $(IF)$(FSY)$(RUNLIB)*.*$(SM1)$(FSE)$(THEN) $(PU)$(RUNLIB) $(FI) $(RUN_LMOD_1) : $(LMOD_1) $(CP) $(LMOD_1) $(RUN_LMOD_1) exportbin : $(RUN_BMOD_2) $(RUN_BMOD_3) @ $(IF)$(FSY)$(RUNBIN)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(RUNBIN)"$(FI) @ $(IF)$(FSY)$(RUNBIN)*.*$(SM1)$(FSE)$(THEN) $(PU)$(RUNBIN) $(FI) $(RUN_BMOD_2) : $(BMOD_2) $(CP) $(BMOD_2) $(RUN_BMOD_2) $(RUN_BMOD_3) : $(BMOD_3) $(CP) $(BMOD_3) $(RUN_BMOD_3) exportmsc : @ $(IF)$(FSY)$(RUNMSC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(RUNMSC)"$(FI) @ $(IF)$(FSY)$(RUNMSC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(RUNMSC) $(FI) #=============================================================================# # delete old # #=============================================================================# delold : / deloldetc deloldsrc deloldinc deloldobj deloldlib deloldbin deloldmsc / deloldlis @ $(SAY) "$(@) done !" @ $(SAY) "" deloldetc : @ $(IF)$(FSY)$(ETC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(ETC)"$(FI) @ $(IF)$(FSY)$(ETC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(ETC) $(FI) deloldsrc : @ $(IF)$(FSY)$(SRC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(SRC)"$(FI) @ $(IF)$(FSY)$(SRC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(SRC) $(FI) deloldinc : @ $(IF)$(FSY)$(INC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(INC)"$(FI) @ $(IF)$(FSY)$(INC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(INC) $(FI) deloldobj : @ $(IF)$(FSY)$(OBJ)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(OBJ)"$(FI) @ $(IF)$(FSY)$(OBJ)*.*$(SM1)$(FSE)$(THEN) $(PU)$(OBJ) $(FI) deloldlib : @ $(IF)$(FSY)$(LIB)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(LIB)"$(FI) @ $(IF)$(FSY)$(LIB)*.*$(SM1)$(FSE)$(THEN) $(PU)$(LIB) $(FI) deloldbin : @ $(IF)$(FSY)$(BIN)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(BIN)"$(FI) @ $(IF)$(FSY)$(BIN)*.*$(SM1)$(FSE)$(THEN) $(PU)$(BIN) $(FI) deloldmsc : @ $(IF)$(FSY)$(MSC)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(MSC)"$(FI) @ $(IF)$(FSY)$(MSC)*.*$(SM1)$(FSE)$(THEN) $(PU)$(MSC) $(FI) deloldlis : @ $(IF)$(FSY)$(LIS)*.*$(SM1)$(FSE)$(THEN)$(SAY)"$(PU)$(LIS)"$(FI) @ $(IF)$(FSY)$(LIS)*.*$(SM1)$(FSE)$(THEN) $(PU)$(LIS) $(FI) #=============================================================================# # clean # #=============================================================================# clean : / cleanetc cleansrc cleaninc cleanobj cleanlib cleanbin cleanmsc / cleanlis @ $(SAY)"$(@) done !" @ $(SAY)"" cleanetc : @ $(CONTINUE) cleansrc : @ $(IF)$(FSY)$(SMOD_1) $(FSE)$(THEN)$(SAY)"$(RM)$(SMOD_1)$(SS)"$(FI) @ $(IF)$(FSY)$(SMOD_1) $(FSE)$(THEN) $(RM)$(SMOD_1)$(SS) $(FI) @ $(IF)$(FSY)$(SMOD_2) $(FSE)$(THEN)$(SAY)"$(RM)$(SMOD_2)$(SS)"$(FI) @ $(IF)$(FSY)$(SMOD_2) $(FSE)$(THEN) $(RM)$(SMOD_2)$(SS) $(FI) @ $(IF)$(FSY)$(SMOD_3) $(FSE)$(THEN)$(SAY)"$(RM)$(SMOD_3)$(SS)"$(FI) @ $(IF)$(FSY)$(SMOD_3) $(FSE)$(THEN) $(RM)$(SMOD_3)$(SS) $(FI) @ $(CONTINUE) cleaninc : @ $(CONTINUE) cleanobj : @ $(IF)$(FSY)$(OMOD_1) $(FSE)$(THEN)$(SAY)"$(RM)$(OMOD_1)$(SS)"$(FI) @ $(IF)$(FSY)$(OMOD_1) $(FSE)$(THEN) $(RM)$(OMOD_1)$(SS) $(FI) @ $(IF)$(FSY)$(OMOD_2) $(FSE)$(THEN)$(SAY)"$(RM)$(OMOD_2)$(SS)"$(FI) @ $(IF)$(FSY)$(OMOD_2) $(FSE)$(THEN) $(RM)$(OMOD_2)$(SS) $(FI) @ $(IF)$(FSY)$(OMOD_3) $(FSE)$(THEN)$(SAY)"$(RM)$(OMOD_3)$(SS)"$(FI) @ $(IF)$(FSY)$(OMOD_3) $(FSE)$(THEN) $(RM)$(OMOD_3)$(SS) $(FI) @ $(CONTINUE) cleanlib : @ $(IF)$(FSY)$(LMOD_1)$(FSE)$(THEN)$(SAY)"$(RM)$(LMOD_1)$(SS)"$(FI) @ $(IF)$(FSY)$(LMOD_1)$(FSE)$(THEN) $(RM)$(LMOD_1)$(SS) $(FI) @ $(CONTINUE) cleanbin : @ $(IF)$(FSY)$(BMOD_2)$(FSE)$(THEN)$(SAY)"$(RM)$(BMOD_2)$(SS)"$(FI) @ $(IF)$(FSY)$(BMOD_2)$(FSE)$(THEN) $(RM)$(BMOD_2)$(SS) $(FI) @ $(IF)$(FSY)$(BMOD_3)$(FSE)$(THEN)$(SAY)"$(RM)$(BMOD_3)$(SS)"$(FI) @ $(IF)$(FSY)$(BMOD_3)$(FSE)$(THEN) $(RM)$(BMOD_3)$(SS) $(FI) @ $(CONTINUE) cleanmsc : @ $(CONTINUE) cleanlis : @ $(CONTINUE) #=============================================================================# # Copyright (C) BS AG 1998. All Rights Reserved. Confidential # #=============================================================================# -------------------------------------------------------------------------------- shell编程例子 -- 一个.login例子 ***************************************************************** # * * # * or in FAR 52.227-19, as applicable. * # * * # ***************************************************************** # # # HISTORY # # @(#)$RCSfile: .login,v $ $Revision: 4.1.7.3 $ (DEC) $Date: 1995/10/25 20:03:52 $ # # if ($?path) then set path=($HOME/bin $path) else set path=($HOME/bin /usr/bin .) endif if ( ! ${?DT} ) then stty dec new tset -I -Q endif set mail=/usr/spool/mail/$USER -------------------------------------------------------------------------------- shell编程例子 -- 一个.cshrc例子 ***************************************************************** # * * # * * # ***************************************************************** # # HISTORY # # @(#)$RCSfile: .cshrc,v $ $Revision: 4.1.3.3 $ (DEC) $Date: 1992/05/11 09:13:09 $ # setenv MAIL /usr/spool/mail/$USER #****************************************************************************** #****************************************************************************** # # add by zzy 2000.08.06 # #****************************************************************************** #****************************************************************************** # set pics environment #****************************************************************************** #source /etc/pics.d/picsenv.csh #****************************************************************************** # set innovator environment #****************************************************************************** #source /usr/innovator/inoenv.csh #****************************************************************************** # set PCFC application environment #****************************************************************************** source ${HOME}/app_login #****************************************************************************** # change path to home path #****************************************************************************** cd ${HOME} #****************************************************************************** app_login: ========== #****************************************************************************** #* module: app_login #* description: app login #* This script must be called in the login file #* with the command 'source app_login' #* author: zzy #* version: 31.08.1998 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = "echo" set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # this path and this script #****************************************************************************** set this_path1 = "`dirname ${HOME}/x`" set this_script1 = "app_login" if ( ! -f ${this_path1}/${this_script1} ) then $say 'this script must be in the directory $HOME' goto exit endif #****************************************************************************** # start message #****************************************************************************** $say " %$this_script1, `date '+%H:%M:%S'` start executing on $node" #****************************************************************************** # set project and channel prefix for all user #****************************************************************************** if ( "$user" == "root" ) then setenv PROJ pcfc setenv CPRE "" endif if ( "$user" == "pcfc" ) then setenv PROJ pcfc setenv CPRE "" endif if ( "$user" == "picsadm" ) then setenv PROJ baoshan setenv CPRE "" endif if ( "$user" == "picsvis" ) then setenv PROJ baoshan setenv CPRE "" endif if ( "$user" == "" ) then setenv PROJ pcfc setenv CPRE "" endif #****************************************************************************** # set project directory #****************************************************************************** setenv PROJ_DIR /home/$PROJ #****************************************************************************** # call project application login #****************************************************************************** if ( -f "${this_path1}/${this_script1}_$PROJ" ) then $say " %$this_script1, call project application login" source ${this_path1}/${this_script1}_$PROJ endif #****************************************************************************** # end message #****************************************************************************** #$say " %$this_script1, `date '+%H:%M:%S'` finished" #****************************************************************************** # exit #****************************************************************************** exit: unset this_path1 unset this_script1 exit #****************************************************************************** app_login_pcfc ============== #****************************************************************************** #* module: application_login_$PROJ #* description: application login for a project #* This script must be called in the login file app_login #* with the command 'source app_login_$PROJ' #* author: Zhou zeyan #* #* version: 8.1.2000 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = "echo" set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # this path and this script #****************************************************************************** set this_path2 = "`dirname ${HOME}/x`" set this_script2 = "app_login_$PROJ" #****************************************************************************** # start message #****************************************************************************** $say " %$this_script2, `date '+%H:%M:%S'` start executing on $node" #****************************************************************************** # history #****************************************************************************** set history=40 alias h history #****************************************************************************** # aliases #****************************************************************************** alias sql sqlplus pcfcadm/pcfcadm #****************************************************************************** # set environment for components #****************************************************************************** set cmp = glb if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = utl if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = com if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = log if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = tel if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = mva if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = mtr if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = mm if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = de if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = se if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = comtcp if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif set cmp = sdd if ( -r "${PROJ_DIR}/${cmp}/etc/${cmp}_init" ) then source ${PROJ_DIR}/${cmp}/etc/${cmp}_init endif unset cmp #****************************************************************************** # set environment for project #****************************************************************************** if ( -r "${PROJ_DIR}/login/login" ) then source ${PROJ_DIR}/login/login endif #****************************************************************************** # end message #****************************************************************************** #$say " %$this_script2, `date '+%H:%M:%S'` finished" #****************************************************************************** # unset #****************************************************************************** exit: unset this_path2 unset this_script2 exit #****************************************************************************** login ======== #****************************************************************************** #* module: login #* description: project login definitions #* author: Zhou zeyan #* version: 31.08.2000 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = echo set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # pathes #****************************************************************************** set path_project_login = "${PROJ_DIR}/login" set path_project_com = "${path_project_login}/com" #****************************************************************************** # definitions make #****************************************************************************** if ( -r "${path_project_com}/def_make" ) then source ${path_project_com}/def_make endif #****************************************************************************** # definitions path #****************************************************************************** if ( -r "${path_project_com}/def_path" ) then source ${path_project_com}/def_path endif #****************************************************************************** # definitions unix commands #****************************************************************************** if ( -r "${path_project_com}/def_unix" ) then source ${path_project_com}/def_unix endif #****************************************************************************** # definitions user commands #****************************************************************************** if ( -r "${path_project_com}/def_user" ) then source ${path_project_com}/def_user endif #****************************************************************************** # welcome #****************************************************************************** if ( -r "${path_project_com}/welcome" ) then source ${path_project_com}/welcome endif #****************************************************************************** # exit #****************************************************************************** unset path_project_login unset path_project_com exit #****************************************************************************** def_unix ======== #****************************************************************************** #* module: def_user #* description: user command settings #* author: Zhou zeyan #* version: 31.08.2000 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = "echo" set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # pathes #****************************************************************************** set path_project_com1 = "${PROJ_DIR}/login/com" set path_project_com2 = "${path_project_com1}/com" #****************************************************************************** # user command settings #****************************************************************************** alias cdproj "cd ${PROJ_DIR}" alias cdmkf "cd ${PROJ_DIR}/mkf" alias cdglb "cd ${PROJ_DIR}/glb" alias cdutl "cd ${PROJ_DIR}/utl" alias cdcom "cd ${PROJ_DIR}/com" alias cdlog "cd ${PROJ_DIR}/log" alias cdtel "cd ${PROJ_DIR}/tel" alias cdtools "cd ${PROJ_DIR}/tools" alias cdcomtcp "cd ${PROJ_DIR}/comtcp" alias cdexport "cd ${PROJ_DIR}/export" alias cdoracle "cd ${PROJ_DIR}/oracle" alias cdsystem "cd ${PROJ_DIR}/system" alias cds "cd /home/zzy/system" alias cdbuild "cd ${PROJ_DIR}/oracle/build" alias cdzzy "cd /home/zzy" # make environments alias mkglb "make -f ${PROJ_DIR}/glb/work/etc/glb.mkf" alias mkutl "make -f ${PROJ_DIR}/utl/work/etc/utl.mkf" alias mkcomtcp "make -f ${PROJ_DIR}/comtcp/work/etc/comtcp.mkf" alias mkuserlib "make -f ${PROJ_DIR}/userlib/userlib.mkf" #****************************************************************************** # exit #****************************************************************************** unset path_project_com1 unset path_project_com2 exit #****************************************************************************** def_make ============ #****************************************************************************** #* Copyright (C) BS P4 2000. All Rights Reserved. Confidental * #****************************************************************************** #****************************************************************************** #* module: def_make #* description: make settings #* author: Zhou zeyan #* version: 31.08.2000 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = "echo" set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # pathes #****************************************************************************** set path_project_com1 = "${PROJ_DIR}/login/com" set path_project_com2 = "${path_project_com1}/com" #****************************************************************************** # make settings #****************************************************************************** # Add setenv debug=1 by zzy 2000-08-07 setenv debug 1 setenv OS unix setenv OSVERS setenv GLOBAL_MKF_HOME ${PROJ_DIR}/mkf/ #****************************************************************************** # exit #****************************************************************************** unset path_project_com1 unset path_project_com2 exit #****************************************************************************** #* Copyright (C) BS P4 2000. All Rights Reserved. Confidental * #****************************************************************************** def_path ============ #****************************************************************************** #* Copyright (C) BS P4 2000. All Rights Reserved. Confidental * #****************************************************************************** #****************************************************************************** #* module: def_path #* description: path settings #* author: Zhou zeyan #* version: 31.08.2000 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = "echo" set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # path settings #****************************************************************************** if ($?path) then set path=($HOME/userlib $path) else set path=($HOME/bin /usr/bin .) endif #****************************************************************************** # exit #****************************************************************************** exit #****************************************************************************** #* Copyright (C) BS P4 2000. All Rights Reserved. Confidental * #****************************************************************************** def_user ============ #****************************************************************************** #* Copyright (C) BS P4 2000. All Rights Reserved. Confidental * #****************************************************************************** #****************************************************************************** #* module: def_user #* description: user command settings #* author: Zhou zeyan #* version: 31.08.2000 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = "echo" set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # pathes #****************************************************************************** set path_project_com1 = "${PROJ_DIR}/login/com" set path_project_com2 = "${path_project_com1}/com" #****************************************************************************** # user command settings #****************************************************************************** alias cdproj "cd ${PROJ_DIR}" alias cdmkf "cd ${PROJ_DIR}/mkf" alias cdglb "cd ${PROJ_DIR}/glb" alias cdutl "cd ${PROJ_DIR}/utl" alias cdcom "cd ${PROJ_DIR}/com" alias cdlog "cd ${PROJ_DIR}/log" alias cdtel "cd ${PROJ_DIR}/tel" alias cdtools "cd ${PROJ_DIR}/tools" alias cdcomtcp "cd ${PROJ_DIR}/comtcp" alias cdexport "cd ${PROJ_DIR}/export" alias cdoracle "cd ${PROJ_DIR}/oracle" alias cdsystem "cd ${PROJ_DIR}/system" alias cds "cd /home/zzy/system" alias cdbuild "cd ${PROJ_DIR}/oracle/build" alias cdzzy "cd /home/zzy" # make environments alias mkglb "make -f ${PROJ_DIR}/glb/work/etc/glb.mkf" alias mkutl "make -f ${PROJ_DIR}/utl/work/etc/utl.mkf" alias mkcomtcp "make -f ${PROJ_DIR}/comtcp/work/etc/comtcp.mkf" alias mkuserlib "make -f ${PROJ_DIR}/userlib/userlib.mkf" #****************************************************************************** # exit #****************************************************************************** unset path_project_com1 unset path_project_com2 exit #****************************************************************************** #* Copyright (C) BS P4 2000. All Rights Reserved. Confidental * #****************************************************************************** welcome ========== #****************************************************************************** #* Copyright (C) BS 2000. All Rights Reserved. Confidental * #****************************************************************************** #****************************************************************************** #* module: welcome #* description: welcome #* author: Zhou zeyan #* version: 31.08.2000 #****************************************************************************** #****************************************************************************** # entry #****************************************************************************** #****************************************************************************** # environment #****************************************************************************** set say = "echo" set mode = "" set node = "`uname -n`" set user = "`logname`" #****************************************************************************** # pathes #****************************************************************************** set path_project_com1 = "${PROJ_DIR}/login/com" set path_project_com2 = "${path_project_com1}/com" #********************************************************************** # welcome #********************************************************************** set text6=" user: $user " set text7=" node: $node " echo "" echo "=======================================================================" echo "" echo " +-----------------------------------------------------+" echo " | |" echo " | ###### ####### ####### ####### |" echo " | # # # # # |" echo " | # # # # # |" echo " | ###### # ####### # |" echo " | # # # # |" echo " | # # # # |" echo " | # ####### # ####### |" echo " | |" echo " +-----------------------------------------------------+" echo "" echo "=======================================================================" echo " B S" echo "=======================================================================" echo "$text6" echo "" echo "$text7" echo "=======================================================================" echo "" unset text6 unset text7 #********************************************************************** # exit #********************************************************************** unset path_project_com1 unset path_project_com2 exit #********************************************************************** #* Copyright (C) BS 2000. All Rights Reserved. Confidental * #********************************************************************** -------------------------------------------------------------------------------- 相关文章 shell编程例子 -- 一个简单的目录菜单 until echo List Directory..........1 echo Change Directory........2 echo Edit File...............3 echo Remove File.............4 echo Exit Menu...............5 read choice test $choice = 5 do case $choice in 1) ls;; 2) echo Enter target directory read dir cd $dir ;; 3) echo Enter file name read file vi $file ;; 4) echo Enter file name read file rm $file ;; q|Q|5) echo Goodbye;; *) echo illegal Option esac -------------------------------------------------------------------------------- Shell源码:用命令find产生一个以当日日期为后缀的文件 file=`date '+%m%d'` | touch todayis.$file 或者做一个shell脚本: #!/usr/bin/sh file=`date '+%M%d'` touch todayis.$file exit 0 注意定义file变量中的“`”不是“ '”,而是左上角数字键1傍边那个(左单引号)。 Shell源码:find查找日期为某一天的文件 本文出自:news://news.freesoft.cei.gov.cn/chinese.com.linux 作者: 宫敏 (2001-08-24 12:00:00) A=`find ~ -print` | ls -l --full-time $A 2>/dev/null | grep "Jun 27" | grep 1998 Linux的命令很厉害的呀! 给你写了下面这个script,用着方便点儿。你把它存成一个随便什么名字的文件,置上x属性就行了。 #!/bin/sh # Copyright by Ming Gong(宫敏) for news://news.freesoft.cei.gov.cn/chinese.com.linux # GPL V2, Jun 30, 1998 # The right of usage, distribution and modification is here by granted by the author. # The author deny any responsibilities and liabilities related to the code. # OK=0 A=`find $1 -print` if expr $3 == 1 >/dev/null ; then M=Jan ; OK=1 ; fi if expr $3 == 2 >/dev/null ; then M=Feb ; OK=1 ; fi if expr $3 == 3 >/dev/null ; then M=Mar ; OK=1 ; fi if expr $3 == 4 >/dev/null ; then M=Apr ; OK=1 ; fi if expr $3 == 5 >/dev/null ; then M=May ; OK=1 ; fi if expr $3 == 6 >/dev/null ; then M=Jun ; OK=1 ; fi if expr $3 == 7 >/dev/null ; then M=Jul ; OK=1 ; fi if expr $3 == 8 >/dev/null ; then M=Aug ; OK=1 ; fi if expr $3 == 9 >/dev/null ; then M=Sep ; OK=1 ; fi if expr $3 == 10 >/dev/null ; then M=Oct ; OK=1 ; fi if expr $3 == 11 >/dev/null ; then M=Nov ; OK=1 ; fi if expr $3 == 12 >/dev/null ; then M=Dec ; OK=1 ; fi if expr $3 == 1 >/dev/null ; then M=Jan ; OK=1 ; fi if expr $OK == 1 > /dev/null ; then ls -l --full-time $A 2>/dev/null | grep "$M $4" | grep $2 ; else echo Usage: $0 path Year Month Day; echo Example: $0 ~ 1998 6 30; fi Bourne Shell及shell编程 Bourne Shell 介绍:Bourne Shell 基础及其他很多有用的特性,shell编程及组织。 主要内容: .shell基础 基本介绍,环境,选项,特殊字符 .shell变量 用户定义变量,环境变量,位置变量(shell 参数) .shell script编程条件测试,循环及重复控制 .shell定制 1.shell基础知识作者:Stephen Bourne 在Bell实验室开发建议:man sh 查看相关UNIX上的改进或特性 (1)shell提示符及其环境 /etc/passwd文件提示符:$ /etc/profile $HOME/.profile (2)shell执行选项 -n 测试shell script语法结构,只读取shell script但不执行 -x 进入跟踪方式,显示所执行的每一条命令,用于调度 -a Tag all variables for export -c "string" 从strings中读取命令 -e 非交互方式 -f 关闭shell文件名产生功能 -h locate and remember functions as defind -i 交互方式 -k 从环境变量中读取命令的参数 -r 限制方式 -s 从标准输入读取命令 -t 执行命令后退出(shell exits) -u 在替换中如使用未定义变量为错误 -v verbose,显示shell输入行 这些选项可以联合使用,但有些显然相互冲突,如-e和-i. (3)受限制shell(Restircted Shell) sh -r 或 /bin/rsh 不能执行如下操作:cd, 更改PATH,指定全路径名,输出重定向,因此可以提供一个较好的控制和安全机制。通常rsh用于应用型用户及拨号用户,这些用户通常是看不到提示符的。通常受限制用户的主目录是不可写的。 不足:如果用户可以调用sh,则rsh的限制将不在起作用,事实上如果用户在vi及more 程序中调用shell,而这时rsh的限制将不再起作用。 (4)用set改变 shell选项用户可以在$提示符下用set命令来设置或取消shell的选项。使用-设置选项,+取消相应选项,大多数UNIX系统允许a,e,f,h,k,n,u,v和x的开关设置/取消。 set -xv 启动跟踪方式;显示所有的命令及替换,同样显示输入。 set -tu 关闭在替换时对未定义变量的检查。 使用echo $-显示所有已设置的shell选项。 (5)用户启动文件 .profile PATH=$PATH:/usr/loacl/bin; export PATH (6)shell环境变量 CDPATH 用于cd命令的查找路径 HOME /etc/passwd文件中列出的用户主目录 IFS Internal Field Separator,默认为空格,tab及换行符 MAIL /var/mail/$USERNAME mail等程序使用 PATH PS1,PS2 默认提示符($)及换行提示符(> ) TERM 终端类型,常用的有vt100,ansi,vt200,xterm等 示例:$PS1="test:";export PS1 test: PS1="$";export PS1 $echo $MAIL /var/mail/username (7)保留字符及其含义 $ shell变量名的开始,如$var | 管道,将标准输出转到下一个命令的标准输入 # 注释开始 & 在后台执行一个进程? 匹配一个字符 * 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.) $- 使用set及执行时传递给shell的标志位 $! 最后一个子进程的进程号 $# 传递给shell script的参数个数 $* 传递给shell script的参数 $@ 所有参数,个别的用双引号括起来 $? 上一个命令的返回代码 $0 当前shell的名字 $n (n:1-) 位置参数 $$ 进程标识号(Process Identifier Number, PID) >file 输出重定向 `command` 命令替换,如 filename=`basename /usr/local/bin/tcsh` >>fiile 输出重定向,append 转义符及单引号: $echo "$HOME $PATH" /home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin: $echo '$HOME $PATH' $HOME $PATH $echo $HOME $PATH $HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbwork/bin 其他: $dir=ls $$dir $alias dir ls $dir ls > filelist ls >> filelist wc -l < filelist wc -l filelist sleep 5; echo 5 seconds reaches; ls -l ps ax |egrep inetd find / -name core -exec rm {} ; & filename=`date "+%Y%m%d"`.log 2. shell变量变量:代表某些值的符号,如$HOME,cd命令查找$HOME,在计算机语言中可以使用变量可以进行多种运算和控制。 Bourne Shell有如下四种变量: .用户自定义变量 .位置变量即 shell script之参数 .预定义变量(特殊变量) .环境变量(参考shell定制部分) (1)用户自定义变量(数据的存储) $ COUNT=1 $ NAME="He Binwu" 技巧:因为大部分UNIX命令使用小写字符,因此在shell编程中通常使用全大写变量,当然这并不是强制性的,但使用大写字符可以在编程中方便地识别变量。 变量的调用:在变量前加$ $ echo $HOME /home/hbwork $ WEEK=Satur $ echo Today is $WEEKday Today is $echo Today is ${WEEK}day Today is Saturday Shell变量赋值从右从左进行(Linux Shell/bash从左向右赋值!) $ X=$Y Y=y $ echo $X y $ Z=z Y=$Z $ echo $Y $ 使用unset命令删除变量的赋值 $ Z=hello $ echo $Z hello $ unset Z $ echo $Z $ 有条件的命令替换在Bourne Shell中可以使变量替换在特定条件下执行,即有条件的环境变量替换。这种变量替换总是用大括号括起来的。 .设置变量的默认值在变量未赋值之前其值为空。Bourne Shell允许对变量设置默认值,其格式如下: ${variable:-defaultvalue} 例: $ echo Hello $UNAME Hello $ echo Hello ${UNAME:-there} Hello there $ echo $UNAME #变量值并未发生变化 $ UNAME=hbwork $ echo Hello ${UNAME:-there} Hello hbwork $ .另一种情况:改变变量的值,格式如下: ${variable:=value} 例: $ echo Hello $UNAME Hello $ echo Hello ${UNAME:=there} Hello there $ echo $UNAME #变量值并未发生变化 there $ .变量替换中使用命令替换 $USERDIR=${$MYDIR:-`pwd`} .在变量已赋值时进行替换 ${variable:+value} .带有错误检查的有条件变量替换 ${variable:?value} 例: $ UNAME= $ echo ${UNAME:?"UNAME has not been set"} UNAME: UNAME has not been set $ echo ${UNAME:?} UNAME: parameter null or not set (2)位置变量(Shell参数) 在shell script中位置参数可用$1..$9表示,$0表示内容通常为当前执行程序的文件名。 .防止变量值被替换 readonly variable .使用export命令输出变量,使得变量对子shell可用,当shell执行一下程序时,shell 将为其设置一个新的环境让其执行,这称之了subshell. 在Bourne Shell中变量通常被认为是本地变量,也就是说在对其赋值之外的shell环境之外是不认识此变量的。使用export对subshell可用。 例:对变量PS1的export操作,shell的提示符将发生变化。 $ PS1=`hostname`$ peony$sh $ echo $PS1 $ <-输出结果 $ exit peony$export PS1 peony$sh peony$ echo $PS1 peony$ <-输出结果 peony$ 3.Shell Script编程目的:使用UNIX所提供的最常用工具来完成所需复杂任务的强大功能。 (1)最简单的Shell 编程 $ls -R / |grep myname |more 每天数据的备份: $ cd /usr/yourname; ls * |cpio -o > /dev/rmt/0h 书写程序的目的是一次编程,多次使用(执行)! $ cat > backup.sh cd /home/hbwork ls * | cpio -o > /dev/rmt/0h ^D 执行: $ sh backup.sh 或: $ chmod +x backup.sh $ ./backup.sh 技巧:在shell script中加入必要的注释,以便以后阅读及维护。 (2)shell是一个(编程)语言同传统的编程语言一样,shell提供了很多特性,这些特性可以使你的shell script 编程更为有用,如:数据变量、参数传递、判断、流程控制、数据输入和输出,子程序及以中断处理等。 . 在shell编程中使用数据变量可以将程序变量更为通用,如在上面backup.sh中: cd $WORKDIR ls * | cpio -o > /dev/rmt/0h . Shell编程中的注释以#开头 . 对shell变量进行数字运算,使用expr命令 expr integer operator integer 其中operator为+ - * / %, 但对*的使用要用转义符,如: $expr 4 * 5 20 $int=`expr 5 + 7` $echo $int 12 (3)Shell编程的参数传递, 可通过命令行参数以及交互式输入变量(read) restoreall.sh 对backup.sh程序的备份磁带进行恢复 $cat > restoreall.sh cd $WORKDIR cpio -i < /dev/rmt/0h ^D restore1.sh:只能恢复一个文件 #restore1 --program to restore a single file cd $WORKDIR cpio -i $i < /dev/rmt/0h $restore1 file1 恢复多个文件restoreany : #restoreany --program to restore a single file cd $WORKDIR cpio -i $* < /dev/rmt/0h $ restoreany file1 file2 file3 (4)条件判断 . if-then语句,格式如下: if command_1 then command_2 command_3 fi command_4 在if-then语句中使用了命令返回码$?,即当command_1执行成功时才执行command_2和 command_3,而command_4总是执行. 示例程序unload: 在备份成功时删除原始文件,带有错误检查 cd $1 #备份时未考虑不成功的情况! ls -a | cpio -o > /dev/rmt/0h rm -rf * 改进如下: #当使用了管道命令时,管理命令的返回代码为最后一个命令的返回代码 if ls -a | cpio -o > /dev/rmt/0h then rm -rf * fi . if-then-else语句 if command_1 then command_2 else command_3 fi 技巧: 由于shell对命令中的多余的空格不作任何处理,一个好的程序员会用这一特性对自己的程序采用统一的缩进格式,以增强自己程序的可读性. . 使用test命令进行进行条件测试格式: test conditions test在以下四种情况下使用: a. 字符比较 b.两个整数值的比较 c. 文件操作,如文件是否存在及文件的状态等 d. 逻辑操作,可以进行and/or,与其他条件联合使用 a. 测试字符数据: shell变量通常民政部下均作为字符变量 str1 = str2 二者相长,相同 str1 != str2 不同 -n string string不为空(长度不为零) -z string string为空 string string不为空 例: $ str1=abcd #在含有空格时必须用引号括起来 $ test $str1=abcd $ echo $? 0 $ str1="abcd " $ test $str1=abcd $ echo $? 1 Note: 在test处理含有空格的变量时最好用引号将变量括起来,否则会出现错误的结果, 因为shell在处理命令行时将会去掉多余的空格,而用引号括起来则可以防止 shell去掉这些空格. 例: $ str1=" " $ test $str1 $ echo $? 1 $ test "$str1" $ echo $? 0 $ test -n $str1 test: argument expected $ test -n "$str1" $ echo $? 0 $ b. 整数测试: test与expr相同,可以将字符型变量转换为整数进行操作,expr进行整数的算术运算,而test则进行逻辑运算. 表达式 说明 --------------------------------------- int1 -eq int2 相等? int1 -ne int2 不等? int1 -gt int2 int1 > int2 ? int1 -ge int2 int1 >= int2 ? int1 -lt int2 int1 < int2 ? int1 -le int2 int1 <= int2 ? 例: $ int1=1234 $ int2=01234 $ test $int1 -eq $int2 $ echo $? 0 c. 文件测试:检查文件状态如存在及读写权限等 -r filename 用户对文件filename有读权限? -w filename 用户对文件filename有写权限? -x filename 用户对文件filename有可执行权限? -f filename 文件filename为普通文件? -d filename 文件filename为目录? -c filename 文件filename为字符设备文件? -b filename 文件filename为块设备文件? -s filename 文件filename大小不为零? -t fnumb 与文件描述符fnumb(默认值为1)相关的设备是一个终端设备? d. 测试条件之否定,使用! 例: $ cat /dev/null > empty $ test -r empty $ echo $? 0 $ test -s empty 1 $ test ! -s empty $ echo $? 0 e. 测试条件之逻辑运算 -a And -o Or 例: $ test -r empty -a -s empty $ echo $? 1 f. 进行test测试的标准方法因为test命令在 shell编程中占有很重要的地位,为了使shell能同其他编程语言一样便于阅读和组织, Bourne Shell在使用test测试时使用了另一种方法:用方括号将整个 test测试括起来: $ int1=4 $ [ $int1 -gt 2 ] $ echo $? 0 例: 重写unload程序,使用test测试 #!/bin/sh #unload - program to backup and remove files #syntax: unload directory #check arguments if [ $# -ne 1 ] then echo "usage: $0 directory" exit 1 fi #check for valid directory name if [ ! -d "$1" ] then echo "$1 is not a directory" exit 2 fi cd $1 ls -a | cpio -o > /dev/rmt/0h if [ $? -eq 0 ] then rm -rf * else echo "A problem has occured in creating backup" echo "The directory will not be ereased" echo "Please check the backup device" exit 3 fi # end of unload 在如上示例中出现了exit, exit有两个作用:一是停止程序中其他命令的执行,二是设置程序的退出状态 g. if嵌套及elif结构 if command then command else if command then command else if command then command fi fi fi 改进:使用elif结构 if command then command elif command then command elif command then command fi elif结构同if结构类似,但结构更清淅,其执行结果完全相同. h.交互式从键盘读入数据使用read语句,其格式如下: read var1 var2 ... varn read将不作变量替换,但会删除多余的空格,直到遇到第一个换行符(回车),并将输入值依次赋值给相应的变量。 例: $ read var1 var2 var3 Hello my friends $ echo $var1 $var2 $var3 Hello my friends $ echo $var1 Hello $ read var1 var2 var3 Hello my dear friends $ echo $var3 dear friends <-输入多余变量时,输入值余下的内容赋给最后一个变量 $ read var1 var2 var3 Hello friends $ echo $var3 <- var3为空 $ 在shell script中可使用read语句进行交互操作: ... #echo -n message 输出结果后不换行 echo -n "Do you want to continue: Y or N" read ANSWER if [ $ANSWER=N -o $ANSWER=n ] then exit fi i. case结构:结构较elif-then结构更清楚 比较if-then语句: if [ variable1 = value1 ] then command command elif [ variable1 = value2 ] then command command elif [ variable1 = value3 ] then command command fi 相应的case结构: case value in pattern1) command command;; pattern2) command command;; ... patternn) command; esac * case语句只执行第一个匹配模式 例:使用case语句建立一个菜单选择shell script #Display a menu echo _ echo "1 Restore" echo "2 Backup" echo "3 Unload" echo #Read and excute the user's selection echo -n "Enter Choice:" read CHOICE case "$CHOICE" in 1) echo "Restore";; 2) echo "Backup";; 3) echo "Unload";; *) echo "Sorry $CHOICE is not a valid choice exit 1 esac 在上例中,*指默认匹配动作。此外,case模式中也可以使用逻辑操作,如下所示: pattern1 | pattern2 ) command command ;; 这样可以将上面示例程序中允许用户输入数字或每一个大写字母。 case "$CHOICE" in 1|R) echo "Restore";; 2|B) echo "Backup";; 3|U) echo "Unload";; *) echo "Sorry $CHOICE is not a valid choice exit 1 esac (5)循环控制 <1> while循环: 格式: while command do command command command ... done 例: 计算1到5的平方 #!/bin/sh # #Filename: square.sh int=1 while [ $int -le 5 ] do sq=`expr $int * $int` echo $sq int=`expr $int + 1` done echo "Job completed" $ sh square.sh 1 4 9 16 25 Job completed <2> until循环结构:格式: until command do command command .... command done 示例:使用until结构计算1-5的平方 #!/bin/sh int=1 until [ $int -gt 5 ] do sq=`expr $int * $int` echo $sq int=`expr $int + 1` done echo "Job completed" <3> 使用shift对不定长的参数进行处理在以上的示例中我们总是假设命令行参数唯一或其个数固定,或者使用$*将整个命令行参数传递给shell script进行处理。对于参数个数不固定并且希望对每个命令参数进行单独处理时则需要shift命令。使用shift可以将命令行位置参数依次移动位置,即$2->$1, $3->$2. 在移位之前的第一个位置参数$1在移位后将不在存在。 示例如下: #!/bin/sh # #Filename: shifter until [ $# -eq 0 ] do echo "Argument is $1 and `expr $# - 1` argument(s) remain" shift done $ shifter 1 2 3 4 Argument is 1 and 3 argument(s) remain Argument is 2 and 2 argument(s) remain Argument is 3 and 1 argument(s) remain Argument is 4 and 0 argument(s) remain $ 使用shift时,每进行一次移位,$#减1,使用这一特性可以用until循环对每个参数进行处理,如下示例中是一个求整数和的shell script: #!/bin/sh # sumints - a program to sum a series of integers # if [ $# -eq 0 ] then echo "Usage: sumints integer list" exit 1 fi sum=0 until [ $# -eq 0 ] do sum=`expr $sum + $1` shift done echo $sum $ sh sumints 324 34 34 12 34 438 $ 使用shift的另一个原因是Bourne Shell的位置参数变量为$1~$9, 因此通过位置变量只能访问前9个参数。但这并不等于在命令行上最多只能输入9个参数。此时如果想访问前9个参数之后的参数,就必须使用shift. 另外shift后可加整数进行一次多个移位,如: shift 3 <4>. for循环格式: for var in arg1 arg2 ... argn do command .... command done 示例: $ for letter in a b c d e; do echo $letter;done a b c d e 对当前目录下的所有文件操作: $ for i in * do if [ -f $i ] then echo "$i is a file" elif [ -d $i ] echo "$i is a directory" fi done 求命令行上所有整数之和: #!/bin/sh sum=0 for INT in $* do sum=`expr $sum + $INT` done echo $sum <6> 从循环中退出: break和continue命令 break 立即退出循环 continue 忽略本循环中的其他命令,继续下一下循环 在shell编程中有时我们要用到进行无限循环的技巧,也就是说这种循环一直执行碰到break或continue命令。这种无限循环通常是使用true或false命令开始的。UNIX 系统中的true总是返加0值,而false则返回非零值。如下所示: #一直执行到程序执行了break或用户强行中断时才结束循环 while true do command .... command done 上面所示的循环也可以使用until false, 如下: until false do command .... command done 在如下shell script中同时使用了continue,break以及case语句中的正规表达式用法: #!/bin/sh # Interactive program to restore, backup, or unload # a directory echo "Welcome to the menu driven Archive program" while true do # Display a Menu echo echo "Make a Choice from the Menu below" echo _ echo "1 Restore Archive" echo "2 Backup directory" echo "3 Unload directory" echo "4 Quit" echo # Read the user's selection echo -n "Enter Choice: " read CHOICE case $CHOICE in [1-3] ) echo # Read and validate the name of the directory echo -n "What directory do you want? " read WORKDIR if [ ! -d "$WORKDIR" ] then echo "Sorry, $WORKDIR is not a directory" continue fi # Make the directory the current working directory cd $WORKDIR;; 4) :;; # :为空语句,不执行任何动作 *) echo "Sorry, $CHOICE is not a valid choice" continue esac case "$CHOICE" in 1) echo "Restoring..." cpio -i 2) echo "Archiving..." ls | cpio -o >/dev/rmt/0h;; 3) echo "Unloading..." ls | cpio -o >/dev/rmt/0h;; 4) echo "Quitting" break;; esac #Check for cpio errors if [ $? -ne 0 ] then echo "A problem has occurred during the process" if [ $CHOICE = 3 ] then echo "The directory will not be erased" fi echo "Please check the device and try again" continue else if [ $CHOICE = 3 ] then rm * fi fi done (6)结构化编程:定义函数同其他高级语言一样,shell也提供了函数功能。函数通常也称之为子过程(subroutine), 其定义格式如下: funcname() { command ... command; #分号 } 定义函数之后,可以在shell中对此函数进行调用,使用函数定义可以将一个复杂的程序分为多个可管理的程序段,如下所示: # start program setup () { command list ; } do_data () { command list ; } cleanup () { command list ; } errors () { command list ; } setup do_data cleanup # end program 技巧: . 在对函数命名时最好能使用有含义的名字,即函数名能够比较准确的描述函数所完成的任务。 . 为了程序的维护方便,请尽可能使用注释 使用函数的另一个好处就是可以在一个程序中的不同地方执行相同的命令序列(函数), 如下所示: iscontinue() { while true do echo -n "Continue?(Y/N)" read ANSWER case $ANSWER in [Yy]) return 0;; [Nn]) return 1;; *) echo "Answer Y or N";; esac done } 这样可以在shell编程中调用iscontinue确定是否继续执行: if iscontinue then continue else break fi ** shell函数与shell程序非常相似,但二者有一个非常重要的差别:shell程序是由子shell 执行的,而shell函数则是作为当前shell的一部分被执行的,因此在当前shell中可以改变函数的定义。此外在任意shell(包括交互式的shell)中均可定义函数,如: $ dir dir: not found $ dir () { ls -l ;} $ dir total 5875 -rw-r--r-- 1 hbwork 100 Nov 10 23:16 doc -rw-r--r-- 1 hbwork 2973806 Nov 10 23:47 ns40docs.zip -rw-r--r-- 1 hbwork 1715011 Nov 10 23:30 ns840usr.pdf -rw-r--r-- 1 hbwork 1273409 Sep 23 1998 radsol21b6.tar.Z -rw-r--r-- 1 hbwork 7526 Nov 10 23:47 wget-log -rw-r--r-- 1 hbwork 1748 Nov 13 21:51 wget-log.1 $ unset dir $ dir () { > echo "Permission Link Owner Group File_SZ LastAccess FileName" > echo "-----------------------------------------------------------" > ls -l $*; > } $ dir Permission Link Owner Group File_SZ LastAccess FileName ----------------------------------------------------------- total 5875 -rw-r--r-- 1 hbwork 100 Nov 10 23:16 doc -rw-r--r-- 1 hbwork 2973806 Nov 10 23:47 ns40docs.zip -rw-r--r-- 1 hbwork 1715011 Nov 10 23:30 ns840usr.pdf -rw-r--r-- 1 hbwork 1273409 Sep 23 1998 radsol21b6.tar.Z -rw-r--r-- 1 hbwork 7526 Nov 10 23:47 wget-log -rw-r--r-- 1 hbwork 1748 Nov 13 21:51 wget-log.1 通常情况下,shell script是在子shell中执行的,困此在此子shell中对变量所作的修改对父shell不起作用。点(.) 命令使用shell在不创建子shell而由当前shell读取并执行一个shell script, 可以通过这种方式来定义函数及变量。此外点(.)命令最常用的功能就是通过读取.profile来重新配置初始化login变量。如下所示: $ . .profile (csh相对于.命令的是source命令). (7)使用And/Or结构进行有条件的命令执行 <1> And , 仅当第一个命令成功时才有执行后一个命令,如同在逻辑与表达式中如果前面的结果为真时才有必要继续运算,否则结果肯定为假。 格式如下: command1 && command2 例:rm $TEMPDIR/* && echo "File successfully removed" 等价于 if rm $TEMPDIR/* then echo "File successfully removed" fi <2>Or, 与AND相反,仅当前一个命令执行出错时才执行后一条命令 例: rm $TEMPDIR/* || echo "File not removed" 等价与: if rm $TEMPDIR/* then command else echo "File not removed" fi <3> 混合命令条件执行 command1 && command2 && command3 当command1, command2成功时才执行command3 command1 && command2 || comamnd3 仅当command1成功,command2失败时才执行command3 当然可以根据自己的需要进行多种条件命令的组合,在此不多讲述。 (8) 使用getopts命令读取unix格式选项 UNIX格式选项指如下格式的命令行参数: command -options parameters 使用格式: getopts option_string variable 具体使用方法请参考getopts的在线文档(man getopts). 示例如下: #newdate if [ $# -lt 1 ] then date else while getopts mdyDHMSTjJwahr OPTION do case $OPTION in m) date '+%m ';; # Month of Year d) date '+%d ';; # Day of Month y) date '+%y ';; # Year D) date '+%D ';; # MM/DD/YY H) date '+%H ';; # Hour M) date '+%M ';; # Minute S) date '+%S ';; # Second T) date '+%T ';; # HH:MM:SS j) date '+%j ';; # day of year J) date '+%y%j ';;# 5 digit Julian date w) date '+%w ';; # Day of the Week a) date '+%a ';; # Day abbreviation h) date '+%h ';; # Month abbreviation r) date '+%r ';; # AM-PM time ?) echo "Invalid option $OPTION";; esac done fi $ newdate -J 94031 $ newdate -a -h -d Mon Jan 31 $ newdate -ahd Mon Jan 31 $ 示例程序:复制程序 # Syntax: duplicate [-c integer] [-v] filename # where integer is the number of duplicate copies # and -v is the verbose option COPIES=1 VERBOSE=N while getopts vc: OPTION do case $OPTION in c) COPIES=$OPTARG;; v) VERBOSE=Y;; ?) echo "Illegal Option" exit 1;; esac done if [ $OPTIND -gt $# ] then echo "No file name specified" exit 2 fi shift `expr $OPTIND -1` FILE=$1 COPY=0 while [ $COPIES -gt $COPY ] do COPY=`expr $COPY + 1` cp $FILE ${FILE}${COPY} if [ VERBOSE = Y ] then echo ${FILE}${COPY} fi done $ duplicate -v fileA fileA1 $ duplicate -c 3 -v fileB fileB1 fileB2 fileB3 4. Shell的定制通常使用shell的定制来控制用户自己的环境,比如改变shell的外观(提示符)以及增强自己的命令。 (1)通常环境变量来定制shell 通常改变环境变量可以定制shell的工作环境。shell在处理信息时会参考这些环境变量,改变环境变量的值在一定程度上改变shell的操作方式,比如改变命令行提示符。 .使用IFS增加命令行分隔符默认状态下shell的分隔符为空格、制表符及换行符,但可以通过改变IFS的值加入自己的分隔符。如下所示: $ IFS=":" $ echo:Hello:my:Friend Hello my Friend (2)加入自己的命令及函数如下程序: #Directory and Prompt change program #Syntax: chdir directory if [ ! -d "$1" ] then echo "$1 is not a directory" exit 1 fi cd $1 PS1=`pwd`$ export PS1 $ chdir /usr/home/teresa $ 但此程序在执行时系统提示符并不会改变,因为此程序是在子shell中执行的。因此其变量对当前shell并无影响,要想对当前shell起作用,最好是将此作为函数写在自己的.profile中或建立自己的个人函数文件.persfuncs #Personal function file persfuncs chdir() { #Directory and Prompt change program #Syntax: chdir directory if [ ! -d "$1" ] then echo "$1 is not a directory" exit 1 fi cd $1 PS1=`pwd`$ export PS1; } 再执行: $ . .persfuncs $ chdir temp /home/hbbwork/temp$ 也可在自己的.profile文件中用 . .persfuncs调用.persfuncs. 说明:在bash/tcsh中已经使用别名,相对而言别名比此方法更为方便。 5. 有关shell的专门讨论 (1)shell程序的调试切记:程序员(人)总是会犯错误的,而计算机是不会错的。使用-x进行跟踪执行,执行并显示每一条指令。 (2)命令组用小括号将一组命令括起来,则这些命令会由子shell来完成;而{command_list;}则在当前shell中执行。这两者的主要区别在于其对shell变量的影响,子shell执行的命令不会影响当前shell中的变量。 $ NUMBER=2 $ (A=2;B=2;NUMBER=`expr $A + $B`; echo $NUMBER) 4 $ echo $NUMBER 2 $ { A=2;B=2;NUMBER=`expr $A + $B`; echo $NUMBER; } 4 $ echo $NUMBER 4 总结:在本章中讲述了Bourne Shell的基本知识,使用shell变量,shell script基础。这些概念对于理解学习Korn Shell, csh以及其他script编程都是非常有用的。 很多OS都有不少语言及一些script功能,但很少有象UNIX SHELL这样灵活强大的script脚本语言能力。 对于系统管理员或程序员来说,熟练地使用shell script将对日常工作(系统维护及管理) 非常有用,如果你想作一个合格的系统管理员,强烈建议你进一步深入的了解和使用 shell. 另外,对于系统管理员来说,PERL也是一个必不可少的script编程语言,尤其是对于处理文本格式的各种文件,PERL具有shell, awk, sed, grep等的功能,但使用起来更为灵活,功能也更强大。大家可以参考“Perl By Examples"来学习和使用PERL。 made by pageshop of CERNET network centre of DaLian region.copyright 1999 转换金额大写的SHELL程序(绝对通过验证) 创建:2005-10-26 00:49:46 作者:Unlinux 来自: http://www.Unlinux.com [code:1:7abe7d16ca]#!/bin/ksh # Program Name : Num2Chn.sh # Programmer : 吕永辉(仙桃市信用联社) # 首先判断输入的是否为数字 printf "%.2f" $1 >/dev/null 2>&1 3>&1 || { echo "输入非法!!!";exit } # 定义数字数组 Num[0]="零" Num[1]="壹" Num[2]="贰" Num[3]="叁" Num[4]="肆" Num[5]="伍" Num[6]="陆" Num[7]="柒" Num[8]="捌" Num[9]="玖" # 定义金额单位数组 Unit[1]="分" Unit[2]="角" Unit[3]="元" Unit[4]="拾" Unit[5]="佰" Unit[6]="仟" Unit[7]="万" Unit[11]="亿" # 处理负数的情况(红字) [ `echo $1 | grep "-"` ] && { NumStr=`echo $1 | sed 's/^.//'` RedFlag="(红)" } || { NumStr=$1 RedFlag="" } # 初始化输入数字数组 i=1 for TmpC in `printf "%.2f" $NumStr | awk -F "." '{print $1$2}' | sed 's/./& /g'` do Nums[$i]=$TmpC i=`expr $i + 1` done j=${#Nums[@]} # 为循环计数变量附初值为输入数字的长度 k=1 # 为循环定位变量附初值(用于确定金额单位) ChnNum="" # 初始化大写金额字符串 while [ $j -eq 0 ] && break [ $k -gt 11 ] && { ChnNum=${Num[${Nums[$j]}]}${Unit[`expr $k - 8 `]}$ChnNum j=`expr $j - 1` k=`expr $k + 1` continue } [ $k -gt 7 -a $k -lt 11 ] && { ChnNum=${Num[${Nums[$j]}]}${Unit[`expr $k - 4 `]}$ChnNum j=`expr $j - 1` k=`expr $k + 1` continue } ChnNum=${Num[${Nums[$j]}]}${Unit[$k]}$ChnNum do j=`expr $j - 1` k=`expr $k + 1` done ChnNum=`echo $RedFlag$ChnNum | sed 's/零分/整/' | sed 's/零角/零/g' | sed 's/零拾/零/g' | sed 's/零佰/零/g' | sed 's/零仟/零/g' | sed 's/零整/整/' | sed 's/零零零零万/零/'` # 下面的循环用于去掉字符串中连续的零 while [ `echo $ChnNum | grep "零零"` ] || { ChnNum=`echo $ChnNum | sed 's/零元/元/'| sed 's/零万/万/' | sed 's/零亿/亿/' | sed 's/^元//' | sed 's/^零//' | sed 's/^整$/零元&/` break } do ChnNum=`echo $ChnNum | sed 's/零零/零/g'` done echo $ChnNum[/code:1:7abe7d16ca] (调试环境:SCO OpenServer 5.0.5 、ksh 我把原始脚本传上来,各位可以保存后改名直接拷贝到SCO上执行。转载自:http://www.unlinux.com/doc/shell/20051026/284.html 【评论】【加入收藏夹】【大 中 小】【打印】【关闭】 * 请尊重我们的劳动,转载请注明出自UnLinux.Com及作者名 * -------------------------------------------------------------------------------- ※ 相关链接 ·Shell递归程序设计/批量转换大写文件名为小写 (2005-10-26 00:49:45) ·把csh,sh或ksh语法的脚本相互转换的程序 (2005-10-26 00:49:45) ·如何用Bshell转换cgi传入的变量中的非ASCII字符(汉字) (2005-10-26 00:49:42) ·实现Hex和Dec转换 (2005-10-26 00:49:42) 做到限时登录 创建:2005-10-26 00:49:46 作者:Unlinux 来自: http://www.Unlinux.com 通过以下三个脚本程序调用at和系统维护功能即可实现限时登录: 1. 在指定的时间执行该脚本,将在/etc下生成一名为nologin的文件,登录程序在执行时会自动判断此文件是否存,如果存在将不允许用户登录,内容为: vi /sbin/login.denied echo " Login Denied " > /etc/nologin chmod 700 login.denied 2. 在指定的时间执行该脚本,删除/etc/下的nologin文件以允许用户登录,内容为: vi /sbin/login.allowed if [ -f /etc/nologin ]; then rm /etc/nologin fi chmod 700 login.allowed 3. 编写一个限制时间的脚本,内容为: vi /sbin/login.rollback if [ -f /sbin/login.denied ]; then at -f /sbin/login.denid 22:00 fi if [ -f /sbin/login.allowed ]; then at -f /sbin/login.allowed 8:00 if chmod 744 /sbin/login.rollback 创建完成以后,把/sbin/login.rollback脚本放进crontab中,在每天凌晨执行: crontab -e # roll login script 00 1 * * * /sbin/login.rollback 此种设置的功能是:从晚上10:00到第二天早上8:00静止非root用户登录,显示为系统维护状态。 转载自:http://www.unlinux.com/doc/shell/20051026/283.html 开机自动打开NUMLOCK 创建:2005-10-26 00:49:46 作者:Unlinux 来自: http://www.Unlinux.com for t in `seq 1 8` do setleds -D +num $t>/dev/null done 参数 -D 才能改变default flags 当然如果把num换成caps,scroll就能改变capslock、scrolllock的状态 可否用SHELL实现对SQL进行查询,修改,删除等等呢 创建:2005-10-26 00:49:46 作者:Unlinux 来自: http://www.Unlinux.com #!/usr/bin/ksh SQL_EXEC() { sqlplus $USER/$PASSWD@$DB<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值