《shell脚本编程》PPT课件_第1页
《shell脚本编程》PPT课件_第2页
《shell脚本编程》PPT课件_第3页
《shell脚本编程》PPT课件_第4页
《shell脚本编程》PPT课件_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

1、SHELL脚本编程,2,shell脚本能提高用户操作和管理员进行系统管理的效率,一般步骤 编辑器编写脚本程序 shell做解释程序,非交互地执行脚本,两种执行方式: 用sh命令执行脚本文件 给脚本文件添加执行权限,用./命令执行,3,HELLO WORLD,vi hello.sh 按i进入插入模式 输入echo “hello world!” :输入wq保存退出 sh hello.sh 或者 chmod 755 hello.sh ./hello.sh,4,一、VI编辑器,VI的三种工作模式 VI的启动 VI的退出 VI的文本编辑 VI命令模式下的操作 VI行命令模式下的操作,5,系统配置文件、s

2、hell脚本文件等都是文本文件,编辑它们都要使用文本编辑器。 在Linux系统中有多种文本编辑器,其中既有字符界面如的VI、EMACAS等,也有图形界面的如“附件”菜单下的“文本编辑器(gedit)”等,用户可以根据自己的喜好选择使用。 学习vi的方法:vi的命令太多且难以记忆,而实际上真正经常使用的命令并不是太多,只要掌握几个关键的并加以适当练习很快就上手使用vi,6,为什么选择VI,就使用的方便性而言,有比vi更好的编辑器,还要图形化的edit,为什么还要用vi? 历史久远,功能强大,在有些情况下系统中能够找到的编辑器只有vi; 用户一旦熟悉后,使用非常方便;系统管理员使用正则表达式可以极

3、大地提高工作效率,而学习vi也是掌握正则表达式的有效途径。 由于vi的版本不同,其命令格式、功能和用法会有一些差别。Shell中执行vi命令,RedHat系统实际上是执行vim,它是传统vi的增强版本,7,1、VI的三种工作模式,命令模式 启动VI默认进入命令模式。此时界面不能编辑,只能接受命令(键入的命令看不到) 文件的保存,退出,文本的删除、复制、搜索等操作 输入模式 编辑模式 命令模式下用i(sert),a(ppend),o,s等均可进入该模式。按esc返回命令模式 行编辑模式 实际上也是命令模式的一种,在命令模式下输入冒号进入一个命令行,可显示地输入命令(所以也有些书认为是两种工作模式

4、)。 三种模式可自由切换,一般切换命令就是操作的英文单词的首字母,8,2、VI的启动,启动命令:vi my.txt 如果文件存在,则vi显示文件内容并等待用户的命令。 如果指定的文件不存在,则vi将告知用户这是未命名的文件,并进入一个空白的界面。 启动vi时都是默认处于命令模式。用户必须使用命令切换到文本输入模式才能进行输入编辑,或者可执行删除、复制等编辑命令,vi R file_name,以只读方式打开文件,9,3、VI的退出,冒号进命令行模式下: :q! 不存档强制退出。 :w 保存但不退出,w(rite)后可加所要存档的文档名。 :wq 存档后退出。 命令模式下按zz,功能与 :wq 相

5、同。 :x 与:wq相同 命令模式: ZZ、ZQ保存/不保存退出,10,4、怎么编辑,必须从命令模式转入插入模式才能进行输入编辑,可用命令有: 新增 (append) a :从光标所在位置后面开始新增资料 A: 从光标所在行最后面的地方开始新增资料。 插入 (insert) i: 从光标所在位置前面开始插入资料 I :从光标所在行的第一个非空白字元前面开始插入资料。 开始 (open) o :在光标所在行下新增一列并进入输入模式。O: 在光标所在行上方新增一列并进入输入模式,冒号进入行命令模式,输入set nu可设置vi显示行号,11,5、命令模式下的操作:删除与修改,x: 删除光标所在字符

6、dw 删除一个单词 dd :删除光标所在的行 s:删除光标所在字节,并进入输入模式,表示数字 #x 删除几个字符,如3x #dw 删除几个单词,如3dw表示删除三个单词 #dd 删除多个行,如3dd 表示删除光标行及光标的下两行 d$ 删除光标到行尾的内容,d光标键: 左:删除光标前面的字符; 右:删除光标所在的字符; 上:将当前行与上一行删除; 下:当前行与下一行删除,nd上下光标键: 删除当前行之上、下的几行文本(包括当前行,u:恢复刚才被修改的文本 U:恢复光标所在行的所有修改 .:重复上一次命令的操作,12,命令模式下的操作:文本复制、粘贴,复制命令:y yy: 复制整行 yw:复制光

