




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【1】SHELL范式规定一个范式,有利于统一程序风格,增加可读性。对于编写SHELL,拷贝修改即可。范式:ASSIGN SHELL/指定壳DESCRIPTION/程序说明BODY/程序体扩展:1 ASSIGN SHELL/指定壳,如果不指定壳,默认使用Bourne SHELL,建议使用KSH#!SHELL路径1.1 CSH#!/bin/csh1.2 BSH#!/bin/sh1.3 KSH#!/bin/ksh2 DESCRIPTION/程序说明#PROCEDURE NAME/程序名称#PROCEDURE FUNCTION/程序功能说明#AUTHOR/作者#DATE/开发时间#INPUT/输入#OUTPUT/输出#CALL/调用函数说明#HISTORY/变更历史3 BODY/程序体INCLUDE LIBRARY /包含库文件VARIABLE DEFINE/变量定义FUNCTION DEFINE/函数定义MAIN/程序入口3.1 INCLUDE LIBRARY /包含库文件. LIBRARY FILE/库文件名称3.2 FUNCTION DEFINE/函数定义#FUNCRION: FUNCTION NAME#DESC : FUNCTION DESC#INPUT : INPUT DESC#OUTPUT : OUTPUT DESCFUNCTION()3.3 MAIN/程序入口(建议为)程序启动说明程序执行步骤程序结束exit 0范式样例:#!/bin/ksh # 程序名 : update.sh # 功能简介: 本程序完成WINV200R002M1D039P2升级# 作者 : zhongwei/20150 # 开发时间: 2002-05-05 # # 函数说明: 函数定义# CheckBackupDir()检查备分目录,不完毕则创建# CheckDbinstallDir()检查SMP的数据库安装脚本目录# CheckIfUpgraded()检查是否已经升级# UpdateSMPDir()升级SMP的目录结构# BackupDb()备分数据库的脚本、数据# BackupFile()备分SMP目录的文件# UpdateDb()升级数据库 # UpdateFile()升级文件 # 修改历史: First Programming # 日期 :# 作者 :# 修改说明:#应用库函数,要求库函数文件与当前SHELL同一目录. ./comm_func.sh.rc#定义变量#程序名称ProgName=SMP Platform Upgrade#标题Title=WINV200R002 D039P2#目录和文件定义WorkDir=pwdLogDir=$WorkDir/logTempDir=$WorkDir/temp#日志与标志文件ErrFile=$LogDir/update.errLogFile=$LogDir/update.logFlagFile=$LogDir/flag.flg#函数定义# 函数:PrintUsage# 目的:定义打印用法函数。# 输入:# 输出:屏幕#PrintUsage() echo * echo NAME : $ProgName echo VERSION : $Title echo SYSTEM : WIN SMP echo DESC : SMP platform or service upgrade echo NOTICE : echo COPYRIGHT : 2002, HUAWEI Tech. Co. Ltd. echo * echo 1. Execute backup operation echo 2. Execute upgrade operation echo 3. Execute rollback operation echo 0. Exit echo Please input operation choice 0-3:# Main #exit 0# END OF PROCEDURE #【2】SHELL编程格式与语法Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,在行末加上 ,这个时候下一行的内容就会接到这一行的後面,成为同一行。当Script中出现#时,再它後面的同一行文字即为注解,Shell会对其翻译。 在Script中要执行一个命令的方法和在命令列中一样,你可以前台或后台执行,执行命令时也会需要设定一些环境变量。 Script的流程控制和一般高级语言的流程控制没有什麽两样,也和高级语言一样有副程式。这些使得Script的功能更加强大。 2.1 SHELL基本术语与关键字. 当前shell程序相同目录. 当前shell程序的上一级目录break 退出for、while、until或case语句cd 改变到当前目录continue 执行循环的下一步echo 反馈信息到标准输出eval 读取参数,执行结果命令exec 执行命令,但不在当前shellexit 退出当前shellexport 导出变量,使当前shell可利用它pwd 显示当前目录read 从标准输入读取一行文本readonly 使变量只读return 退出函数并带有返回值set 控制各种参数到标准输出的显示shift 命令行参数向左偏移一个test 评估条件表达式times 显示shell运行过程的用户和系统时间trap 当捕获信号时运行指定命令ulimit 显示或设置shell资源umask 显示或设置缺省文件创建模式unset 从shell内存中删除变量或函数wait 等待直到子进程运行完毕,报告终止2.2 变量 Shell的类型只有字串变量,所以要使用数值运算则必须靠外部命令达成目的。而其变量种类有下列几种: 1. 普通变量 这是最常使用的变量,我们可以任何不包含空白字元的字串来当做变量名称。 设定变量值时则用下列方式: var=string #不能是var = string,即等号两边不能有空格。与判断语句正好相反,判断语句表的=或者其他符号两边必须有空格,否则为赋值运算取用变量时则在变量名称前加上一$ 号,或者$name。 name=Tom echo nameecho $name 结果如下:nameTom2.环境变量和使普通变量相似,只不过此种变量会将其值传给其所执行的命令。要将一使 用者变量设定为系统变量,只要加上: export var或者export var=var_value 或者setenv var var_valuedname=Tomexport name以下是使用者一进入系统之後就已设定好的系统变量: $HOME 使用者自己的目录 $PATH 执行命令时所搜寻的目录 $TZ 时区 $MAILCHECK 每隔多少秒检查是否有新的信件 $PS1 在命令列时的提示号 $PS2 当命令尚未打完时,Shell要求再输入时的提示号 $MANPATH man 指令的搜寻路径 3. 只读的使用者变量 和使用者变量相似,只不过这些变量不能被改变。要将变量设成只读的 ,只要加上: readonly var 而若只打readonly则会列出所有只读的变量(ksh支持readonly命令。csh不支持,但是在shell程序中可以使用readonly修饰某个变量)。还有一点,系统变量不可以设定成只读的。 name=Tom readonly nameecho $namename=Johnecho $name(假设文件保存为aa)结果如下:aaaaa4: name: This variable is read only4. 特殊变量 有些变量是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它只读的系统变量,而叫它特殊变量,因为这些变量是一执行程式时就有了,况且使用者无法将一般的系统变量设定成只读的。以下是一些等殊变量:$0 这个程式的执行名字 $n 这个程式的第n个参数值,n=1.9 $* 这个程式的所有参数 $# 这个程式的参数个数 $ 这个程式的PID $! 执行上一个背景指令的PID $? 执行上一个指令的返回值 $n,n只能为0-9的原因,是Bourne Shell的位置参数变量为$1$9, 因此通过位置变量$n只能访问前9个参数。当你执行这个程式时的参数数目超过9 时,我们可以使用shift 命令将参数往前移一格,如此即可使用第10个以後的参数。除此之外,可以用set 命令改变$n及$*,方法如下: set string 如此$*的值即为string,而分解後则会放入$n。如果set命令後面没有参数, 则会列出所有已经设定的变量以及其值。 echo Filename: $0echo 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: ex1Arguments: this is a testNo. of args.: 42nd arg.: isNo. of args.: 32nd arg.: aArguments: hello, everyone2nd arg.: everyone5. 数组变量 (ksh支持)nameindex=value其中name为数组名称,index为数组下标,在ksh中数组最大支持1024,即index为01023.或者set A name value1 value2valuen引用数组变量$nameindex应用所有项:$name* #或者$name如:set A ser pps ppip mvpnecho $ser2echo $ser*打印为:mvpnpps ppip mvpn如:set A ser pps ppip mvpnecho $ser2echo $ser*打印为:pps2pps*6. SHELL变量 SHELL程序中可以直接使用一些变量。常用有:SECONDS#ftp程序中判断超时经常使用这个变量IFS#域分割符,缺省为空格或者TAB键,可以由用户指定2.3 引用某些字符在SHELL中具备特殊的含义:如:& * + $ | ? ; 可以使用双引号或者单引号或者去掉特殊字符的含义,使成为一个普通字符.1) ”可以去掉除$, , 之外的所有特殊字符的含义。比如:echo * #输出当前某个的所有目录与文件echo “*”#输出*字符echo “date”#输出为date命令打印的时间“Tue Sep 17 11:31:58 MDT 2002”echo “$PATH”#输出当前用户的搜索路径echo “ana”#输出为2行,一行一个a,此时为特殊字符2) 单引号可以去掉去掉引号以内包含的任何特殊字符的含义,使成为一个普通字符.比如:echo *#输出*字符echo date#输出dateecho $PATH#输出$PATHecho ana#输出为2行,一行一个a,此时为特殊字符3) 可以去掉& * + $ | ?的特殊含义,本身的特殊含义可以用去掉,比如后面一个就是普通字符如:echo *#输出*2.4 标准输入与输出当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆, shell同时也给出了相应的文件名。下面就是这些文件描述符及它们通常所对应的文件名:文件文件描述符输入文件标准输入0输出文件标准输出1错误输出文件标准错误2系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误command filename 把把标准输出重定向到一个新文件中command filename 把把标准输出重定向到一个文件中(追加)command 1 fielname 把把标准输出重定向到一个文件中command filename 2&1 把把标准输出和标准错误一起重定向到一个文件中command 2 filename 把把标准错误重定向到一个文件中command 2 filename 把把标准输出重定向到一个文件中(追加)command filename 2&1 把把标准输出和标准错误一起重定向到一个文件中(追加)command filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出command filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入command delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符command &m 把把标准输出重定向到文件描述符m中command &- 把关闭标准输入2.5 重新定向输入定向:可以从文件或者标准输入设备得到输入#将命令的屏幕输出定向到文件 #将命令的屏幕输出定向到文件,采用Append方式管道定向:| #将一个命令的输出定向到另外一个命令的输出(某些命令不支持直接|定向)如:将一条SQL输出到dbaccess执行echo “update basetab_pps set multiserviceflag=00000000000” where msisdn|dbaccess $TELLIN_DBNAMEps ef |grep “manager” |grep v “grep” | wc l #多次管道定向得到命令返回值,输出到变量:var=command如:echo Time=date +%y-%m-%d %H:%M:%S#输出Time=02-09-17 18:30:062.6 基本流程语句1 顺序2 条件语句if-then-fiif condition then .fi我们经常使用的书写方式:使用;符号,在一行中包含多条命令与语句if condition ;then .fi3 条件语句if-then-else-fiIf condition then .else .fi if condition1then .elif condition2then .else .fi 4 while条件循环while expressdo .done #从循环中退出使用 break和continue命令 5 for循环for var in arg1 arg2 . argndo .done#从循环中退出使用 break和continue命令6 until循环until expressdo.done#从循环中退出使用 break和continue命令 7 case选择语句case var invar1) . ;var2|var3) . ;*) ;esac 如升级程序选择菜单就是利用case建立的:while truedo #执行 echo if -$OprChc = -1 ; then Backup #备份 elif -$OprChc = -2 ; then Upgrade #升级 elif -$OprChc = -3 ; then Rollback #回滚 elif -$OprChc = -0 ; then Log Goodbye! Log break else echo Invalid input , please input again! fi echo PrintUsage read OprChcdone 8 select选择语句(ksh支持)select选择语句一般与case语句联合使用,用户生成用户交互菜单。语法为:select var in value1 value2 value3 valuendo doneselect执行时会在value项生成一个列表,并且没有项之前给一个从1开始递增的数字。用户选择某个数字,相当于现在value对应项,赋值给var变量。如:1) value12) value23) value3n) valuen#?一般do done之间使用case语句。语法扩展为:select var in value1 value2 value3 valuendo case $var in value1) ; value2) ; value3) ; valuen) ; *) esacdone2.7 SHELL函数可以将SHELL中需要重复执行的代码写成函数,与C变成的函数一致。1 函数格式定义函数的格式为:函数名() .或者函数名() .两者方式都可行。如果愿意,可在函数名前加上关键字function,建议增加。function 函数名() .2 向函数传入参数函数可以带参数调用,调用方式为函数名称 参数列表函数取得传入的参数,与SHELL得到调用的参数完全一致:判断参数个数:$#取参数:$1 $2 3 函数返回参数函数可以使用return 返回调用参一个值。调用者可以在调用函数后得到函数的返回值:$?得到,如:#调用格式:aaa parameteraaa() return 1#错误用法a=aaa para #无法得到返回值1#正确用法aaa pararet=$?如果使用exit,将退出SHELL程序4 将常用函数写成库函数为了重复利用代码,可以将函数写成库函数的方式,然后在SHELL中包含进行即可使用:. libraryfile2.8 其他基本语法1 条件连接符and与 命令行:command1 & command2 #如果command1执行成功,执行commnad2如:rm * & echo File successfully removed(建议不要使用以上语法,因为语法不常用,可读性不强)表达式:express1 & express2如:if $1 -eq 1 & $1 -eq 1 then . fior或命令行:command1 | command2 #仅当前一个命令执行出错时才执行后一条命令如:rm * | echo File successfully removed(建议不要使用以上语法,因为语法不常用,可读性不强)表达式:express1 | express2如:if $1 -eq 1 | $1 -eq 1 then . fi2 包含库函数#. 空格之后将文件的路径, 一般放在程序的起始部分. ./comm_func.sh.rc3 信号处理trap echo _ $0 interrupted _; exit 1 24 分割符SHELL默认的分割符IFS为空格与TAB键。程序中可以使用定制的分割符如:从dbaccess下载数据没有指定delimiter时,字段分割为”|”OLD_IFS=$IFSIFS=”|”Read col1 col2 col3 expr 10000 + 1111 #相加expr 10000 * 1111 #相乘ksh 中可使用 letn1=3n2=5let n=n1+n22) bc使用bc可以计算任意长度的计算,不会溢出echo 1000000000000000000000000000000*1111 | bc1111000000000000000000000000000003.3 合并与分割常用的合并与分割命令有: sort cut split1) sort排序sort -cmur -o 输出文件 t 分割符 +n 输入文件下面简要介绍一下s o r t的参数:-c 测试文件是否已经分类。-m 合并两个分类文件。-u 删除所有复制行。-r 逆向排序DESC,默认为正向ASC如:将basetab_pps文件按第4个字段逆向排序sort t| -r +3 basetab_pps.unl basetab_pps.unl.sort注意:不能使用-t|,因为|在SHELL中属于管道符号,需要使用|2) cut切割cut用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。下一节将介绍粘贴用法。cut一般格式为:cut options file1 file2下面介绍其可用选项:-c list 指定剪切字符数。-f field 指定剪切域数。-d 指定与空格和tab键不同的域分隔符。-c用来指定剪切范围,如下所示:-c1,5-7 剪切第1个字符,然后是第5到第7个字符。-c1-50 剪切前50个字符。-f 格式与-c相同。-f1,5 剪切第1域,第5域。-f1,10-12 剪切第1域,第1 0域到第1 2域。如:从字符串中”aaabb:aaaaa:bbb”将”aaaaa”切割出来echo ”aaabb:aaaaa:bbb” | cut d “:” f23) splitsplit用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可能更容易。使用vi或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题。因此有时没有选择余地,必须将文件分割成小的碎片。split命令一般格式:split output-file-line input-filename output-filename这里output-file-size指的是文本文件被分割的行数。split查看文件时,output-file-line选项指定将文件按每个最多1000行分割。如果有个文件有2800行,那么将分割成3个文件,分别有1000、1000、800行。每个文件格式为xaa到xzz,x为文件名首字母, aa、zz为文件名剩余部分顺序字符组合,3.4 匹配或者过滤操作1 grep的使用grep可以从输入的字符中,过滤某些或者过滤掉某个特定字符的命令。一般使用为:grep “特征字符串” inputFilegrep v “特征字符串” inputFile2 awk命令的使用awk是可以使用很复杂,但是能完成某些特定功能,并且常使用的一个命令。使用用法:awk F 分隔符 模式 inputfile-F可以指定域或者列之间的分割符,如果不指定,使用默认的分割符(空格或者TAB)。比如对于分割unload命令下载的文件, 可以指定 F |对于模式中的使用分割符分割后的域,标记$1,$2 . . . $n,$0标识所有的域。为打印一个域或所有域,使用p r i n t命令比如打印当前目录的所有文件的大小名称:ls al | awk print $5, $9 #大小与文件名称使用空格格开,即$5,$9使用空格连接ls al | awk print $5”|”$9 #大小与文件名称使用|格开,即$5,$9使用|连接使用BEGIN模式打印头部信息:ls al | awk BEGIN print “size filename” print $5”t”$9 #相当于打印列的标题使用END模式打印尾部信息:ls al | awk print $5”t”$9 ENDprint “finished” #在列出文件后,加上finished字符awk中使用正则表达式awk中正则表达式匹配操作用到的字符有: $ . | () * + ?用法:awk -F 分割符 if (express) 操作即指定域满足express表达式的行,才打印出来.如打印目录文件中包含sms的文件:ls al | awk if ( $9/sms/) print $0如打印目录文件大小大于100000字节的文件:ls al | awk if ( $5100000) print $0awk中还有很多用法,在此不列出来3 sed命令3.5 信号处理信号就是系统向脚本或命令发出的消息,告知它们某个事件的发生。这些事件通常是内存错误,访问权限问题或某个用户试图停止你的进程。信号实际上是一些数字。下表列出了最常用的信号及它们的含义列出所有信号:kill lHUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1USR2 CLD PWR VTALRM PROF IO WINCH STOP TSTP CONT TTIN TTOU一些信号的含义:1 SIGHUP 挂起或父进程被杀死2 SIGINT 来自键盘的中断信号,通常是3 SIGQUIT 从键盘退出9 SIGKILL 无条件终止11 SIGSEGV 段(内存)冲突15 SIGTERM 软件终止(缺省杀进程信号)1 发出信号:kill 信号 进程号注明:kill 9 进程号 杀死进程时,操作系统直接将进程从内核清除,不作退出的处理2 检测信号或者捕捉信号有些信号可以被应用程序或脚本捕获,并依据该信号采取相应的行动。另外一些信号不能被捕获。例如,如果一个命令收到了信号9,就无法再捕捉其他信号。当脚本捕捉到一个信号后,它可能会采取下面三种操作之一:1) 不采取任何行动,由系统来进行处理。2) 捕获该信号,但忽略它。3) 捕获该信号,并采取相应的行动如果需要捕捉信号后,采用自定义的操作,可以使用trap命令:trap name signal(s)其中,name是捕捉到信号以后所采取的一系列操作。实际生活中, name一般是一个专门用来处理所捕捉信号的函数。Name需要用双引号(“ ”)引起来。Signal就是待捕捉的信号。下表列出了一些最常见的trap命令用法:trap 2 3 忽略信号2和信号3,用户不能终止该脚本trapcommands 2 3 如果捕捉到信号2或3,就执行相应的commands命令trap 2 3 复位信号2和3,用户可以终止该脚本如:收到3( SIGQUIT 从键盘退出),打印一行“proc received SIGQUIT and exit”#!/bin/kshtrap “fun_exit” 3fun_exit() echo “proc received SIGQUIT and exit” exit 1echo “start running”exit 03.6 设置终端参数stty可以用来设置与限制终端属性,如:终端与计算机之间的传输率、退格、中断等。echo-echo 是否回显intr生成中断信号
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州机电职业技术学院第十三届贵州人才博览会引进人才15人考前自测高频考点模拟试题附答案详解(黄金题型)
- 安全培训效评价课件
- 2025福建厦门鼓浪湾大酒店有限公司(第二批)招聘5人模拟试卷及答案详解(夺冠)
- Hydroxyprogesterone-Caproate-d11-17α-Hydroxyprogesterone-hexanoate-d-sub-11-sub-生命科学试剂-MCE
- Human-EPO-mRNA-生命科学试剂-MCE
- HGS004-生命科学试剂-MCE
- HDAC11-IN-1-TFA-生命科学试剂-MCE
- 2025年宁波慈溪市中西医结合医疗健康集团招聘派遣制工作人员3人模拟试卷及答案详解(必刷)
- 搭建商战略合作协议范本5篇
- 金融系统安全运行承诺函8篇
- ISO 22000-2018食品质量管理体系-食品链中各类组织的要求(2023-雷泽佳译)
- 卡巴斯基应急响应指南
- 理财规划大赛优秀作品范例(一)
- 2023年四川能投筠连电力招聘笔试参考题库附带答案详解
- 护理管理组织结构与设计
- 静配中心清洁消毒考核试题
- 一级烟草专卖管理师理论考试题库(含答案)
- 小学数学《分数除法》50道应用题包含答案
- 碳捕集、利用与封存技术课件
- 化工试生产总结报告
- 复句与单句的辨析课件
评论
0/150
提交评论