1、第八章 shell编程,Vi编辑器 Shell概述 Shell编程,vi编辑器,文本编辑器用于用户建立或者设定文本文件,Linux系统提供了两种系统环境:文字环境与图形环境,但对于Linux系统管理员来说,在文字环境操作方式下可以高效地完成所有的任务。,对于要求做服务器主机,使用字符界面不用启动图形工作环境,大大地节省了系统资源开销; Linux系统中提供行编辑器(ed、ex、edit)和屏幕编辑器(vi),vi汇集了行编辑器和屏幕编辑器特点,是Linux下最正规的文字接口下的文书处理器,也是Linux系统中最常用的编辑器。,vi的工作模式,vi是Linux(UNIX)世界最强大的文本编辑工具
2、,vi是visual的缩写,是一个全屏幕文本编辑器。vi有两种工作模式:编辑模式和指令模式。编辑模式用来输入和编辑文字资料,而指令模式则用来下达一些编排文件、存盘以及退出vi等操作指令。 1编辑模式编辑模式是用来输入和编辑文件的模式,屏幕上会显示用户的键入,按键不是被解释为命令执行,而是作为文本写到用户的文件中。,vi的工作模式,2指令模式指令模式是用来编辑、存盘和退出文件的模式。运行vi后,首先进入指令模式。此时输入的任何字符都被视为指令对待,键入的命令不会在屏幕上显示。 3状态行状态行:屏幕底部一行,通常是第24行,被vi编辑器用来反馈编辑操作结果。错误消息或者提供信息的消息会在状态行中显
3、示出来。vi还会在24行显示那些以冒号“:”或者问号“/”开头的命令。如果从指令模式切换到编辑模式,则可以按“Insert”键;如果从编辑模式切换到指令模式,则可以按“Esc”键。如果不能断定目前处于什么模式,则可以多按几次“Esc”键,这时系统会发出蜂鸣声,证明已经进入指令模式。,vi的使用,1启动vi在虚拟终端的系统提示字符下键入vi text.txt,按Enter键,系统进入vi的初始画面,屏幕显示如图进入vi的初始画面。studentUbuntu:$vi test.txt注意:如果是新建档案会显示“ New File”,如果text.txt是已经存在的文件,则会显示目前的文件名、行数与
4、字符数。,2按下 i 进入编辑模式,开始编辑文字 进入vi编辑器时,处于命令模式,从键盘输入的字符都被作为命令。通过输入I, o, a等单个字符,就可以进入编辑方式,这时从键盘输入的字符都被当作文件的正文。,3按下“ESC”键到指令模式 用户编辑文本完毕了,按下“ESC”键到可以退回指令模式。如果不能断定目前处于什么模式,则可以多按几次“Esc”键,这时系统会发出蜂鸣声,证明已经进入指令模式。,4退出vi 要离开vi可以在指令模式下键入“:q”,“q!”或“:wq”离开(注意冒号)。键入冒号后,在屏幕的最末尾一行会出现冒号提示符,等待用户键入指令,输入完指令后回车,vi就会执行该指令。 退出指
5、令含义: :q 如果用户只是读文件的内容而未对文件进行修改,可以使用“:q”退出vi;如果用户对文件的内容作了修改,而用“:q”退出时,那么vi在屏幕的底行会提示信息“No write since last change(:q! overrides)”。 :q! 如果用户对文件的内容作了修改,然后决定要放弃对文件的修改,可以使用“:q!”强行退出vi,在这种情况下文件原来的内容不变。 :wq 用户在编辑结束时,用“:wq”命令保存文件至磁盘,然后退出vi。 :w! vi编辑器强行覆盖一个已存在的文件。,5移动光标不管处于什么模式下,四个方向键是最常用的光标移动键,为了进行文本的编辑修改,还有退
6、格键及组合键等其他按键可以移动光标,可以参考vi手册说明,这里不再赘述。,删除操作,x 删除光标所在的字符 dw 删除光标所在的单词 d$ 删除光标至行尾的所有字符 D 同 dd 删除当前行,拷贝与粘贴,/yw 将光标所在的单词拷入剪贴板 y$ 将光标至行尾的字符拷入剪贴板 Y 同 yy 将当前行拷入剪贴板 p 将剪贴板中的内容粘贴在光标后 P 将剪贴板中的内容粘贴在光标前,其他命令,:set nu 显示行号(设置行号) nG 跳到第 n 行 U 撤消(undo) . 重做 (redo) nyy 拷贝 n 行 :e filename 创建新文件 :n filename 加载新文件,vi 命令补
7、充,Shift+g 光标移动到文件结尾 gg 光标移动到文件开始 w 下一个单词 $ 光标到该行结尾 Shift+a 到该行结尾并进入插入模式 3+x 删除三个字符 3+dd 删除三行 3+yy 复制三行 3+p 复制三遍,课堂练习,使用vi编辑器创建一个新文件,文件名为watermarking+自己的学号,内容为: watermarking 自己的学号 watermarking watermarking watermarking watermarking watermarking watermarking watermarking watermarking watermarking wate
8、rmarking watermarking watermarking watermarking,Shell概述,想想:当计算机播放音乐这个过程需要什么? 声卡,没有声卡怎么播放东西 操作系统,当然还要相关的声卡驱动程序。操作系统通过管理驱动程序管理设备,内存等与硬件相关的东西 还要什么?就是你呐!没有用户发出命令操作系统怎么知道播放 但是操作系统怎样识别用户发出的指令呢?也就是说,比如你输入一个指令:ls l,操作系统怎么知道你要列出文件信息呢?因此在操作系统与用户之间还要一个界面:他把用稍微人性化的语言或操作转换为操作系统能够识别的操作。在文本环境,这个沟通的工作,就是由shell完成 。,
9、Shell关系图,什么是Shell,Shell原意为外壳,用来形容物体外部的架构,Linux系统的Shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 1. Shell可称为命令解释器:负责用户和操作系统之间的沟通,把用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,所以,它拥有自己内建的Shell命令集,也能被系统中其他应用程序调用。 2. Shell还是一种高级程序设计语言:它有变量、关键字,有各种控制语句,如if、case、while、for等语句,有自己的语法结构。利用Shell程序设计语言可以编写出功能强大的代码
10、程序。,常用的Shell,1Shell种类Linux中的Shell有多种类型,其中最常见的是Bourne Shell(sh)、C Shell(csh)和Korn Shell(ksh)。三种Shell各有优缺点。 Bourne Shell是Unix最初始的Shell,并且在每种Unix上都可以使用。Bourne Shell在Shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种Shell。 Bash(Bourne Again Shell)是Bourne Shell的扩展,与Bourne Shell完全向下兼容,并且增加了许多特性。它还包含了很多C Shell和Korn Shell中
11、的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。,1Shell种类,(1)查看目前Shell版本。 studentUbuntu:$echo $SHELL /bin/bash 前面已经介绍,用户默认选择的shell版本可以在/etc/passwd设定。 (2)临时改变Shell版本为csh。 studentUbuntu:$csh % csh的提示符为“%”,退出Shell使用命令exit。,创建shell脚本文,例:#Vi first.sh 其中,后缀名.sh不是必须的,但为了规范最好加上后缀.sh,修改权限,例:chmod a+x first.sh a 代表所有的用户 u 所有者 g
12、 所有者所在的组 o 其他用户 x 代表可执行,修改权限,例:chmod 771 first.sh 777 代表把所有权限加上 r = 4 w = 2 x = 1 Chmod 111 first.sh,用于在屏幕上显示消息,echo “”,引用变量,$ 符号用于引用一个变量的内容Valuable1 = $valuable2,读入值给变量,在执行shell脚本时,shell还允许用户从键盘中输入一个值给变量。可以使用read来做。 例:read fname 当shell脚本运行到这里的时候,终端会闪烁,等待用户敲入内容,输入的内容存在变量 fname 中。,添加注解,例:#This is a c
13、omment,。,命令替换,在单个命令行中使用多个命令的方法(非管道)是通过命令替换 例:echo “The date is date” 反引号(在键盘的左上角,波浪线下) The date is 2011-12-9,练习,1.编写一个以自己学号命名的shell脚本: 开头添加注释:This is xxxs first shell! 功能:保存用户信息 提示用户输入用户名; 读取用户名; 在屏幕上提示用户输入的用户名; 提示用户输入密码; 读取用户密码; 将用户名和密码保存在mypasswd.txt文件中。,练习1,1.编写一个shell脚本用于保存用户信息,以自己学号命名。 开头添加注释:T
14、his is xxxs first shell! 读取用户名; 在屏幕上提示用户输入的用户名; 提示用户输入密码; 读取用户密码; 将用户名和密码保存在mypasswd.txt文件中。,习题答案,1、创建shell脚本: # vi 19.sh 2、shell脚本内容: #This is zhang3s first shell! echo “Please enter your name.“ read yourname echo “Your name is $yourname.“ echo “Please enter your passwd.“ read yourpasswd echo “name
15、 : $yourname passwd : $yourpasswd“ mypasswd.txt,3、修改权限 # chmod 777 19.sh 运行脚本 # ./19.sh 4、运行结果 Please enter your name. zhang3 Your name is zhang3. Please enter your passwd. 123 5、读取保存结果 # cat mypasswd.txt name : zhang3 passwd : 123,练习2,编写一个shell脚本,用于计算呼叫中心未应答的咨询的数量。 (提示:该脚本应该先接收咨询的总数和已经应答的数量,以便计算出未应
16、答的咨询的数量。),1、创建shell脚本: # vi callcenter.sh 2、shell脚本内容: echo -n “Please enter total number: “ read totalnumber echo -n “Please enter resolve number: “ read resolvenumber echo “Unsolve number is : $(totalnumber-resolvenumber)“,3、修改权限 # chmod 777 callcenter.sh 运行脚本 # ./callcenter.sh 4、运行结果 Please enter total number: 99 Please enter resolve number: 77 Unsolve number is : 22,选择题 1表示追加输出重定向的符号是_。 A. B. C. D. /,练习 3,