第42章 shell的使用和编程.ppt_第1页
第42章 shell的使用和编程.ppt_第2页
第42章 shell的使用和编程.ppt_第3页
第42章 shell的使用和编程.ppt_第4页
第42章 shell的使用和编程.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux操作系统精讲,大连理工大学软件学院 邱铁 综合楼413,TelE_mail: 参考教材: Linux应用与开发典型实例精讲 清华大学出版社. 2010.5,第4章LINUX下shell的使用和编程,1.命令的使用 2.Vi编辑器的使用 3.Shell的编程 4.C语言的编程,shell程序设计,shell作为一种编程语言,具有程序的分支结构和循环处理 一.条件判断 二. 条件分支结构 三.循环结构,在shell管理下,我们可能需要将一组命令按某种顺序执行,同时希望能由系统自动完成执行过程,这时我们可以使用编辑器编写一个shell脚本程序文件,UNIX系统

2、将这种文件的后缀规定为“.sh”,可以使用多种方法完成shell程序的运行. 例如: date who ps,一.条件判断,例如: date who ps 1.使用vi编辑器生成一个shell文件,并命名为file.sh 2.执行方式: a.利用输入/输出重定向方式 $ sh file.sh b.将文件file.sh当作sh命令的执行参数来完成程序的运行 $ sh file.sh c.用直接方式执行shell程序 首先修改shell文件的默认权限使其成为用户可执行的程序: $ chmod u+x file.sh $ ./file.sh,例(test1.sh) #!/bin/sh if test

3、 $# = 0 then dir=. else dir=$1 fi echocurrent dir is $dir find $dir -type f -print,系统规定: 如果脚本文件的第一行的头两个字符是#!,那么就用这行后面的说明启动一个命令来解释这个脚本文件中的文本.,条件判断的唯一依据是判定一条命令是否执行成功.判断方法是根据命令执行的返回码,返回0,就算条件成立,返回非0任意值,就算 条件不成立. 内置变量$?:用于返回上个命令执行结束后的返回码的值 用管道线连接的若干命令,shell仅采用最后一个命令执行的返回码,由命令自身的行为决定,1.条件,仅含有一个分支,条件成立或者不

4、成立时执行相应的命令.采用符号 then echo true else echo false fi,4.命令test与命令,命令test可以提供一些常用的条件判断 命令和命令test功能等价,区别是前者要求其最后一个命令行参数 必须为右方括号,test命令主要提供了以下的判断功能.,1)对文件特性的测试 语法格式:test dfrwxsfile -d file-文件file存在且为目录文件 -f file-文件file存在且为普通文件 -r file-文件file存在且为可读文件 -w file-文件file存在且为可写文件 -x file-文件file存在且为可执行文件 -s file-文件

5、file存在且文件长度为非零 例:test d /home/usera 要求:左大括号后面必须有一个空格,右大括号前面必须有分号.list是由一个或者多个命令构成的命令表, 与 ( )区别: a.书写格式不同 b.大括号括起的一组命令是在shell进程中进行,小括号括起的一组命令是在子shell中进行,小括号内命令执行完毕后,子shell就会终止,返回父shell c. 会比( )执行效率高,实例解析,例: DIR=/usr/include/netinet pwd -d $DIR ; pattern 2) pat2-list2; *)default-list; esac 说明: a.模式描述时

6、,使用shell的文件名匹配原则 b.;是一个整体,不可使用空格等分隔 c.在右括号和;之间可以夹着多个命令定义的程序块,本程序块可以 有多个命令,也没必要用大括号或者括号括起. d.可以使用竖线罗列出多个模式 e.当word可以与多个模式匹配时,只执行它所遇到的第一个命令表,例1:向指定的文件中添加信息 #!/bin/sh #filename:test2.sh case $# in 1) cat -n $1; 2) cat -n $1 $2 newtest.sh; *) echo $1 $2 no operation; esac,如果在引用脚本文件时没有携带任何参数,容易引起case语法错误

7、,所以最好带上双引号,示例:test_cat.sh,例2:编写一段shell程序,根据执行时获取的当前时间显示出不同的信息 #!/bin/sh # case 结构 hour=date +%H case $hour in 0123456789|10|11) echo “Good morning!”; 1234567) echo “Good afternoon!”; 189|2012) echo “Good evening!”; *) echo “Good night!”; esac,竖线罗列,示例:test5.sh,二.循环结构,1). while循环: while-do-done结构 2).u

8、ntil循环:Until-do-done结构 3). for循环: for-in done结构,1). while循环: while-do-done结构,语法结构为: whilecondition do commands last-command done 说明: a.关键字必须以独立命令行的首个单词的身份出现,以确保shell会 有机会把它们处理成内部命令 b.do 和done之间的一段程序算作循环体,因此不需要在有多个命令 时加大括号或括号 c.行与行合并时,应注意在行之间加上分号(;),#!/bin/sh #例 while循环 while -r abc.c do echo Before

9、sleep sleep 5 echo sleep done done -r abc.c | echo “abc.c is not read-only-file”,实例解析,2).until循环:Until-do-done结构,until循环与while循环类似,所不同的是until循环只要循环条件为假(非0值),就执行循环体,其语句格式如下: until condition do commands . last-command done,说明: .如果在第一次执行时,循环条件就为真,则循环可能会永远不执行 .必须在程序中设置能使条件为真的因素(注意:对while来讲是判别 条件为假,而unti

10、l是判别条件为真),否则该循环会成为一个无限循环 的死循环程序(若出现此问题用户可以使用kill命令杀死此进程),实例解析,例:编一个程序,查看指定用户是否登录到系统上.如果没有,则在他登录时进行报告 #程序test7:查询用户“*”是否在系统中 # until grep $1 /etc/passwd do sleep 5 done echo $1 is logged on. exit 0,3). for循环: for-in done结构,for 循环的语法格式为: for variable in list-of-values do commands last-command done 循环体

11、被执行多次,给出一个由多个单词构成的表格,每次循环,循环 控制变量取值是表格中的一个单词,若没有指定循环控制变量的取 值表,系统就会用shell的位置变量中的$1,$2,来作为循环控制变量 的取值表. for name for name in $1,$2. do list do list done done,例:列出用户注册目录下的dir1和dir2 子目录中所有C语言源程序文件 #!/bin/sh # 显示*.C 文件 cd $HOME/test for dir in $1 $2 do echo in $dir cd $dir for file in *.c do ls -l $file d

12、one cd . done,例:编写一段shell程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准。 要求: 1.分出不及格、及格、中、良和优秀等 2.所使用的shell语句不限,#!/bin/sh #score.sh echo -e Please enter the score: c while read SCORE do case $SCORE in ?|1-5?) echo Failed! echo -e Please enter the score:c; 6?) echo “Passed!” echo -e Please enter the score:c; 7?) echo M

13、edium! echo -e Please enter the score:c; 8?) echo Good! echo -e Please enter the score:c; 9?|100) echo excellent echo -e Please enter the score:c; *) echo exit; esac done,例.完成一个文件操作,根据用户指定的目录,删除其中所有文件名以“.c”结尾的文件,若这些文件删除后,目录中没有其他的文件,则将该目录也一并删除。,for i in $* ; do find “$i” name “*.c” exec rm r f ; “$i/*” = $i/* 要编译这个程序,我们只要在命令行下执行: gcc hello.c -o hello -o 选项表示要求编译器给输出的可执行文件名为hello -c选项表示只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示要求编译器在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论