




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何进行shell脚本开发什么是shell简单的理解为系统管理员与操作系统之间的接口;顾明思义它是操作系统的外壳,管理员通过这个接口完成所需要的任务.shell脚本与shell命令的区别及关系shell脚本是一个包含shell命令的ASCII码文件,特点是可以用文本处理工具查看如more 脚本名 来讯速的判断它是不是脚本.如果是命令的话则显示乱码而命令则是可执行的二进制代码文件Shell脚本可理解为shell命令与应用程序的集合shell脚本用起来有时候跟shell命令一样.unix的文件观在unix中设备是文件,目录是文件,文件是文件:空设备文件/dev/null开发脚本时需要把不必要的信息输出到这个文件,让屏幕干净. cat /dev/null filename #清空filename statement /dev/null #把不需要的输出重定向到空如何创建一个可执行的脚本1 用touch命令建一个空文件(touch shellscrip),更改其权限为可执行chmod +x shellscrip2 如何让操作系统懂得它是一个脚本 echo #!/bin/sh shellscrip echo echo hello world shellscrip3 执行shellscrip 完成一个hello world脚本hello world 相关的几个命令touch 是创建文件的命令chmod 是改变文件的权限(文件的权限位分为读写执行分别用三个字母标识共有三组用户属性第一组文件属主,第二组为同组用户,第三组为其它,注意:同组不包含属主echo 表示显示信息 输出重定向 追加 转义字符shellscripr 的内容#!/bin/bsh操作系统看到 #! 就会用紧跟在它后面的程序去解释这个的文本(它可能是脚本,可能是一个awk程序或是其它别的应用程序),这里用bsh ,则说明它是bsh的脚本,不同的shell也在这里指出,重要的是这里必需给出绝对路径(即全路径或完整路径),哪怕PATH变量有指出也要给绝对路径. 仅第一次出现是这个含义,往后再现”#!”字符串shell解释为注释行(注释行以#号开始)并不会改变当前的shell.:#!/bin/sh #!/bin/cshecho $status echo $status#!/bin/csh #!/bin/shecho $status echo $status以上两组动作将有不同的结果表明第二次出现的 #! 指定的shell并不会改变当的shell常见的Shellbsh (Bourne Shell)ksh (Korn Shell)csh ( C Shell)最常用的Shell是sh,大部分的Unix系统都将sh连接到bsh;IBM将sh连接到kshShell程序也就是一系列的Unix命令的组合,相当于DOS系统下的批处理命令。Unix命令既可以是内部命令,也可以是已经编译好的高级语言程序,甚至可以是其它Shell程序Shell程序支持分支与循环结构,可以进行信号处理Shell程序可以加注释,注释以“#”号开头,到行尾结束怎样才能知道用什么Shell来执行我编写的Shell脚本?参照下面三个原则:如果脚本文件的第一个字符不是“#”号,则启动bsh执行此脚本如果脚本文件的第一个字符是“#”号,但第二个字符不是“!”,则启动csh执行此脚本如果脚本文件的前两个字符为“#!”,则后面必须是Shell的全路径,启动指定的Shell执行此脚本,如:#!/usr/bin/ksh求条件表达试的值 test 或 不支持控制符的判断.规避方法 X$str = Xstring 如果是含路径的字符串用basename,与dirname命令取得文件名与父目录名,因为对含路径的字符串进行处理时test命令是会报错的test 表达式 或 表达式 name=Tom #bsh(这种赋值方式不适合csh,tcsh)test $name = Tom #等号两边必需留空格字符串比较echo $? #查看测试结果 $name = Tom #方括号两边内侧须留空格字符串,整型和文件的测试字符串测试string1 = string2 #字符串1等于字符串2 (等号两边的空格是必需的)string1 != string2 #字符串1不等于字符串2 (不等号两边的空格是必需的)string#不是空串-z string #字符串长度为零-n string #字符串长度不为零整型测试 int1 eq int2 # Int1等于 int2 int1 ne int2 # Int1 不等于 to int2 int1 gt int2 # Int1 大于 int2 int1 ge int2 # Int1 大于等于 int2 int1 lt int2 # Int1 小于 int2 int1 le int2 # Int1 小于等于int2逻辑测试expr1 -a expr2 逻辑与expr1 -o expr2 逻辑或! expr 逻辑非文件测试-b filename 是块文件-c filename 字符文件-d filename 目录文件-f filename 普通文件但非目录文件-g filename 设置gid的文件-k filename 存在粘性位的文件-p filename 命名管道文件-r filename 有读权限的文件-s filename 文件大小非零字节-u filename 设置uid的文件-w filename 有写权限的文件-x filename 有执行权限的文件 Shell中的if语句的语法如下(这里不包含csh,tchs):if 命令1 #如果命令1执行成功(返回0)then#则执行list1命令列表 list1#如果执行不成功(返回非0值)elif 命令2 #执行命令2then#如果命令2执行成功 list2#则执行list2命令列表else#如果命令2执行不成功 list3#则执行list3命令列表fiif语句以fi结尾Shell中case语句的语法如下:case word in #如果word与 pattern1匹配, pattern1)#则执行list1命令列表 list1 #如果word与 pattern2匹配, ;#则执行list2命令列表 pattern2)# list2 ; esaccase语句以esac结尾,每个分支后两个“;”是必须的case语句中的pattern可以使用如下结构“或”结构,如“a|b|c”匹配a或b或c范围,如“0-9”匹配单个数字“?”匹配任何单个字符“*”匹配任何零个或多个字符使用“*”,相当于C语言default分支以上结构可以组合使用,如:“0-9|0x0-9A-Fa-f”Shell中while循环的语法如下:while commanddo listdone#循环语句必须以done结尾1、执行命令command2、如果执行成功(返回值为0), 则执行list命令列表3、重复1,直至command命令失败(返回非零值)Shell中until循环的语法如下:until commanddo listdone#循环语句必须以done结尾1、执行命令command2、如果执行失败(返回值非0), 则执行list命令列表3、重复1,直至command命令执行成功(返回0)Shell中for循环的语法如下:for name in word1 word2 . wordNdo listdone#循环语句必须以done结尾name为变量名,word1到wordN是由空格分开的单词列表for循环每次执行时,变量name被设为列表中的下一单词for循环常用于处理文件集合例如:修改一个目录下所有文件的文件名,在文件名后加上“.bak”for file in $HOME/*do mv $file $file.bakdoneksh中Select语句的语法如下:select name in word1 word2 . wordNdo listdone#循环语句必须以done结尾name为变量名,word1到wordN是由空格分开的单词列表1、select语句打印word1wordN到标准出错设置(文件描述符为2),前面增加一个数字。2、打印PS3提示符,并且从标准输入设备读一行3、如果该行与所列word前面的数字一致,则变量name被设置成相应的word4、如果该行为空,则重新打印select列表5、否则,变量name被设置成空6、读到的内容存放在变量REPLY中7、每输入一次选择,命令列表list被执行一次,直到遇到break或EOF8、如果在命令列表list中将变量REPLY设成空,则在打印PS3提示符前,打印select列表Select语句应用示例:select SEL in Menu1 Menu2 Exitdo case $SEL in Menu1) echo You Select Menu1. REPLY= ; Menu2) echo You Select Menu1. REPLY= ; Exit) break ; *) echo Select Error. REPLY= ; esacdoneShell中的特殊字符* ? $ ; & ( ) | 换行 空格 tab单引号“”:单引号内的所有特殊字符都失去其特殊含义,包括换行符“”必须成对出现。一对“”之间不能嵌入“”,前面用“”转义也不可以反引号“”:反引号内是一组命令。Shell将反引号替换为该命令的输出。反引号对特殊字符的处理与双引号基本相同双引号“”:双引号内的大部分字符失去特殊含义,下面的字符除外:$ $用于变量替换 反引号用于命令替换$ $作为美元符,而不具备特殊含义 作为反引号,而不具备特殊含义 使用嵌入的双引号 使用嵌入的反斜线 其它的字符都作为普通字符定义变量name=value 等号中间不能有空白变量名只能包含字母、数字或者下划线,并且只能以字母或下划线开头引用变量时,在变量名前加 $符特殊的变量$ 当前执行Shell的进程ID$1 $9 命令行参数$或$* 命令行参数一整行环境变量:子进程可以继承父进程的环境变量,在sh下,用export命令将一个变量设为环境变量在ksh中,$#name 为变量name值的长度测试退出状态echo $status csh 返回0正确,非0出错echo $? bsh,ksh 返回0正确,非0出错例如: cat /etc/passwd |grep $LOGNAMEecho $?Shell脚本如何验证参数个数:#!/bin/kshif $# -ne 2 then echo 输入不正确! echo 正确方式: ./脚本名称 整型数1 整型数2 exitfiecho $1+$2=expr $1 + $2这里#号变量表示参数个数,不包含文件名$1 取第1个参数$2 取第2个参数$N取第N个参数$0 取脚本名脚本的调试 错误的类型运行时错误 运行时错误一般发生在脚本开始运行后遇到一些意外的情况,发使用了错误的脚本名权限问题,路径问题或语法错误,如引用不匹配或词拼写错误.命名惯例在shell提示符键入一个命令,shell将搜索unix/linux路径以查找这条命令.当在提示符处键入一个脚本名时,它被当作另一个命令看待.shell将搜索路径以寻找它.现在假定你将一个脚本名为某个unix命令”ls”.哪个ls将被执行?这取决于在搜索路径中先找到的是哪一个,很可能执行的是unix命令而非您的脚本.显然脚本不应该被命名为ls或cat,但对一些类似test或script的不常用的命令就不是那么明显了.例如unix的test命令并不产生输出,所以命名问题比较复杂.更要注意避免将其命名为test和script这些不常用的命令.使用which命令可以知道脚本命名是否与unix/linux命令同名.它将显示找到的命令程序路径,也可以用./启动脚本,这样当前工作目录中的脚本将会被运行.权限不足普通文件没有执行权限.如果直接命令运行脚本则必需将它的权限打开chmod +x 路径问题PATH变量中如果没有(.)目录则将收到错误的信息:command not found 可能导至语法错误的原因未定义变量与误定变量 众所周知,shell使用变量时并不需要预先进行声名.当在程序中使用一个变量时,该变量被自动创建.尽管看起来这种方式比显式地定义每个变量更加方便,但它却同时带来不良的后果:一个经意的拼写错误可能会创建本来无须创建的多余变量,再加上unix/linux是区分大小定的.即使只是将大写变成了小写也可能导致程序失败未完成的编程语句 在sh,bash,ksh中: 在csh,tchs中: if expression if ( expression ) Then then Statement statement Statement statement fi endif当然shell的调试技术不仅仅是这些,这里先介绍这几个.工具介绍1) 命名管道 |语法:命令1 | 命令2 将命令1的执行结果送到命令2,做为命令2的输入。例如:ls -Rl | more 以分页方式列出当前目录及其子目录下所有文件的名称。cat file1 | more 以分页方式列出文件file1 的内容管道应用举例 ls -l | grep d #列出当前目录下的所有目录ls l | grep - #列出前目录下的普通文件ls -l *.unl #列出当前目录下的.unl文件2) 查找 findfind命令用于搜索目录树,并对目录树上的所有文件执行某种操作,参数是目录名表(指出从哪些起点开始搜索),还可给出一个或多个选项,规定对每个文件执行什么操作。find ./ -print 将列出当前工作目录下的目录树的每一个文件find / -user bob -print 将列出在系统中可找到的属于bob用户的所有文件find ./ -perm 755 将列出/usr/bob 目录树下所有存取许可为755的文件。find ./ -name *.txt -exec rm ; 删除当前目录下包含子目录中的所有找到的*.txt文件.-exec COMMAND ; 允许对所找到的每个文件运行指定的命令COMMAND3) 文件内容查找 grep grep abc file1 寻找文件f i l e 1中包含字符串abc 所在行的文本内容。 grep number *查找当前目录下所有文件中包含number(大小写不敏感) 所在行的文本内容及文件名 grep n : 显示行号,文件中可以不必包含行号4) 更改密码语法: passwdOld password: New password: Retype new password: - 只有root用户才更改其它用户的密码5) 改变当前用户语法: su - 用户名例如: su user 进入用户user 的帐号。passwrod : “-“ 号的作用加载新用户的环境,如果不包含-号则用当前的用户环境6) 查看自己用户名语法: whoami 查看当前的用户名。若已执行过su命令,则显示出此用户的用户名。7) 创建文件与目录 touch file mkdir folder -m 给新建的文件夹赋权限位,如果不指定则按umask给定默认值 -p 可以建立级联目录,如果不带这个参数,新建目录的父目录必需已存在.8) 删除命令rm 与rmdir 删除一个目录树 rm rf qq 慎用 rmdir -m -p folder9) 确定当前运行shell的方法 ps | grep $ | grep -v grep | awk print $4 $:指当前运行的shell,第二个$是个系统变量;10) 别名alias alias 显示当前shell的所有别名alias periodic echo You have worked an hour, nonstop csh的使用方法alias cl=clear ksh 的使用方法alias lls ls -l;ls 完成批命令功能各命令间用分号分开alias lls=ls -l;ls -命令因不同的shell而有所不同;它还可以给有执行权限的脚本起别名.这样别名与脚本一样有着无限的可能.11) 计算文件中的指定行,字,字节或字符数 wcwc l file 返回该文件的行数wc l * 返回当前目录下的所有文件的行数12) 文件权限的设定 chmod chmod -R mode name name:文件名或目录名。mode: 3个8位数字或rwx的组合。r-read (读),w-write (写),x-execute (执行),u-user (当前用户),g-group(组),o-other(其他用户)。 chmod 755 dir1 对于目录dir1,设定成任何使用者皆有读取及执行的权利,但只有所有者可做修改。 chmod u+x file2 对于文件file2,增加当前用户可以执行的权利。 chmod g+x file3 对于文件file3,增加工作组使用者可执行的权利。chmod o-r file4 对于文件file4, 删除其他使用者可读取的权利。查看系统中的进程13) 查看当前进程的状态ps或ps -X 查看系统中,属于自己的进程。ps -au 查看系统中,所有用户的进程。ps -aux 查看系统中,包含系统内部的及所有用户的进程。14) 在后台执行进程的方式语法:命令&例如:sleep 10& 将sleep10的工作置于后台执行。按下Control+Z键,暂停正在执行的进程;键入bg命令,将暂停的进程置于后台继续执行。15) 查看正在后台中执行的进程语法:jobs16) 结束或终止后台中的进程语法:kill %nn:利用jobs命令查看出的后台作业号例如:kill % 终止在后台中的第一个进程。kill %2 终止在后台中的第二个进程。17) 显示文档帮助语法: man 命令名例如: man ls 项目知识积累 1) 使用 sed 与 cat 除去空白行$ sed s/ */g |sed s/$/ input.file 说明:后是一个空格 $ cat -s /etc/X11/XF86Config | sed /:space:*$/d 说明:包括tab前导行2) 计算脚本运行时间( 常用在脚本的性能测试)sh 的系统变量$SECONDS,保存脚本运行时间,单位为秒;#!/bin/shsleep 3echo run_time=$SECONDS3) read从文本中逐条取行记录awk print $0 $file_name | while read line dooperator $line command statement done特别说明:cat 处理文件,会解析文件中的“回车”符然后输出,如果没有则不输出;awk 处理一个文件,文件末尾没有回车符的则会自动添加;wc -l 统计“回车”符的个数为记录条数,如果文件末尾没有回车符则该记录将被忽略;4) awk中匹配全数字echo 1234567890 |awk if ($1 /(0-9)+$/) print True 5) awk 的输出命令1 print 打印换行符;2 printf 不打印换行符;6) 内存库访问echo unload to tatablename.unl select * from tatablename | mdsql;单引号内可以是变量,带路径echo load from tatablename.unl insert into tatablename | mdsql;7) 物理库访问echo unload to tatablename.unl select * from systables; | dbaccess dbnameecho load from tatablename.unl insert into systables;|dbaccess ocs_chg1文件名可以带路径8) awk不用输入文件测试法awk BEGIN print rn qq 9) 如何处理“回车”符Windows下的回车与换行,是两个控制符号十六进制码(0D0A),而在unix下则只有一个符号;#方法一:“输入不可打印字符”通过sed进行替换,其中 M 需要在unix下用vi编辑器通过命令Ctrl+v+m才能打出来!如:sed s/M/HEREIS_M_ENTER/g $InPutFile $f_temp1 但是这里隐含一个问题,一但这个脚本以ASCII方式包传到windows下(强调一点没有进行过任何编辑),1 回车符“M”就有可能被替换成回车换行符;2 打成tar包后bin方式传回,再打开查看也会被换成回车换行符,此刻再传回unix,脚本运行报错,乱码;#方法二:“以明文方式表示不可打印字符”,通过awk中r来表示回车符:awk -F r strtmp= for (i=1;itt 10) HP服务器挂载块设备相关命令1)挂载命令: mount举例:mount -F nfs /dev/vg00/lv_tellin /tellin 参数说明: “-F”: 指定文件系统为nfs 这里为nfs文件系统“/dev/vg00/lv_tellin” 块设备文件“/tellin” 挂载点2)查看块设备的文件系统命令fstyp举例:fstyp /dev/vg00/lv_tellin 参数说明: “/dev/vg00/lv_tellin” 块设备文件3)检查文件系统的一致性并且以交互方式修复文件系统命令 fsck举例:fsck -F nfs /dev/vg00/lv_tellin 参数说明: 以nfs 的文件系统来修复 /dev/vg00/lv_tellin块设备文件4)卸载块设备命令umount 举例: umount /dev/vg00/lv_tellin 参数说明: “/dev/vg00/lv_tellin” 块设备文件11) varyonvg unix命令12) 对行进行编号$ cat -b /etc/X11/XF86Config$ cat -n /etc/X11/XF86Config13) 显示非打印字符$ cat -t /etc/X11/XF86Config$ cat -E /etc/X11/XF86Config$ cat -v /etc/X11/XF86Config14) 在sh中打印当前行代码行号echo $LINENO 调试用15) informix 工具dbschema systables 系统表可查所有表信息syscolumns 系统表可查所有列信息16) 内存表识别通过dbfield_dict.memresident字段识别1 驻留内存0 不驻留字段sql=” select a.memresident from dbfield_dict a , dbtable_dict b where a.tabl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市场投诉处理管理制度
- 制造行业设备管理制度
- DB62T 4461-2021 小麦品种 陇紫麦2号
- 虫灾治理方案(3篇)
- 宗祠修缮募资方案(3篇)
- 政协2022工作报告
- 物业资产利用方案(3篇)
- 智能社区标准商品房租赁服务协议
- 成都离婚协议书模板与婚后财产分割监督合同
- 草莓苗绿色种植技术引进与推广合同
- 焊接设备维护与保养试题及答案
- 《民间借贷法规解析》课件
- 环卫人员消防培训课件
- 蓝色简约风美国加征关税
- 规范种植品种管理制度
- 超级电容器知识简介
- 项目关键岗位廉洁风险点及防控措施
- 广东省深圳市罗湖区2025年高三第三次调研测试英语试题试卷含解析
- 数学建模在初中数学教学中的应用
- 配电柜维护保养施工方案范文
- 2025年山东东营市事业单位上半年统考(7.26)历年自考难、易点模拟试卷(共500题附带答案详解)
评论
0/150
提交评论