第8章 shell编程
怎么辨别假钞-河北科大教务处
第八章 shell编程
8.1 Vi编辑器 P259
8.1.1 vi简介 P259
8.1.2 vi的启动与退出 P260
8.1.2.1启动
8.1.2.2保存与退出
按ESC键
文本输入状
按A,I,S,C,O
等命令
命令状态
执行非退出命
按“:”键
行编辑状态
图8-1
vi三种模式间的转换关系
8.1.4基本命令 P262
8.1.4.1定位光标 P262
参考示例:将光标移动到当前单词开始的第十个单词的第一个字符上。在命令模式下输10w。
8.1.4.2插入或添加 P262
参考示例:假设某文本文件如下:
8.1.4.3删除 P263
参考实例: 假设某文本文件如下:
For
example, to run a job at 4pm three days from now,
you would do at 4pm + 3 days,
to run a job at
10:00am on July 31, you would do at 10am Jul 31
and to run a job
at 1am tomorrow,
8.1.4.4查找 P263
参考示例:假设某文本文件如下:
For
other users, permission to use at is determined by
the files ~yt-3.1.8 contains
the exact
definition of the time specification.
8.1.4.5修改 P264
参考示例:假设某文本文件如下:
The
TERM signal will kill processes which do not catch
this signal. for other
processes, it may be
necessary to use the KILL (9) signal, since this
signal cannot
be caught.将第一行中for的“f”字母由小写替换为大写
。首先,执行for命令,将光标
移动到该“f”字符上,其次,输入r命令并紧接着输入F字符,则替
换完成。
8.1.4.6剪切与粘贴 P264
参考示例1:将当前行开始的4行内容向
后移动8行。在命令模式下,输入:4dd8jp移动实
际上就是复制其内容后再删除并在新位置粘贴。
参考示例2:将某文本文件中的两行复制到新位置。
8.1.4.7撤消操作 P265
8.1.4.8几个特殊命令 P265
J命令 .命令 ~命令
8.1.5行编辑命令 P265
8.1.5.1行编辑命令的地址
8.1.5.2执行shell命令
8.1.5.3从文件中读取
8.1.5.4将指定的内容写入文件
8.1.6 vi的特殊选项 P266
8.1.6.1多文件编辑
8.1.6.2浏览文件
8.1.6.3恢复备份文件
8.2 shel概述 P267
8.2.2 启动与退出shell P268
8.2.2.1登录时启动
8.2.2.2交互式启动
8.2.2.3退出shell
8.2.3 shell与子进程 P270
8.3 Shell 的功能 P270
8.3.1命令行解释
8.3.2保留字
8.3.3通配符
参考示例:ls a?.c
列出当前目录下名为 a?.c 的文件
8.3.4访问和处理程序及命令
8.3.5文件处理:输入出重定向和管道
8.3.5.1管道符|
参考示例: [root@localhost bin]# ls | grep zxj
8.3.5.2输入重定向符 <输入重定向符的功能是使命令从给定的文件中读取数据。
参考示例1: [root@localhost bin]# mail dns@ <
letter
该命令将文件letter的内容以电子邮件(E_mail)的形式发送给名字为dns的用户。
参考示例2:[root@localhost bin]# wc –l <
该命令将文件作为wc命令的输入,统计文件中的行数。
8.3.5.3输出重定向符
>输出重定向符的功能是使命令的输出存入指定的文件。
参考示例:[root@localhost
bin]# who > userlog
把命令who的输出重定向到文件userlog中。
8.3.5.4输出附加重定向符>>
参考示例:
[root@localhost bin]# ls >> filelist
把当前目录中的文件、目录名附(添)
加到文件filelist的末尾。
8.3.6命令组合 P273
参考示例1:[root@localhost bin]#
ls;who;ps
参考示例2:[root@localhost bin]# ls
*.txt~&&rm –f *.txt~
参考示例3:[root@localhost
bin]# { cd root;ls –l; }[root@localhost root]#
参考示例4:[root@localhost bin]# (cd root;ls
–l;)[root@localhost bin]#
8.3.7命令的替换 P274
参考示例1:[root@localhost root]# cp `ls *.txt` zxj
参考示例2:[root@localhost bin]#cd `echo
$$HOME`[root@localhost root]#
8.3.8变量维护
P274
参考示例: HOME=homezxj
8.3.9 shell环境控制
P275
8.4常用shell P276
8.4.2
bash的特色 P277
8.4.2.1命令行自动补齐
8.4.2.2命令历史记录 P278
(1)history命令
命令格式1:history [n] 参考实例:列出最近使用过的5条命令记录。
命令格式2:history –c
命令格式3: history -d offset
参考示例:删除命令历史记录列表中编号为7的命令。
命令格式4:history -anrw [filename]
参考示例:将当前命令历史列表马上添加到.bash_history文件中。
参考示例:清除当前命令历史列表,再从.bash_history文件中导入。
命令格式5:history -p arg [arg ...]
参考示例:执行ls -al命令,但命令和执行结果都不保留在历史记录列表中。
(2)fc命令 P280
命令格式1:fc [-e ename] [-nlr]
[first] [last]
参考示例1:用joe编辑器编辑第一到第五条命令,并成批执行之。
参考示例2:列出从第5条开始所有执行过的命令
参考示例3:以逆序在编辑器中列出第10到第20条命令。
命令格式2:fc -s
[pat=rep] [cmd]
参考示例4:假设历史记录列表中cp rootpro
gramtry1命令的编号为
23,用fc命令执行它。[root@localhost
root]# fc –s 23
参考示例5:希望参考示例4进一步简化,达到用一个字符和命令
编号即可重复执行历
史记录列表中的某个命令或用一个字符即可重复执行最后输入的命令。
8.4.2.3 为命令起别名 P281
命令格式:alias
[-p][name[=value]„]
参考示例1:将ls|more、mkdir、rmdir和rm –rf命令设置成MS-DOS下的命令名。
参考示例2:查看示例1别名设置的结果。[root@localhost
root]# alias
命令格式:unalias [-a][name„]
8.4.2.5系统提示符
8.4.2.5设置功能键
8.5.1
Shell程序的基本结构 P285
8.5.2.2运行 P286
8.5.3
Shell 命令的构成 P287
1.简单命令
2.命令
参考示例:
[root@localhost root]# ls | wc –l
命令清单
参考示例:
(3)&&号的语法格式为:命令1&&命令2&&„&&命令n
||
号的语法格式为:命令1||命令2||„||命令n
8.5.4.1用户变量与赋值
参考示例: OS=Linux Programmer=‘zhang xiao jin
Number=15
如果想要把它变成只读变量,则可用readonly命令来修改。例如:
readonly OS
则OS用户变量变成只读了。
shell还提供了另外两种赋值方式。
参考示例:current_time=`date`则用户
变量current_time中内容为系统当前的日期时间。
8.5.4.2引用变量与echo
命令
8.5.4.3环境变量与设置
8.5.4.4位置变量与相关命令
8.5.4.5其他shell变量
8.5.4.6 shell变量综合应用参考示例
编写一个名为test的shell程序,其内容如下:
8.5.5
shell特殊字符屏蔽 P293
8.5.6.1逻辑表达式与test语句 P295
1.test语句
2.运算符组成的表达式及说明:
8.5.6.2
if分支语句
P297
参考示例
以下通过几个具体应用示例说明if
语句的用法。参考示例1:编写一个名为iffile程序,
它执行时判断bin目录下date文件是
否存在?
编写一个名为greet的问候程序,它执行时能根据系统当前的时间向用户输出问候信息。
设
从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。
编写一个名为if
user的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系
统中登录,并给出相关信
息。
8.5.6.3 case语句
P300
参考示例 编写一个名为mon
th的程序,执行时由用户输入数字作为命令行参数,程序将数
字转换成英语的月份单词并输出。
编写一个名为iden的程序,执行时由用户从键盘输入字符,程序判定字符的类别。
编写一
个名为menu的程序,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘
选择执行对应的命
令。
8.5.6.4 for循环语句 P303
参考示例
编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。
编写一个名为ninenine的程序在屏幕上输出九九乘法表。
8.5.6.5
while 循环语句 P304
参考示例
编写一个名为putnum的程序,在屏幕上输出从10到1的数字。
编写一个名为testshift的程序,显示所有传递给程序的命令行参数及编号。
编写一
个名为menu的程序,除非用户选择退出项,否则每个菜单命令执行后用户按任意键
实现清屏操作并重
新显示菜单。
2.
8.5.6.6 until循环语句 P307
参考示例 编写一个名为athwart的程序,执行时将输入的命令行参数逆序输出。
编写
一个名为chuser的程序,执行中每隔5分钟检查指定的用户是否登录系统,用户名从
命令行输入;
如果指定的用户已经登录,则显示相关信息。
8.5.6.7 break语句 P308 在循环语句中只要循环表达式满足条件循环将一直进行,而有些时候当循环体内执行的语句
满足某种
条件时希望终止循环的执行;这可以用shell中的break语句实现。
1.语法格式
break [n]
参考示例 编写一个名为mini99的程序,在屏幕上输出小九九乘法表。
8.5.6.8 continue语句 P309
参考示例
编写一个名为puteven的程序,在屏幕上输出0到指定数之间的所有偶数。
本示例是说明continue语句的用法,也可以不用continue而用if then
else语句其结果
是一样的。
例如:
8.5.7函数
P311
参考示例:编写一个名为factorial的程序,其中定义
阶乘函数jc,在程序中递归调
用它计算阶乘。
习题八
1.练习vi编辑器的使用并熟练掌握它。
2.简要说明shell的功能,常用的shell有哪些?
3.查看系统PATH环境变量,了解可执行文件的路径信息。
4.如何实现用系统当前日期和时间作为第一级提示符?
5.如何实现用alias命令将cp命令设置别名为copy?
6.简要说明shell程序的结构。
7.简要说明运行shell脚本程序的几种方法。
8.如果你希望编写的脚本程序在任何一个目录下都能直接执行(输入程序名后回车),则
应该
如何处理?
9.命令清单由哪些符号连接命令或命令列表?使用它有何好处?
10.将字符串赋给变量时需要注意哪些问题?
11.变量的赋值方式有几种?各用在哪些场合?
12.写出几个与命令行参数有关的变量并简要说明如何引用。
13.以下shell脚本文件存在什么错误?
echo what month is
this?
read $$month
echo $$ month is as
good a month as any.
14.编写一个shell程序,它输出一个1到10之间的平方和立方对照表。
15.编写一个名为reverse的shell程序,将输入的若干个命令行参数以逆序输出。
16.用其它循环语句编程实现第十五题的功能。
17.简要说明break、continue和exit语句的区别。
18.编写一个sh
ell脚本程序,它能根据输入的命令行参数采取不同的动作:如果是目录,
则列出该目录中的文件;如
果是可执行的文件,则用shell执行之;如果是可读的文件,则
分屏显示其内容。
19.编写一个求平方和求立方的函数,在shell程序中调用它实现第十四题的功能。
20.编写一个弹出式菜单的shell程序并实现其简单的菜单功能:
************************************************
* MENU
*
*
*
*
*
*
*
************************************************
即用户按下数字1,则提示用户输入源和目的文件名后执行复制;输入数字2,则提示
用户输
入要更名的文件或目录名后执行更名操作;输入数字3和4分别执行删除和查找操作;
输入数字5,则退
出该菜单shell程序的执行。