7、标所在的单词 nyw:复制包括光标所在的n个单词 nyy:复制包括当前行在内的n行 粘贴命令 P 光标移动 h、j、k、l nG:移动到底n行行首,13,6、行命令模式下的操作:字符串的查找、替换,string搜索指定的字符串。 按键n:继续进行搜索 如果写的是斜杠(/):按n会从当前位置向后查找;如果写的是问号(?),按n键则从当前位置向前查找 查找且替换 :%s /SEARCH /REPLACE 把文档中所有SEARCH替换成REPLACE; :#,# s /SEARCH /REPLACE /g 号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE; :s /SEARCH

8、/REPLACE /g 把当前光标所在行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示,14,7、设置vi,全局的配置文件位于/etc/vim/vimrc(或者/etc/vimrc) 也可以拥有自己独立的配置文件,配置文件位“/.vimrc”,如果没有该文件,也可以直接用如下命令创建并编辑 比如: set nu 显示行号 set ruler 显示光标位置 set undolevel 显示光标位置 set smartindent 智能缩进 syntax on(或syn on) 语法高亮,15,三种模式间的转换关系,16,案例练习,1. 请在 /tmp 这个目录下建立一个

9、名为 vitest 的目录; 2. 进入 vitest 这个目录当中; 3. 将 /etc/man.config 拷贝到本目录底下 4. 使用 vi 开启本目录下的 man.config 这个档案; 5. 在 vi 中设定一下行号; 6. 移动到第 58 行,向右移动 40 个字符,请问您看到的双引号内是什么目录? 7. 移动到第一行,并且向下搜寻一下“bzip2”这个字符串,请问他在第几行? 8. 接着下来,我要将 50 到 100 行之间的 man 改为 MAN,并且一个一个挑选是否需要修改,如何下达指令? 9. 修改完之后,突然反悔了,要全部复原,有哪些方法? 10. 我要复制 51 到

10、 60 行这十行的内容,并且贴到最后一行之后; 11. 删除 11 到 30 行之间的 20 行; 12. 将这个文件另存成一个 man.test.config 的文件; 13. 到第 29 行,并且删除 15 个字符; 14. 储存后离开,17,1. mkdir /tmp/vitest 2. cd /tmp/vitest 3. cp /etc/man.config . 4. vi man.config 5. :set nu 6. 先按下 58G 再按下 40 会看到 /dir/bin/foo 这个字样在双引号内; 7. 先执行 1G 或 gg 后,直接输入 /bzip2 8. 直接执行 :5

11、0,100s/man/MAN/gc 即可 9. (1)简单的方法可以一直按 u 恢复到原始状态,(2)使用不储存离开 :q! 之后,再重新读取一次该文件; 10. 51G 然后再 10yy 之后按下 G 到最后一行,再p粘贴10行 11. 11G 之后,再给他 20dd即可删除 20 行了; 12. :w man.test.config 13. 29G 之后,再给他 15x 即可删除 15 个字符; 14. :wq,18,二、SHELL变量与语法,Shell概述 shell变量和符号 shell控制流程语法 shell中的输出重定向 脚本实例,19,1、shell的基本元素 (1) #!/bi

12、n/bash 必须的,指出shell的类型 (2)# 注释 (3)变量 (4)控制,一、Shell概述,一个shell脚本 vi clearup.sh #!/bin/bash # this is clear cd /var/log cat /dev/null/var/log/messages /dev/null Linux中的无限大的垃圾回收站 echo Logs cleaned up,20,2、一般步骤: (1)编辑文件 (2)保存文件 (3)将文件赋予可执行的权限 (4)运行及排错,21,注意: 一般以.sh为文件后缀。没有也能执行。 常见的两种执行方式 ./文件名在当前目录下写明路径执行

13、,要求文件必须有执行权限,如 chmod 755 run.sh ./run.sh sh 文件名 sh run.sh 文件开头指定一个或多个解释脚本程序的shell,如#!/bin/bash 如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。 不指定的话一般默认以/bin/sh执行shell脚本,22,3、Shell的一般结构 shell 类型 函数 主过程 一般模板 abc.sh #!/bin/bash shell类型 #a simple shell script example #a function funciton sayhello() 函数 echo Enter Y

