vi使用与Shell编程.ppt

上传人:sccc 文档编号:5044034 上传时间:2023-05-31 格式:PPT 页数:62 大小:1.04MB
返回 下载 相关 举报
vi使用与Shell编程.ppt_第1页
第1页 / 共62页
vi使用与Shell编程.ppt_第2页
第2页 / 共62页
vi使用与Shell编程.ppt_第3页
第3页 / 共62页
vi使用与Shell编程.ppt_第4页
第4页 / 共62页
vi使用与Shell编程.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《vi使用与Shell编程.ppt》由会员分享,可在线阅读,更多相关《vi使用与Shell编程.ppt(62页珍藏版)》请在三一办公上搜索。

1、第三章 vi使用与Shell编程,1,1.vi 使用,1.1 vi的启动,例:$vi abc.txt,最常用的格式,vi后跟欲编辑的文件名,vi有搜索命令,可以用来浏览文本文件,比more,less等更方便.,vi filenames,2,1.vi 使用,1.2 vi的工作方式vi的工作方式分命令模式和输入模式。vi启动后就进入命令模式;,i、a等命令,按esc键,3,1.vi 使用,1.2 vi的工作方式处于命令模式时,用户键入的内容被当作vi的命令来解释,一般处于命令模式下按键无回显(以冒号打头的命令和查找命令除外)。编辑命令i,a等,可以从命令模式转到输入模式;处于输入模式时,用户键入的

2、所有内容全部作为输入的正文内容,用户可以输入多行,每输入完一行后按回车键转入下一行,正文输入时有回显。输入完毕,按键盘左上角的esc键,返回到命令模式。,4,1.vi 使用,1.3 vi的编辑命令当vi处于命令模式时,用户的按键不回显,被解释成编辑命令,vi大约有100多个编辑命令。下面介绍的vi命令子集,足可以完成一般的编辑任务。,5,1.vi 使用,1.3 vi的编辑命令,命令i,在当前光标处插入(Insert)正文段,进入输入模式,直至按esc键返回命令模式;命令a,在当前光标后追加(Append)正文段,进入输入模式,直至按esc键返回命令模式;命令o,在当前行之下处插入(Open)新

3、行,进入输入模式,直至按esc键返回命令模式;命令O,在当前行之上处插入(Open)新行,进入输入模式,直至按esc键返回命令模式。,1.3.1 正文插入命令,6,1.vi 使用,1.3 vi的编辑命令,单字符移动h 光标左移一列j 光标下移一行k 光标上移一行l 光标右移一列,多字符移动3h 光标左移3列10j 光标下移10行13k 光标上移13行20l 光标右移20列,1.3.2 光标移动命令,7,1.vi 使用,1.3 vi的编辑命令,B 向后翻页(Backward)F 向前翻页(Forward)U 向上翻半页(Up)D 向下翻半页(Down),1.3.3 翻页命令,2B 向后翻2页(B

4、ackward)5F 向前翻5页(Forward),字母之前的“”表示Ctrl键,可以实现翻多页,在vi中,把向文件尾方向定义为“向前”,向文件头方向定义为“向后”,这与许多人的习惯不同。,8,1.vi 使用,1.3 vi的编辑命令,1.3.4 将光标移至当前行首,1.3.5 将光标移至当前行尾$,1.3.6 移到右一个单词 w W,1.3.7 移到左一个单词 b B,小写命令的w和b,以非字母、数字、下划线之外的所有字符作为“单词”分界符。,大写命令的W和B,以空白符作为“单词”分界符。,w、W、b、B也可以使用5w、10W、3b、13B形式的命令,9,1.vi 使用,1.3 vi的编辑命令

5、,:123 将光标定位到第123行:$将光标定位到文件末尾:$-10 将光标定位到文件倒数第10行:.10 将光标向下移10行,1.3.8 将光标移动到指定行,“$”代表文件末尾而“.”代表当前行;都可以使用“+”或“-”进行相对的位移光标(“+”可以省略)。,10,1.vi 使用,1.3 vi的编辑命令,先把光标移到一个大括号(或括号,或方括号)上,按%键,则光标自动定位到与它配对的那一个括号,对编写和检查C语言的源程序非常有用。,1.3.9 括号匹配命令%,11,1.vi 使用,1.3 vi的编辑命令,1.3.10 删除命令,x删除光标所在的字符5x删除光标所在开始的5个字符,dd删除当前

