版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、UnixUnix 系列系列 shellshell 程序编写从入门到精通程序编写从入门到精通( (中中) )本文关键字:本文关键字:3在 Shell 中使用数据变量用户可以在 Shell 中使用数据变量,例如 ba.sh 程序:cd/usr/icewalkls|cpio -o /dev/fd0该程序中要备份的目录为一常量,即该程序只能用来备份一个目录。若在该程序中使用变量,则会使其更通用:workdir=$1cd $workdirls * |cpio -o /dev/fd0通过这一改变,用户可以使用程序备份变量$workdir 指定的目录。例如我们要备份/home/www 的内容,只要运行 ba
2、.sh /home/www 即可实现。(若不明白$1,下面将详细介绍 shell 参数的传递,$1 代表本 sh 程序-ba.sh 的第一个参数)4在 Shell 程序中加上注释为了增加程序的可读性,我们提倡加入注释。在 Shell 程序中注释将以#号开始。当 Shell 解释到#时,会认为从#号起一直到该行行尾为注释。5对 Shell 变量进行算术运算高级语言中变量是具有类型的,即变量将被限制为某一数据类型,如整数或字符类型。Shell 变量通常按字符进行存储,为了对 Shell 变量进行算术运算,必须使用 expr 命令。expr 命令将把一个算术表达式作为参数,通常形式如下:expr由于
3、 Shell 是按字符形式存储变量的,所以用户必须保证参加算术运算的操作数必须为数值。下面是有效的算术操作符:两个整数相加-第一个数减去第二个数*两整数相乘/第一个整数除以第二个整数%两整数相除,取余数例如:$expr 2 1结果显示:3$expr 5 - 3结果显示:2若 expr 的一个参数是变量,那么在表达式计算之前用变量值替换变量名。$int=3$expr $int 4结果显示:7用户不能单纯使用*做乘法,若输入:$expr 4*5系统将会报错,因为 Shell 看到*将会首先进行文件名替换。正确形式为:$expr 4 * 5结果显示:20多个算术表达式可以组合在一起,例如:$expr
4、 5 7 / 3结果显示:7运算次序是先乘除后加减,若要改变运算次序,必须使用号,如:$int=expr 5 7$expr $int/3结果显示:4或者:$expr expr 5 7/3结果显示:46向 Shell 程序传递参数一个程序可以使用两种方法获得输入数据。一是执行时使用参数。另一种方法是交互式地获得数据。vi 编辑程序可以通过交互式的方法获得数据,而 ls和 expr 则从参数中取得数据。以上两种方法 Shell 程序都可以使用。在交互式读入数据一节中将介绍 Shell 程序通过交互式的方法获得参数。通过命令行给 Shell 程序传递参数可以扩大程序的用途。以前面提到的ba.sh 程
5、序为例:$cat re.shcd $workdircpio -i re2.shcd $workdircpio -i $1 re3.shcd $workdircpio -i $* if - then 语句格式: if command1thencommand2command3fi-(if 语句结束)command4每个程序或命令执行结束后都有一个返回的状态,用户可以用 Shell 变量$?获得这一状态。if 语句检查前面命令执行的返回状态,若该命令成功执行,那么在 then 和 fi 之间的命令都将被执行。在上面的命令序列中,command1 和command4 总要执行。若 command1 成
6、功执行,command2 和 command3 也将执行。请看下面程序:#unload -program to backup and remove filescd $1ls -a | cpio -o /dev/mnt0rm *该程序在备份资料后,删除档案,但当 cpio 命令不能成功执行时,rm 命令还是把资料删除了,我们可不希望这样,为了避免此情况,可以用 if -then 语句:#-卸载和判断删除程序cd $1if ls -a | cpio /dev/mnt0thenrm *fi本文关键字:本文关键字:上面程序在 cpio 执行成功后才删除档案同时,若执行没有成功,我们希望得到提示,sh
7、中的 echo 命令可以向用户显示消息,并显示后换行,上面程序可以写成:#-卸载和判断删除程序cd $1if ls -a | cpio /dev/mnt0thenecho 正删除文件资料. .rm *fiecho 命令可以使用一些特殊的逃逸字符进行格式化输出,下面是这些字符及其含义:bBackspacec显示后不换行f在终端上屏幕的开始处显示n换行r回车t制表符v垂直制表符反斜框0nnn 用 1,2 或 3 位 8 进制整数表示一个 ASCII 码字符2if - then - else 语句不用多说它的作用,别的高级语言中都有,格式为:if command1thencommand2comman
8、d3elsecommand4command5fi在此结构中,command1 中是先执行,当 command1 成功执行时,将执行command2 和 command3,否则执行 command4 和 command5注意看下面程序:#备份程序cd $1if ls -a |cpio -o /dev/mnt0thenecho 删除源资料. .rm *elseecho 磁带备份失败!fi3test 命令进行条件测试if 语句可以通过测试命令执行的返回状态来控制命令的执行,若要测试其他条件,在 bsh 中可以使用 test 命令。该命令检测某一条件,当条件为真时返回 0,否则返回非 0 值。test
9、 命令可以使 Shell 程序中的 if 语句象其他程序语言中的条件判断语句一样,具有很强的功能。test 命令的使用方法为:test condition可测试的条件分为 4 类:1)测试两个字符串之间的关系。2)测试两个整数之间关系。3)测试文件是否存在或是否具有某种状态或属性。4)测试多个条件的与(and)或(or)组合。欢迎光临八一学习网八一学习网,点击这里点击这里查看更多文章教程1、条件语句test 语句1测试字符串间的关系bsh 把所有的命令行和变量都看作字符串。一些命令如 expr 和 test 可以把字符当作数字进行操作。同样任何数字也可以作为字符串进行操作。用户可以比较两个字符
10、串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下:str1 = str2当两个串有相同内容、长度时为真str1 != str2当串 str1 和 str2 不等时为真-n str1当串的长度大于 0 时为真(串非空)-z str1当串的长度为 0 时为真(空串)str1当串 str1 为非空时为真不但 Shell 程序可以使用 test 进行条件判断,test 命令也可以独立执行,如:$str1=abcd$test $str1 = abcd$echo $?结果显示:0与上例中第一行赋值语句中的等号不同,test 命令中的等号两边必须要有空格。本例 test 命令共有 3 个参数。注
11、意两个串相等必须是长度和内容都相等。$str1=abcd $test $str1 = abcd$echo $?结果显示:1上面 str1 包含 5 个字符,其中最后一个为空格符。而 test 命令中的另一个串只有 4 个字符,所以两串不等,test 返回 1。不带任何操作符和使用-n 操作符测试一个串结果是一样的,例如:$str1=abce$test $str1$echo $?结果显示:0$test -n $str1$echo $?结果显示:0但是,上面两条命令也有一点差别,反映出了使用 test 命令潜在的问题,请看下例:123123$str1=$test $str1$echo $?结果显示
12、:1$test -n $str1$echo $?结果显示:0$test -n $str1结果显示:test:argument expected上例中,第一次测试为假因为 Shell 在执行命令行之前首先要进行变量替换,即把$str1 换成空格,然后 shell 又将命令行上的空格删除,故 test 命令测试到的为空串。而在第二次测试中,变量替换后空格位于括号内,故不会被删除,test 测试到的是一个包含空格的串,在第三次测试中,shell 把空格删除,只把-n 传个 test 命令,所以显示参数错。2测试两个整数之间关系test 命令与 expr 命令一样,也可以把字符转变成整数,然后对其操作
13、。test 命令对两个数进行比较,使用的操作符如下:int1 -eq int2两数相等为真int1 -ne int2两数不等为真int1 -gt int2int1 大于 int2 为真int1 -ge int2int1 大于等于 int2 为真int1 -lt int2int1 小于 int2 为真int1 -le int2int1 小于等于 int2 为真下面的例子反映了字符串比较与数字比较的不同:本文关键字:本文关键字:$str1=1234$str2=01234$test $str1 = $str2$echo $?结果显示:1$test $str1 -eq $str2$echo $?结果显
14、示:03有关文件的测试使用 test 进行的第三类测试是测试文件的状态,用户可以测试文件是否存在,是否可写以及其他文件属性。下面是文件测试时使用的选项。注意只有文件存在时,才有可能为真。-r file用户可读为真-w file用户可写为真-x file文章整理文章整理: :八一学习网八一学习网 http:/http:/ (本站)用户可执行为真-f file文件为正规文件为真-d file文件为目录为真-c file文件为字符特殊文件为真-b file文件为块特殊文件为真-s file文件大小非 0 时为真-t file当文件描述符(默认为 1)指定的设备为终端时为真4复杂的条件测试(and 、
15、or 、not)-a与-o或!非就是组合条件了,任何高级语言中都有的(NOT 、AND 、OR),例如:$test -r em.null -a -s em.null$echo $?结果显示:1说明了 em.null 并不是可读并且非空的文件5另一种执行 test 的方法bsh 中还有另一种执行 test 命令的方法,就是把测试条件放到一对中,例如:$int1=4$echo $?结果显示:0要注意在符号的前面要有一个空格。下面我们用 test 命令写个简单但比较完善的程序:#- 备份程序#- 检查参数ifthenecho 请在程序名后面指出要备份文件所在目录!exit 1fi#- 检查目录名是否
16、有效ifthenecho $1 不是一个目录!exit 2ficd $1ls -a | cpio -o /dev/mnt0ifthenrm *elseecho cpio 执行不成功!备份失败.exit 3fi6空命令在 Bsh 中用 : 代表空命令,就是充个数,什么都不做7嵌套 if 语句和 elif 结构检查条件 1A:当条件 1 为真,则执行一部分操作B:若条件 1 为假,检查条件 21)若条件 2 为真,执行另外一部分操作2)若条件 2 为假,检查条件 33)若条件 3 为真,执行其他一部分操作语法如下:if commandthencommandelseif commandthencom
17、mandelseif commandthencommandfififi8elif 语句嵌套 if 语句有时会给用户带来混乱,特别是什么时候 fi 语句很难判断。因此 Bourne Shell 又提供了 elif 语句。elif 是 else-if 的缩写,它表示是 if语句的继续。格式为:if commandthencommandelif commandthencommandelif commandthencommandfi上面介绍的嵌套 if 语句和 elif 语句完成相同的功能,用户可以根据自己的喜好选择一种使用。9case 语句前面说的 elif 语句替代 if-then-else 语句
18、,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个 elif 语句实现,但还有一种更简单的方法就是用 case 语句。case 语句不但取代了多个 elif 和 then 语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case 语句使用的语句。case value inpattem 1)commandcommand;pattem 2)commandc 欢迎光临八一学习网八一学习网,点击这里点击这里查看更多文章教程ommand;.pattem)command;esaccase 语句只执行其中的一组命令,当变量值与多个模式相匹配时
19、,只有第一个匹配的模式对应的命令被执行。;表示该模式对应的命令部分程序。通过学习下面的 read 语句,我们们再举例子说明 case 语句的用法。10read 语句Shell 程序不但可以通过命令行参数得到输入数据,还可以使用 read 命令提示用户输入数据,其语法格式为:read var1 var2. .varn当 Bsh 遇到一个 read 语句时,在标准输入文件中读取数据直到一个换行符。此时 Shell 在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空格。然后 Shell 将输入行的第一个字的内容给变量 1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字
20、的个数超过变量个数,Shell 将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分隔的一个字母和数字组成的字符串。本文关键字:本文关键字:$read var1 var2 var3输入:Hello my friend$echo $var1 $var2 $var3结果显示:Hello my friend$echo $var2结果显示:my下面用个 read 和 case 的例子结束本部分的学习:#-交互式备份,恢复程序echo 输入要备份文件所在目录:cread WORKDIRifthenecho Sorry,$W
21、ORKDIR is not a directoryexit 1ficd $WORKDIRecho 输入选择:echo _echo 1.恢复到 $WORKDIRecho 2.备份 $WORKDIRecho 0.退出echoecho cread CHOICEcase $CHOICE in1)echo 恢复中. .cpio -i /dev/mnt0;0)exit 1*)exit 1esacifthenecho 程序运行中出现错误!elseecho 操作成功!fi在上面代码中,*定义了其他模式下不匹配时的默认操作。循环语句前面介绍的程序和所学的语句都是从头到尾成一条主线下来,或是成分支结构,在日常管理
22、 UNIX 的过程中,经常要重复的做一些操作,处理批量的问题,这就涉及到了循环结构,同高级语言相似,UNIX 的 Shell 也提供了强大的循环处理语句。Bsh 语言中有三种循环语句-while 循环、until 循环、for 循环,下面通过具体的例子分别介绍这三种结构。While 循环在 while 循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下:while commanddocommandcommand done示例代码如下:#测试 while 循环小程序x_t=1whiledomm= expr $x_t * $int #注意的作用echo $mmx_t= expr $x_t 1 #注意 expr 的用法doneecho THE WHILE IS END!n程序的执行结果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年政府部门财务报告-报表附注和财务分析
- 2026年幼儿园校车演练总结
- 2026年人工智能训练师(四级)基础理论真题及答案
- 2026年网络工程师《网络规划》阶段测试结合培训试卷
- 2026年幼儿园防汛演练总结2000字(8篇)
- 柴远复方颗粒治疗肝阳上亢型高血压病的疗效、安全性及作用机制探究
- 柳工在印度市场的竞争战略:机遇、挑战与突破路径
- 柚皮苷对糖尿病心肌病大鼠心肌的重塑与心功能改善机制探究
- 柔性桨叶搅拌槽内流固耦合特性的深度剖析与优化策略
- 染料木素对人结肠上皮系HT29细胞炎症调控及Akt-NF-κB通路机制研究
- 第十五届全国电力行业职业技能竞赛(碳排放管理员)考试题库(含答案)
- 敦煌文化之旅智慧树知到期末考试答案章节答案2024年杭州师范大学
- 【S医药公司销售人员招聘体系优化探究开题报告文献综述9800字】
- 重力坝毕业设计
- T-CSEM 0024-2024 智慧消防 火灾防控系统建设要求
- 动脉取栓术后护理查房课件
- 《电机原理及拖动(第3版)》彭鸿才(习题与思考题解答)
- GB/T 18926-2008包装容器木构件
- 朱自清:桨声灯影里的秦淮河课件
- 配饰礼仪课件
- 领导科学正式完整版课件
评论
0/150
提交评论