14、our name: read name 读取来自键盘输入的变量 echo Hello $name echo programme starts here. 主过程 sayhello echo programme ends,23,1、注释符# 除了#!/bin/bash里的#特殊 2、美元符 $ 变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用括起来 3、单引号 被引起的字符全部做普通字符,即全部原样 echo my $SHELL,二、Shell中的特殊符号,24,4、双引号 引号内的内容,除$、转义符、倒引号这三个保留特殊功能,其他字符均做

15、普通字符。 5、倒引号(数字1键旁边的那个键) 引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分,pwd即pwd命令的执行结果 $LOGNAME系统变量,25,练习一下:区别下面几句,echo my home is $HOME echo “my home is $HOME” echo my home is $HOME echo “my home is pwd” echo my home is pwd,用于括起来shell命令 用于原样显示,26,6. 反斜线 反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠()能够阻止shell把后面的字符

16、解释为特殊字符。 例4: yuqunyuqun $echo “Filename is N0$*” Filename is N0$* 注意:在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能,27,三、变量,shell 变量 可以保存如路径名、文件名或者一个数字 本地变量 局部变量只在创建它们的Shell中使用,可以在shell程序内任意使用和修改它们。 环境变量 可以在创建它们的Shell及其派生出来的任意子程序中使用。有些变量是用户创建的,其他的则是专用的(比如PATH、HOME)。是系统环境的一部分,不必去定义它们,可以在shell程序中使用它们 。还能在shell中加以修

17、改。 内部变量 由系统提供的。与环境变量不同,但用户不能修改它们,28,本地变量和环境变量的对比,29,1、本地变量(局部变量、用户变量,本地变量 在用户现在的shell生命期的脚本中使用 变量名=值 注意: (1)等号两边不可以有空格 (2)取值包含空格,必须用双引号括起来 (3)Shell变量可以用大小写字母,区分大小写,30,变量的声明和使用 (1)变量是弱类型的(不用声明类型) (2)变量声明及赋值格式 变量=值(等号两边不能有空格) (3)变量的引用 $变量名 $变量名 变量名为1个字符时建议使用方式一,多余一个字符时建议使用方式二 举例: $a $abc,31,显示变量 echo命

18、令可以显示单个变量取值,变量名前加,echo $Name echo $name echo $nameare echo $name are,输出引用变量时加比较好,32,清除变量 unset 变量名 举例:echo $name unset name (注意:name前没有$) 显示本地所有变量 set,33,设置只读变量,设置变量时,不想再改变其值,可以将之设为只读变量 变量名=值 readonly 变量名,34,2、环境变量,环境变量用于所有用户进程(通常称为子进程)。登陆进程称为父进程,通过pstree可以查看 环境变量可以用于所有子程序,着包括编辑器、脚本和应用 举例:vi a.sh #!

19、/bin/bash # 检测环境变量 echo 家目录是 $HOME 环境变量可以在命令行中设置,但用户注销时这些值将丢失 环境变量均为大写 必须用export命令导出,35,设置环境变量 variable-name=value export variable-name(环境变量名大写) 显示环境变量 env 可以看到所有的环境变量 echo $环境变量名 (显示一个变量) 清除环境变量 unset 环境变量名,36,HOME : 代表使用者的家目录。cd 去到使用者的家目录 或者利用 cd 就可以直接回到使用者家目录了。 PS1:shell的主提示符 SHELL : 目前这个环境使用的 SH

20、ELL 是哪个程序? 如果是 bash 的话,预设是 /bin/bash PWD:用户当前工作目录的路径。它指出用户目前在Linux文件系统中处在什么位置。它是由Linux自动设置的 HISTSIZE : 这个与“历史命令”有关,曾经下达过的指令可以被系统记录下来,而记录的“数目”则是由这个值来设定的。 ENV : 这个使用者所使用的个性化环境设置文件的读取文件。 MAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱文件 (mailbox)。 PATH : 就是执行文件搜寻的路径,目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,

21、所以,目录的顺序也是重要的喔。 LANG : 语系文件,很多数据都会用到他,当出现编码错误的时候往往需要设置它,中文编码是zh_CN.UTF8,37,PATH示例,举例:配置java环境变量可使任何目录都能执行javac命令 (1)需要配置Java环境变量 JAVA_HOME(JDK存放的路径) CLASSPATH(字节码的位置,让JVM知道要运行的类的字节码放在哪) PATH (让OS找到javac等命令的存放的位置) (2)在Linux下配置它们 打开终端 vi .bash_profile 在配置文件中追加内容 JAVA_HOME=JDK存放位置 CLASSPATH=.(当前目录) PAT

22、H=$JAVA_HOME/BIN:$PATH(不覆盖原来的内容,追加) export JAVA_HOME CLASSPATH PATH 保存,让配置起作用(source .bash_profile或者注销,38,让环境变量的修改在退出shell再次登录时仍有效,需要在相关配置文件中修改 Bash的初始化文件有:/etc/profile、/.bash_profile、/.bash_login、/.profile、/.bashrc、/etc/bashrc,etc/profile,.bash_profile,.bashrc,etc/bashrc,.bash_login,.profile,39,etc

23、/profile 存放一些全局(共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等 /.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件. /.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取. /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取,

24、40,上述配置文件的作用 1)登录Linux先启动系统配置文件/etc/profile,并从/etc/profile.d目录的配置文件中搜集shell的设置,为系统的每个用户设置环境信息。 2)用户配置文件/.bash_profile,每个用户专用于自己使用的shell信息,仅用户登录时执行一次! 默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件。 3)/.bashrc文件包含专用于用户bash shell的bash信息,登录及每次打开新的shell时都会执行。里面又会调用/etc/bashrc,41,设置用户自己的环境变量,在/home/user/.bash_profile中定