6、行4dd删除当前行开始的4行,d$从当前光标处删除到行尾d从当前光标处删除到行首dw删除一个单词,12,1.vi 使用,1.3 vi的编辑命令,1.3.11 字符替换命令,r替换光标处字符的命令,R替换多个字符的命令,例:rararbrc,表示什么意思?,例:Rabc然后按“esc”键,从当前光标开始的字符依次替换为abc,13,1.vi 使用,1.3 vi的编辑命令,1.3.12 取消和重复命令,u取消上次的命令(undo),.重复执行上次的命令,14,1.vi 使用,1.3 vi的编辑命令,1.3.13 段落的删除、复制、粘贴和移动命令,dd 行删除命令(delete),co 段落的复制命

7、令(copy),m 段落的移动命令(move),例::11,13dd,例::11,13co15,例::11,13m15,删除11至13行,复制11至13行到15行后,移动11至13行到15行后,15,1.vi 使用,1.3 vi的编辑命令,1.3.13 剪贴板功能,d 行删除命令(delete),y 抽取命令(yank),p 粘贴命令(paste),例::11,13d,例::11,13y,例:p,删除11至13行,复制11至13行用法同“d”命令,将“d”或“y”操作的行粘贴到当前光标处,16,1.vi 使用,1.3 vi的编辑命令,1.3.14 查找命令,/查找“/”后面跟的内容,例:/ab

8、c,在文章中查找“abc”,n向后查找,N向前查找,“n”和“N”命令必须在“/”命令之后执行,17,1.vi 使用,1.4 vi的文件命令,ZZ保存文件并退出vi编辑状态:wq保存文件并退出vi编辑状态,:w只保存文件而不退出vi编辑状态:q!不保存文件而强行退出vi编辑状态,:r filename读入filename文件内容到当前行,18,2.Shell 编程,2.1 什么是Shell,Shell是一个命令行解释器,为系统解释用户的操作命令;Shell是用户使用UNIX系统的桥梁;Shell既是一种命令语言,又是一种程序设计语言;,19,2.Shell 编程,2.2 什么是Shell编程,

9、Shell编程是利用判断、流程控制等方法把多个Shell命令有机的组织成Shell脚本;Shell脚本类似于Windows系统中的批处理程序,通过执行Shell脚本来完成一系列Shell命令;,例:#!/bin/sh#Name:echohello.sh#Usage:print Hello,World#Author:Gene#Date:2005-03-18#echo Hello,World!,20,2.Shell 编程,2.3 Shell脚本的执行,脚本文件本身是一个文本文件,不可能直接执行。当脚本文件具有可执行属性,用户将它执行的时候,系统会启动shell程序文件/bin/sh,运行/bin/

10、sh文件中的CPU指令来解释执行脚本文件中的命令。脚本文件的第一个命令需要指明Shell命令解释程序:#!/bin/sh,“#!”必须出现在本文的最开头。,21,2.Shell 编程,2.3 Shell脚本的执行,三种方法可以执行脚本文件,例:$sh echohello.sh$sh echohello.sh$./echohello.sh,需要为echohello.sh脚本文件赋予“可执行”属性,22,2.Shell 编程,2.3 Shell脚本的执行,用vi编辑了Shell脚本之后,由于Shell脚本没有“可执行”属性,所以还无法执行;,例:chmod a+x echohello.sh,运行c

11、hmod命令为“echohello.sh”Shell脚本赋予“可执行”属性,23,信息流,在UNIX系统中,对输入输出信息流作了如下定义,系统启动Shell程序时缺省给定了3个标准流,标准输入流(stdin),标准输出流stdout,标准错误流stderr。,shell输入输出重定向,默认状态下,shell将命令的输入流设定为键盘,输出流设定为显示器,错误流也定义为显示器。但是在有些情况下,我们可以改变这些流的设定。改变流的设定常用的符号有,三个符号。,例如:ls-l ls.txt,ls-l/home/user1 ls.txt,ls-l/home/user1 ls.txt,shell输入输出重

12、定向,重定向符表示将标准输入从键盘重新定义到另外的流。例如:prog infile,即prog命令将从文件infile中读取参数。执行一个shell程序也可以使用这种方式。例如 sh user1.sh 就表示要执行user1.sh这个shell程序。,重定向符,也能够混合使用,例如:prog outfile 表示prog命令从infile中获取命令参数,然后将执行结果输出到文件outfile中。,错误流重定向,在UNIX系统中,错误信息流是指在命令或程序执行中出现错误时系统给出的提示或警告信息,UNIX中将它们作为一个独立的标准输出流进行定义,错误信息流通常定义为显示器。当然,用户也可以根据需

13、要对它进行重定向。不同的shell在这方面有所不同。,Cshell中使用的错误流重定向符是:&,例如:cc abc.c&log.txt,即将编译过程中的输出流和错误流定向为log.txt文件。在Bshell中则不用,需要如下书写:cc abc.c 2&1 log.txt,管道线处理,管道线可以实现将一个程序或命令的输出作为另外一个程序或命令的输入,管道线作为两个命令之间的分隔符。管道线的符号是“|”。,例如有这样一组命令:$ls l tempfile$wc l tempfile$rm tempfile,管道线处理:$ls-l|wc-l,管道线处理,除此之外,还有“;”、“&”、“&”、“|”可

14、替代管道线“|”作为命令列表的分隔符.其中:“;”:表示多个命令顺序执行“&”:命令行尾输入,表示将命令的执行过程放到后台处理。“&”:代替原有的符号“|”,表示当左边的命令为“真”值时,执行右边的命令。“|”:代替原有的符号“|”,表示当左边的命令为“假”值时,执行右边的命令。,管道线处理,例如:(a)pwd;who;ls l(b)cc prgm.c&(c)write zhang letter|mail zhang letter(d)mail zhang letter&rm letter,2.Shell 编程,2.4 Shell的变量的定义、赋值与引用,变量的定义与赋值 变量名以字母开头,由

15、字母、数字及下划线组成;变量名可以包含数字,但不能以数字打头。shell的变量只有字符串型,在shell程序中出现的数值计算都是基于字符串类型来完成的。,例:ux=hello,变量的引用在变量名前加“$”,例:echo$ux,例:echo$uxworld 或 echo“$ux”world,31,在某些场合下,为了明确表示对shell变量的引用,可以用花括弧或者双引号将变量括起来,例如:$echo$UNIX$echo$UNIXAaaaaa$echo“$UNIX”is very good,SYSTEM V,SYSTEM VAaaaaa,SYSTEM V is very good,2.Shell 编

16、程,2.4 Shell的变量的定义、赋值与引用,清除变量unset,例:unset ux,转义字符“”,例:echo$ux,例:echo$ux,结果为:hello,结果为:$ux,33,2.Shell 编程,2.5 Shell的变量中三种引号的作用,例:echo$ux结果为:$ux echo“$ux is date”结果为:hello is wed Aug 16 16:20:12 echo$ux结果为:报错,找不到$ux这个命令 name=whoami 结果为:john echo$name,单引号():屏蔽任意字符的特殊含义;双引号(“”):屏蔽任意字符的特殊含义,除了$、;反引号():(一般

17、在键盘最左上角esc键下方)其间的命令可作为执行结果进行赋值,与()的功能一样;,34,同其他的编程语言如C,pascal一样,shell的变量也有局部变量和全局变量的区别。通常在一个shell程序中,通过形如var1=abc方式定义的都是局部变量,只能在该shell程序的进程中起作用,要定义全局变量,需要在局部变量定义之后使用export 命令来将这个变量声明为全局的:export$var1以下面的例子var.sh,我们来说明全局变量和局部变量的区别和使用$var1=csu$echo$var1$sh$echo$var1$exit$echo$var1$export$var1$sh$echo$v

18、ar1,第一个echo显示的是 csu,这是通常的用法,第三行,调用sh进入一个新的shell进程,第四行的echo显示为空,因为var在这个进程中并没有进行定义,第五行,调用exit退出新建的shell回到原来shell的进程中,第六行的echo又能够正常显示了,第七行调用export,将var1定义为全局的,这样在新建的shell中,var1也能访问,,最后一行显示出csu,2.6 Shell中变量的作用域,2.Shell 编程,2.6 系统默认的内置变量,$#传递到脚本的参数个数;$*以一个单字符串显示所有向脚本传递的参数;$脚本运行的当前进程ID号;$!后台运行的最后一个进程的进程ID