25、义下句,会怎样? alias la=ls a|grep “.*” 答:user下次再登陆,其shell会自动建立一个别名命令la,功能为查看当前目录下名字以.开头的文件。 写在/.bash_profile中,需重新登录才能有效。除非运行source .bash_profile使其立即有效。 写在/.bashrc中,则打开新的终端中就有效 区别:bash_profile只在会话开始的时候读取一次,而bashrc则每次打开终端时都会读取 按照传统,定义的变量如PATH放到.bash_profile中,而像别名函数等放在.bashrc中,但是.bash_profile先于.bashrc读取内容,也可

26、全放入.bashrc中,习惯用各自的配置文件,编辑不需要root权限,42,3、内部变量 内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。 部分内部变量是: $# 传送给shell程序的位置参数的数量 $?最后命令的完成码或者在shell程序内部执行的shell程序(返回值) $0shell程序的名称 $*调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”形式保存的参数,43,“参数1”“参数2”形式保存的参数 $n第n个参数 $本程序的PID $!上一个命令的PID,44,使用shell预定义变量的

27、脚本举例,45,4 位置参数(1) 位置参数及引用 可以编写一个shell脚本,当从命令行或者从其他shell脚本中调用它的时候,这个脚本接收若干参数。这些选项是通过Linux作为位置参数(positional parameter)提供给shell程序的。在shell脚本中应有变量,接收实参,这类变量的名称很特别,分别是1,2,3,这类变量称为位置变量。位置参数1存放在位置变量1中,位置参数2存放位置变量2中,在程序中可以使用$1,$2,来访问, 举例,46,2) 用set命令为位置参数赋值 在shell程序中可以利用set命令为位置参数赋值或重新赋值。 一般格式: set 参数表 说明:该命

28、令后面无参数时,将显示系统中的系统变量的值;如果有参数将分别给位置参数赋值,47,四、变量表达式,1、条件判断命令test test n1 -参数 n2(或 参数 表达式) 真返回0,假返回1。 (1)整数,比较运算符见右表 test 1 lt 4 #判断14 echo $? #结果为0 test语句的等价形式 1 lt 4 可用中括号代替test,把表达式括起来实现判断 注意表达式与中括号间有空格,lt小于 -le小于等于 -gt大于 -ge大于等于 -eq等于 -ne不等于,48,eg1:若输入的参数x 是正数,显示 x number is positive,49,2)文件测试,f存在且是

29、普通文件 -d存在且是目录 -s存在且字节数大于0 -r存在且可读 -w存在且可写 -x存在且可执行 如:test -d “mydoc” 判断mydoc是否是目录,eg2:检测从命令行输入的文件是否存在,50,3、字符串测试 test s 字符串s非空 test s1=s2字符串s1等于s2 test s1!=s2字符串s1不等于s2 test -z s字符串长=0,即为空串 test -n字符串长0 4、其他参数 -a逻辑与 -o逻辑或 !逻辑非,51,3、控制流程,shell运算符和C语言基本类似,也有分支、循环流程控制。 简单举例 后面例子涉及的命令 seq命令:产生1-9的数字序列 比