19、号;$与$*相同,但是以多个字符串显示所有向脚本传递的参数,每个字符串为一个参数;$-显示shell使用的当前选项,与set命令功能相同;$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误;,36,2.Shell 编程,2.6 系统默认的内置变量,例:#!/bin/sh#Name:var.sh#Usage:Test the reserved parameters#echo There are$#parametersecho The parameters are$echo The Shells PID is$echo Test finished!,37,2.Shell 编程,2.7

20、 测试文件状态,test condition condition,“”或“”与条件“condition”之间必须有空格,测试内容:-d目录-s文件非空-f正规文件-w可写-L符号链接-u文件有suid设置-r可读-x可执行,38,2.Shell 编程,2.7 测试文件状态,例:test-r/home/UnixProgram/main.c&echo readable-r/home/UnixProgram/main.c&echo readable,测试命令,测试命令,测试内容,测试内容,被测试目标,被测试目标,最简单的条件判断cmd1&cmd2 若cmd1执行成功(返回码为1)则执行cmd2,否则

21、不执行cmd2。cmd1|cmd2 若cmd1执行失败(返回码不为0)则执行cmd2,否则不执行cmd2。,39,2.Shell 编程,2.7 测试文件状态,测试文件状态时使用的逻辑操作符-a:逻辑与,操作符两边均为真,结果为真;只要有一边为假,结果为假;两边均为假,结果为假;-o:逻辑或,操作符两边为假,结果为假;只要有一边为真,结果为真;两边均为真,结果为真;!:逻辑否,条件为假,结果为真。,例:-r main.c-a-f main.c&echo main.c is a file-w main.c-o-r main.c&echo Get it,40,2.Shell 编程,2.7 测试文件状

22、态,例:-r main.c-a-f main.c&echo main.c is a readable file-w main.c-o-r main.c&echo mai.c is a normal file!-d main.c-a-x main.c|echo main is an executable file,测试多个文件状态的逻辑操作命令,“!”与“”之间,-a与“-x”之间都必须有空格,41,2.Shell 编程,2.8 测试字符串,test op string op string,测试内容op:=两个字符串相同!=两个字符串不相同-z空串,test string1 op string2

23、 string1 op string2,注意:不是“=”,42,2.Shell 编程,2.8 测试数值,测试内容op:-eq 数值相等(=)-ne 数值不相等(!=)-gt 前者大于后者()-lt 前者小于后者()-le 前者小于等于后者()-ge 前者大于等于后者(),test number1 op number2 number1 op number2,43,2.Shell 编程,2.8 测试数值,44,2.Shell 编程,2.8 与()的使用,当使用&或|时,需要在条件分支中完成多个动作,执行若干个命令,就需要使用类似复合语句的构造,在shell中使用大括号。,书写规则1:-f main

24、.c,书写规则2:-f main.c&pwdlsrm main.c-f,必须有空格,必须有“;”,回车,()的使用没有这么多限制;但 的执行效率高,45,2.Shell 编程,2.8 expr计算表达式的值,B-shell本身没有提供数学运算和字符串运算的能力,所有这些运算都是借助于命令expr完成的;expr支持算术运算(+、-、*、/),取余数(%),以及数值比较的关系运算(=、);expr的运算优先级和C语言一样:乘除法优先级最高,其次加减法,然后是关系运算。关系运算的结果是expr打印1(关系成立)或者0(关系不成立);也可以使用括号。,46,2.Shell 编程,2.8 expr计算

25、表达式的值,例1:求“a*(b+c)”a=1b=2c=3x=expr$a*($b+$c),例2:在例1的基础上判断x是否大于20 expr$x 20=0&echo$x=$x is less than 20,注意:在expr表达式中,变量与转义符、操作符之间用空格分隔,47,2.Shell 编程,2.9 条件结构if-then-elif-fi,语法1 if 条件1;then命令1 elif 条件2;then命令2 else命令3fi,语法2 if 条件1then 命令1 elif 条件2then 命令2 else 命令3fi,条件与“then”在一行的,条件之后必须加“;”,48,2.Shell