30、如 seq 1 4 expr命令:对表达式求值 直接求值命令:对被括起来的表达式求值,52,表达式求值: $ expr 1 + 3 $ expr 2 1 $ expr 1 * 3 使用*要加转义符 $ echo expr 1 + 3 注意:表达式中,数字和运算符指教要有空格,出现在语句中要加反引号,53,1)分支结构,if分支 if $# -eq 0 then echo “输入了0个参数” elif $# -lt 1 then echo “输入了多个参数” else echo “输入了1个参数” fi,case case “$#” in 0) echo “输入了0个参数”; 1) echo “

31、输入了1个参数”; *) echo “输入了多个参数”; esac 每个分支条件后必须以两个分号结尾,54,2)循环结构,for 例子输出100内10的倍数 for i in seq 1 9 do echo expr $i * 10 done 或写echo $(expr $i * 10,乘号前加转义符, 与数字间要有空格,55,read 变量1 变量2 可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。 如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空; 如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据,56,read a b

32、for i in seq $a $b do echo expr $i * 10 done 输出a到b序列数各数的10倍数,57,while例子求1到100的和 i=1 sum=0 while $i le 100 do sum=$sum+$i i=$i+1 done echo $sum,:直接求值命令,58,五 命令结果重定向,1stdout标准输出 2stderr标准错误 输出重定向到文件file,终端上只能看到标准错误:#命令 file 错误重定向到文件file ,终端上只能看到标准输出:#命令 2file 标准输出和标准错误都重定向到file,终端上看不到任何信息:#命令 file 2 t

33、henecho “Good morning!”elif test “$hour” ge 12 a “$hour” le 17; thenecho “Good afternoon!”elseecho “Good evening!”fi 说明:第一个有效语句是将命令执行的结果赋给hour变量,所以用反向单引号。用cut命令从date命令的输出中切割出“小时”信息;这里-c 10-11选项表示只切割10到11列。这个程序使用了if连用格式,也可以使用if完整格式的嵌套形式,根据系统当前的时间向用户输出问候信息,65,! /bin/sh -if test $# -ne 1 thenecho Incor

34、rect number of arguments echo Usage: ifuser usernameelse user=$1 if who | grep q $user ; then echo $1 user is logged on. exit 0 else echo $1 user is not logged on. exit 1 fifi,判断用户是否已经在系统中登录,66,说明:(1)由于who | grep $user不是表达式而是命令组合,所以不需要test语句测试;如果命令组合执行成功,即找到指定的用户名则返回码为0;否则为非0。(2)在这个程序中使用了grep字符串搜索命令

35、和“|”管道命令(3)用grep 命令q选项来禁止显示搜索到的信息。 (4)还使用了exit命令,以终止shell程序的执行。exit 0表示程序终止后返回0值,而exit 1表示程序终止后返回非0的值,67,简单的菜单功能,! /bin/sh -clearecho -MENU-echoecho 1.Find files modified in last 24 hoursecho 2.The free disk spaceecho 3.Space consumed by this userecho 4.Exitecho echo -n Select:read choicecase $choic

36、e in1)find $HOME -mtime -1 -print;2)df;3)du -s $HOME;4)exit;*)echo Invalid optionesac,68,说明:(1)本程序菜单的第一项是显示/home目录下,最近24小时内所有修改过的文件。命令中的-1参数是数字“1”,表示一天(24小时)。第二项是检查磁盘空间。第三项是显示/home目录下文件的大小,命令中的-s选项是为了仅显示总计。第四项是退出程序。(2)为了使程序美观,用echo n实现输入的选择数字不换行。(3)输入的数字不在1-4范围内时,显示无效的选项信息,69,! /bin/sh -for file in

37、*.txtdoleftname=basename $file .txtmv $file $leftname.docdone 说明:(1)在Linux系统中不支持mv *.txt *.doc这样的更名命令形式,如果需要将文件成批地更名最好编写一个shell脚本文件。(2)在for语句的参数列表中使用了“*”通配符。(3(在程序中用到basename命令,该命令从随后的文件名剥去指定的后缀,将当前目录下所有的.txt文件更名,70,! /bin/sh if test $# -ne 1thenecho “Usage: chuser username”elseuser=”$1”until who |grep “$user”/dev/nulldosleep 300doneecho “$user has logged on!”fi 说明:(1)如果没有从命令行输入用户名,则测试$# -ne 1为“真”,显示用法提示信息。(2)程序中until语句的expression(循环条件)是who|grep “$user”命令执行的返回码,如果没有找到指定的用户

温馨提示

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

最新文档

评论

0/150

提交评论