26、 编程,2.9 条件结构if-then-elif-fi,49,2.Shell 编程,2.10 case结构,语法 case 条件 in条件1)命令1;条件2)命令2;esac,“esac”是“case”的反写,可以是多个命令串,50,2.Shell 编程,2.10 case结构,一定要加上双引号,如果在引用这个脚本文件时没有携带任何参数,那么$1就会是空字符串,这种情况下省略了双引号就会导致case行语法错误。,51,2.Shell 编程,2.11 while循环结构,语法 while 条件do命令1命令2 done,52,2.Shell 编程,2.11 while循环结构,例:#!/bin/

27、sh#Name:while.sh#Usage:Test while-do-done#a=10while$a-gt 0 doecho$a=$aa=expr$a-1sleep 1done,53,2.Shell 编程,2.12 for循环结构,语法 for name in word1 word2 do命令1命令2 done,循环控制变量,循环条件表格:每一次循环name取表格中的一个值,54,2.Shell 编程,2.12 for循环结构,例:#!/bin/sh#Name:for.sh#Usage:Test for-do-done#for file in./*doecho$filedone,打印当前

28、目录下的所有文件,55,2.Shell 编程,2.13 break、continue和exit的使用,命令break、continue用在循环结构for和while中使用,与C语言中的beak和continue流程控制功能类似。break退出循环;continue退出当前循环进入下一次循环。exit命令用来终止Shell程序;exit后面的参数,就是Shell脚本程序结束的返回值。,56,2.Shell 编程,2.14 Shell函数,语法name()cmd1;cmd2;或name()cmd1cmd2,57,2.Shell 编程,2.14 Shell函数,在调用函数时,引用函数的名字,可以附加

29、上0到多个参数,在函数体内部以位置变量$1,$2,或$*,$方式引用函数的参数。函数体内部可以使用内部命令return,使函数有返回码,返回码0代表成功,非零表示失败。函数体内一个函数不能调用它自己。shell函数不允许递归调用。,58,2.Shell 编程,2.14 Shell函数,例:#sum()ret=expr$1+$2if$#-lt 2 thenecho Please input two parameterselsesum$1$2echo“$1+$2=$ret”fi,函数头,函数体,调用函数,59,2.15 Shell程序调试,shell程序是一种解释性语言,它的执行是逐行进行的,程序

30、中是否有语法错误,不执行到那一行系统是无法知道的。C,pascal等高级语言是有编译过程的,程序中的语法错误在编译阶段就能检测出来,因此比shell更容易调试shell程序通常有三种调试方法:,1)交互式调试 shell程序中使用的命令都能在命令行中运行,所以对于一些不很熟悉的命令和语法可以先用命令进行验证,然后再编写到shell程序中,这种调试方法称为交互式调试,也是最简单的一种调试方法。,2.15 Shell程序调试,2)在编辑过程中不断调试执行所编辑的shell程序 在UNIX系统中可以打开多个工作窗口。我们可以在一个窗口中用vi等编辑器进行编辑,然后在另一个连接窗口中执行该shell程

31、序,这样可以随时观察到已经编写的部分是否正确。最终完成这个shell程序的编写。,3)用shell程序提供的跟踪功能进行调试 shell程序可以使用-v-x 选项对shell程序进行跟踪-v:当读入shell输入行时把它们显示出来,完成详细跟踪。Shell程序在完成这段程序执行时首先逐行读入执行的命令,并在标准输出上显示该命令要执行的实际内容,然后执行该命令。如果没有语法错误,执行将一直进行下去直到完成shell的执行。-x:执行命令前先把命令和它们的参数显示出来,2.15 Shell程序调试,假设有这么一个简单的shell,叫test1.sh date echo$PATH我们用-v参数来调试

32、,执行sh-v test1.sh那么输出就应该是:date Mon Sep 8 9:55:01 Linux9 2003 echo$PATH/usr/bin:/usr/ucb/bin:/home/user1shell在执行date前先显示该命令然后显示date的执行结果,接着显示echo$PATH以及它的执行结果。,如果用-x参数来执行这个shell,执行 sh-x test1.sh则系统的输出将是:+date Mon Sep 8 9:55:01 Linux9 2003+echo/usr/bin:/usr/ucb/bin:/home/user1/usr/bin:/usr/ucb/bin:/home/user1 date这一行没有参数,所以只显示命令 echo这一行有参数$path,被直接替换成了参数的值。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号