【4】shell脚本编程.ppt
College of Information Science and Engineering Shandong Agricultural University SHELL脚本编程shellshell脚本能提高用户操作和管理员进脚本能提高用户操作和管理员进行系统管理的效率,一般步骤行系统管理的效率,一般步骤1.1.编辑器编写脚本程序编辑器编写脚本程序2.2.shellshell做解释程序,非交互地执行脚本,做解释程序,非交互地执行脚本,两种执行方式:两种执行方式:1.1.用用shsh命令执行脚本文件命令执行脚本文件2.2.给脚本文件添加执行权限,用给脚本文件添加执行权限,用././命令执行命令执行2 2HELLO WORLD!HELLO WORLD!1.1.vi vi hello.shello.sn按按i i进入插入模式进入插入模式n输入输入echo“hello world!”echo“hello world!”n:输入输入wqwq保存退出保存退出2.2.shsh hello.shello.s或者或者chmodchmod 755 755 hello.shello.s././hello.shello.s3 3一、一、VIVI编辑器编辑器1.1.VIVI的三种工作模式的三种工作模式2.2.VIVI的启动的启动3.3.VIVI的退出的退出4.4.VIVI的文本的文本编辑编辑5.5.VIVI命令模式下的操作命令模式下的操作6.6.VIVI行命令模式下的操作行命令模式下的操作 VI 编辑器的使用编辑器的使用4 4系统配置文件、系统配置文件、shellshell脚本文件等都是文本文件,编辑脚本文件等都是文本文件,编辑它们都要使用文本编辑器。它们都要使用文本编辑器。在在LinuxLinux系统中有多种文本编辑器,其中既有字符界面系统中有多种文本编辑器,其中既有字符界面如的如的VIVI、EMACASEMACAS等,也有图形界面的如等,也有图形界面的如“附件附件”菜菜单下的单下的“文本编辑器(文本编辑器(geditgedit)”等,用户可以根据自等,用户可以根据自己的喜好选择使用。己的喜好选择使用。学习学习vi vi的方法:的方法:vi vi的命令太多且难以记忆,而实际上真正经常使用的命令太多且难以记忆,而实际上真正经常使用的命令并不是太多,只要掌握几个关键的并加以适当的命令并不是太多,只要掌握几个关键的并加以适当练习很快就上手使用练习很快就上手使用vi vi。5 5为什么选择为什么选择VIVI就使用的方便性而言,有比就使用的方便性而言,有比vi vi更好的编辑器,还要图更好的编辑器,还要图形化的形化的editedit,为什么还要用,为什么还要用vi vi?历史久远,功能强大,在有些情况下系统中能够找到的编辑历史久远,功能强大,在有些情况下系统中能够找到的编辑器只有器只有vi vi;用户一旦熟悉后,使用非常方便;系统管理员使用正则表达用户一旦熟悉后,使用非常方便;系统管理员使用正则表达式可以极大地提高工作效率,而学习式可以极大地提高工作效率,而学习vi vi也是掌握正则表达式的也是掌握正则表达式的有效途径。有效途径。由于由于vivi的版本不同,其命令格式、功能和用法会有一的版本不同,其命令格式、功能和用法会有一些差别。些差别。ShellShell中执行中执行vivi命令,命令,RedHatRedHat系统实际上是执系统实际上是执行行vimvim,它是传统,它是传统vivi的增强版本的增强版本6 61 1、VIVI的三种工作模式的三种工作模式命令模式命令模式启动启动VIVI默认进入命令模式。此时界面不能编辑,只能接受默认进入命令模式。此时界面不能编辑,只能接受命令命令(键入的命令看不到键入的命令看不到)文件的保存,退出,文本的删除、复制、搜索等操作文件的保存,退出,文本的删除、复制、搜索等操作输入模式输入模式编辑模式编辑模式命令模式下用命令模式下用i(sert),a(ppendi(sert),a(ppend),o,so,s等均可进入该模式。等均可进入该模式。按按escesc返回命令模式返回命令模式行编辑模式行编辑模式实际上也是命令模式的一种,在实际上也是命令模式的一种,在命令模式下输入冒号命令模式下输入冒号进入进入一个命令行,一个命令行,可显示地输入命令可显示地输入命令(所以也有些书认为是两(所以也有些书认为是两种工作模式)。种工作模式)。三种模式可自由切换,一般切换命令就是操作的英文单词三种模式可自由切换,一般切换命令就是操作的英文单词的首字母的首字母7 72 2、VIVI的启动的启动启动命令:启动命令:vi vi my.txtmy.txt如果文件存在,则如果文件存在,则vi vi显示文件内容并等待用户的命令。显示文件内容并等待用户的命令。如果指定的文件不存在,则如果指定的文件不存在,则vi vi将告知用户这是未命名将告知用户这是未命名的文件,并进入一个空白的界面。的文件,并进入一个空白的界面。启动启动vi vi时都是默认处于命令模式。用户必须使用命令时都是默认处于命令模式。用户必须使用命令切换到文本输入模式才能进行输入编辑,或者可执行切换到文本输入模式才能进行输入编辑,或者可执行删除、复制等编辑命令。删除、复制等编辑命令。vi vi R file_nameR file_name,以只,以只读方式打方式打开开文件文件8 83 3、VIVI的退出的退出冒号进命令行模式下:冒号进命令行模式下::q!不存档强制退出。不存档强制退出。:w 保存但不退出保存但不退出,ww(rite)后后可加所要存档的文档名。可加所要存档的文档名。:wq 存档后退出。存档后退出。命令模式下按命令模式下按zz,功能与功能与:wq 相同。相同。:x 与与:wq相同相同命令模式:命令模式:ZZZZ、ZQZQ保存保存/不保存退出不保存退出9 94 4、怎么编辑、怎么编辑必须从命令模式转入插入模式才能进行输入必须从命令模式转入插入模式才能进行输入编辑,可用命令有编辑,可用命令有:新增新增(append)a:从光标所在位置从光标所在位置后面后面开始新增资料开始新增资料A:从光标所在从光标所在行最后面的行最后面的地方开始新增资料。地方开始新增资料。插入插入(insert)i:从光标所在位置从光标所在位置前面前面开始插入资料开始插入资料I:从光标所在从光标所在行行的第一个非空白字元的第一个非空白字元前面前面开始插入资料。开始插入资料。开始开始(open)o:在光标所在光标所在行下在行下新增一列并进入输入模式。新增一列并进入输入模式。O:在光标所在光标所在行上方在行上方新增一列并进入输入模式。新增一列并进入输入模式。冒号进入行命令模式,输入冒号进入行命令模式,输入set nu可设置可设置vi显示行号显示行号10105、命令模式下的操作:删除、命令模式下的操作:删除nx:删除光标所在字符删除光标所在字符ndwdw 删除一个单词删除一个单词ndd:删除光标所在的行删除光标所在的行nu u:恢复被删除的文字:恢复被删除的文字ns s:删除光标所在字节,:删除光标所在字节,并进入输入模式并进入输入模式#表示数字表示数字n#x#x 删除几个字符,如删除几个字符,如3x3xn#dwdw 删除几个单词,如删除几个单词,如3dw3dw表示删除三个单词表示删除三个单词n#dddd 删除多个行,如删除多个行,如3dd 3dd 表示删除光标行及光标的表示删除光标行及光标的下两行下两行nd$d$删除光标到行尾的内删除光标到行尾的内容容d d光标键:光标键:左:删除光标前面的字符;左:删除光标前面的字符;右:删除光标所在的字符;右:删除光标所在的字符;上:将当前行与上一行删除;上:将当前行与上一行删除;下:当前行与下一行删除下:当前行与下一行删除ndnd上下光标键上下光标键:删除当前行之上、下的几行文删除当前行之上、下的几行文本(包括当前行)本(包括当前行)1111命令模式下的操作:命令模式下的操作:文本复制、粘贴文本复制、粘贴复制命令:复制命令:y yyyyy:复制整行复制整行ywyw:复制光标所在的单词复制光标所在的单词nywnyw:复制包括光标所在的复制包括光标所在的n n个单词个单词nyynyy:复制包括当前行在内的复制包括当前行在内的n n行行粘贴命令粘贴命令P P光标移动光标移动h h、j j、k k、l lnGnG:移动到底:移动到底n n行行首行行首1212通用缓冲区和专用缓冲区通用缓冲区和专用缓冲区一般情况下,最近一次的抽取、删除、插入和修改的一般情况下,最近一次的抽取、删除、插入和修改的内容都将存放在内容都将存放在通用缓冲区通用缓冲区中。利用这些缓冲区可以中。利用这些缓冲区可以非常方便地实现文本内容的剪切和粘贴。非常方便地实现文本内容的剪切和粘贴。专用缓冲区专用缓冲区的名字采用双引号加单个字母表示的名字采用双引号加单个字母表示,如如”a a,”b b等等等等命令模式下输入命令模式下输入”ayyayy,是将当前行的内容复制到专用缓冲区,是将当前行的内容复制到专用缓冲区a a中。输入中。输入”apap,则将专用缓冲区中的内容粘贴到光标位置之则将专用缓冲区中的内容粘贴到光标位置之后。后。对单个文件的编辑,专用缓冲区没有什么优势,对多个文件对单个文件的编辑,专用缓冲区没有什么优势,对多个文件编辑才能体现专用缓冲区的优势:从当前文件切换到下一个编辑才能体现专用缓冲区的优势:从当前文件切换到下一个文件时通用缓冲区的内容会丢失,而专用缓冲区的内容却依文件时通用缓冲区的内容会丢失,而专用缓冲区的内容却依然存在。然存在。1313示例:示例:将当前行开始的将当前行开始的4 4行内容向后移动行内容向后移动8 8行。行。4dd4dd是删除是删除4 4行,行,vi vi自动将这自动将这4 4行的内容保存在通用缓冲区中;行的内容保存在通用缓冲区中;8j 8j表示将光标向后移动表示将光标向后移动8 8行;行;p p表示从通用缓冲区中取出内容,粘贴在光标位置后面。由于表示从通用缓冲区中取出内容,粘贴在光标位置后面。由于dddd命令使通用缓冲区的内容以行为单位存放,当取出缓冲区命令使通用缓冲区的内容以行为单位存放,当取出缓冲区的内容时,的内容时,vi vi将它们粘贴在当前行之后。将它们粘贴在当前行之后。示例:示例:将某文本文件中的两行复制到新位置。将某文本文件中的两行复制到新位置。2yy2yy,表示从当前行开始抽取两行到通用缓冲区。,表示从当前行开始抽取两行到通用缓冲区。再将光标移动到目标行的位置后,输入再将光标移动到目标行的位置后,输入p p复制。复制。14146 6、行、行命令模式下的操作:命令模式下的操作:字符串的查找、替换字符串的查找、替换:/string:/string搜索指定的字符串。搜索指定的字符串。按键按键n n:继续进行搜索:继续进行搜索 如果写的是斜杠(如果写的是斜杠(/):按):按n n会从当前位置向后查找;如果写的会从当前位置向后查找;如果写的是问号(?),按是问号(?),按n n键则从当前位置向前查找键则从当前位置向前查找查找且替换查找且替换:%s /SEARCH/REPLACE:%s /SEARCH/REPLACE把文档中所有把文档中所有SEARCHSEARCH替换成替换成REPLACEREPLACE;:#,#s/SEARCH/REPLACE/g:#,#s/SEARCH/REPLACE/g 号表示数字,表示从多少行到多少行,把号表示数字,表示从多少行到多少行,把SEARCHSEARCH替换成替换成REPLACEREPLACE;:s /SEARCH/REPLACE/g:s /SEARCH/REPLACE/g 把把当前光标当前光标所在行中的所在行中的SEARCHSEARCH单词,替换成单词,替换成REPLACEREPLACE,并并把所有把所有SEARCHSEARCH高亮显示高亮显示1515*与当前文件有关的读写操作与当前文件有关的读写操作 :r r file_namefile_name导入文件内容添加到光标所在行后导入文件内容添加到光标所在行后 :n1,n5 w n1,n5 w file_namefile_name从第从第n1n1行到行到n5n5行的内容保存到文件行的内容保存到文件file_namefile_name中中如果是从当前行到倒数第三行,也可以表示为如果是从当前行到倒数第三行,也可以表示为 .,$-2;如;如果指定的文件已存在,则果指定的文件已存在,则vi vi将给出将给出“File exists”File exists”的错误的错误信息,可用下面的命令:信息,可用下面的命令:n1,n5 w n1,n5 w file_namefile_name将指定的文件内容附加重定向地添加到一个已经存在文将指定的文件内容附加重定向地添加到一个已经存在文件的尾部。件的尾部。1616*VI*VI操作中执行其他操作中执行其他shellshell命令命令用户在编辑文本文件过程中,可以在不退出用户在编辑文本文件过程中,可以在不退出vi vi的情况下执行的情况下执行shellshell命令,行命令模式输入命令,行命令模式输入:!命令!命令例如:例如:!:!ls ls l l:!mount/dev/sda1/!mount/dev/sda1/mntmnt命令执行完成后,系统会提醒用户按任意键返命令执行完成后,系统会提醒用户按任意键返回回vi vi编辑器中继续文本文件的编辑工作。编辑器中继续文本文件的编辑工作。1717文本输入状态文本输入状态命令状态命令状态行编辑状态行编辑状态按按ESC键键按按A,I,S,C,O等命令等命令按按“:”键键执执行行非非退退出出命命令,如令,如w三种模式间的转换关系三种模式间的转换关系1818二、二、SHELLSHELL变量与语法变量与语法1.1.基础知识基础知识2.2.shellshell变量变量3.3.shellshell控制流程语法控制流程语法4.4.shellshell中的输出重定向中的输出重定向5.5.脚本实例脚本实例 SHELL变量与语法变量与语法19191 1、基础知识、基础知识关于关于shellshell脚本文件脚本文件1.1.一般以一般以.shsh为文件后缀。没有也能执行。为文件后缀。没有也能执行。2.2.常见的两种执行方式常见的两种执行方式././文件名文件名 在当前目录下写明路径执行,要求文在当前目录下写明路径执行,要求文件必须有执行权限,如件必须有执行权限,如chmodchmod 755 755 run.shrun.sh././run.shrun.shshsh 文件名文件名shsh run.shrun.sh3.3.文件开头指定一个或多个解释脚本程序的文件开头指定一个或多个解释脚本程序的shellshell,如,如#!/bin/bash#!/bin/bash如果指定,注意如果指定,注意/bin/bin不要漏了不要漏了“/”/”,否则用,否则用././方方式执行会找不到路径。式执行会找不到路径。不指定的话一般默认以不指定的话一般默认以/bin/bin/shsh执行执行shellshell脚本脚本2020shellshell里的特殊字符里的特殊字符注释符注释符#除了除了#!/bin/bash#!/bin/bash里的里的#特殊特殊美元符美元符变量符。与反斜杠转义符相反,使其后的普通字符作为变量变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如名,如$a$a表示变量表示变量a a的值。变量字符长度超过的值。变量字符长度超过1 1个时,用个时,用 括括起来起来单引号单引号被引起的字符全部做普通字符,即全部原样被引起的字符全部做普通字符,即全部原样echo my$SHELLecho my$SHELL2121双引号双引号引号内的内容,除引号内的内容,除$、转义符、转义符、倒引号、倒引号 这三个保留特殊功能,这三个保留特殊功能,其他字符均做普通字符。其他字符均做普通字符。倒引号倒引号引号内的字符串当做引号内的字符串当做shellshell命令行解释执行,得到的结果取代命令行解释执行,得到的结果取代整个倒引号括起来的部分。整个倒引号括起来的部分。pwd即即pwd命令的执行结果命令的执行结果$LOGNAME系统变量系统变量2222练习一下:区别下面几句练习一下:区别下面几句echo my home is$HOMEecho my home is$HOMEecho“my home is$HOME”echo“my home is$HOME”echo my home is$HOMEecho my home is$HOMEecho“my home is echo“my home is pwdpwd”echo my home is echo my home is pwdpwd 用于括起来用于括起来shell命令命令 用于原样显示用于原样显示23232 2、shellshell变量变量1 1)环境变量环境变量程序运行时的一些设置,常用的如程序运行时的一些设置,常用的如PATHPATH,HOMEHOME,SHELLSHELL,LOGNAMELOGNAME等等PATHPATH的例子:的例子:windowswindows下,开始下,开始运行运行输入输入notepadnotepad能启动记事本能启动记事本配置配置javajava环境变量可使任何目录都能执行环境变量可使任何目录都能执行javacjavac命令命令linuxlinux下的环境变量下的环境变量一)命令行修改或设置环境变量一)命令行修改或设置环境变量只在本次登录的只在本次登录的shellshell内有效。设置好的环境变量可以内有效。设置好的环境变量可以在当前用户运行的所有程序中使用。在当前用户运行的所有程序中使用。1.1.显示变量的值显示变量的值 echoecho$HOME$HOME/home/home/wxlwxl2.2.新增,修改或删除环境变量新增,修改或删除环境变量exportexport PATH=$PATH:/*/bin PATH=$PATH:/*/bin24243.3.envenv命令显示所有的环境变量命令显示所有的环境变量$envenvHOSTNAME=HOSTNAME=terry.mykms.orgterry.mykms.orgPVM_RSH=/PVM_RSH=/usr/bin/rshusr/bin/rshSHELL=/bin/bashSHELL=/bin/bashTERM=TERM=xtermxtermHISTSIZE=1000HISTSIZE=1000.4.4.setset命令显示所有本地定义的命令显示所有本地定义的ShellShell变量变量 5.5.设置变量为只读、清除变量内容设置变量为只读、清除变量内容$export TEST=Test.#$export TEST=Test.#增加一个环境变量增加一个环境变量TESTTEST$readonlyreadonly TEST#TEST#将环境变量将环境变量TESTTEST设为只读设为只读$unsetunset TEST#TEST#会发现此变量不能被删除会发现此变量不能被删除2525二)让环境变量的修改在退出二)让环境变量的修改在退出shellshell再次登录时仍有效,再次登录时仍有效,需要在相关配置文件中修改需要在相关配置文件中修改1.1.用户登录用户登录LinuxLinux涉及环境变量的配置文件有?涉及环境变量的配置文件有?有:有:/etc/profile/etc/profile、/./.bash_profilebash_profile、/./.bashrcbashrc、/etc/etc/bashrcbashrc2.2.文件访问顺序如何?文件访问顺序如何?在上述文件中都加入一句:在上述文件中都加入一句:echo“echo“文件名文件名”,如,如echo echo oh!enter/etc/profile /etc/profileecho echo oh!enter/etc/profile /etc/profileexitexit退出登录,重新用退出登录,重新用rootroot登录看看输出的语句登录看看输出的语句,得到配置文得到配置文件的使用顺序:件的使用顺序:/etc/profile/etc/profile /./.bash_profilebash_profile /./.bashrcbashrc /etc/etc/bashrcbashrc26263.3.上述配置文件的作用上述配置文件的作用1 1)登录)登录LinuxLinux先启动系统配置文件先启动系统配置文件/etc/profile/etc/profile,并从,并从/etc/etc/profile.dprofile.d目录的配置文件中搜集目录的配置文件中搜集shellshell的设置,为的设置,为系统的系统的每个用户每个用户设置环境信息。设置环境信息。2 2)用户配置文件)用户配置文件/./.bash_profilebash_profile,每个用户,每个用户专用于自己专用于自己使用使用的的shellshell信息信息,仅用户仅用户登录时执行一次登录时执行一次!默认情况下默认情况下,此文件通过脚本执行同目录下用户的此文件通过脚本执行同目录下用户的.bashrcbashrc文件。文件。3 3)/./.bashrcbashrc文件包含专用于用户文件包含专用于用户bash shellbash shell的的bashbash信信息息,登录及每次打开新的登录及每次打开新的shellshell时都会执行时都会执行。里面又会调。里面又会调用用/etc/etc/bashrcbashrc2727设置用户自己的环境变量设置用户自己的环境变量在在/home/user/./home/user/.bash_profilebash_profile中定义下句,会怎样?中定义下句,会怎样?alias la=alias la=ls ls a|grepa|grep“.*”“.*”答:答:useruser下次再登陆,其下次再登陆,其shellshell会自动建立一个别名命令会自动建立一个别名命令lala,功能,功能为查看当前目录下名字以为查看当前目录下名字以.开头的文件。开头的文件。写在写在/./.bash_profilebash_profile中,需重新登录才能有效。除非运行中,需重新登录才能有效。除非运行source.source.bash_profilebash_profile使其立即有效。使其立即有效。写在写在/./.bashrcbashrc中,则打开新的终端中就有效中,则打开新的终端中就有效读脚本,了解更多配置文件读脚本,了解更多配置文件读读etc/etc/rc.drc.d目录下的系统启动运行的脚本,可以了解目录下的系统启动运行的脚本,可以了解/etc/etc下下的各种配置文件的作用、如何修改、修改后有什么效果等等。的各种配置文件的作用、如何修改、修改后有什么效果等等。2828利用环境变量,运行利用环境变量,运行ShellShell程序的另一种方法:程序的另一种方法:1.1.修改脚本文件使其具有可执行权限。修改脚本文件使其具有可执行权限。2.2.把脚本所在目录添加到搜索路径中(把脚本所在目录添加到搜索路径中(.bash_profilebash_profile 文件)。文件)。3.3.最后,在任意目录下键入最后,在任意目录下键入“脚本程序名脚本程序名”回车即可执回车即可执行。行。在用户的在用户的/.bash_profilebash_profile文件中文件中PATHPATH环境变量一般环境变量一般默认为默认为 PATH=$PATH:$HOME/binPATH=$PATH:$HOME/bin因此,用户只要在自己的主目录下建立一个名为因此,用户只要在自己的主目录下建立一个名为binbin的目录,并把编辑好的的目录,并把编辑好的shellshell文件都存在该目录下即可。文件都存在该目录下即可。这样脚本程序在任何目录都能执行,并且也符合这样脚本程序在任何目录都能执行,并且也符合linuxlinux文件系统层次规范,对文件进行分类管理。文件系统层次规范,对文件进行分类管理。29292 2)SHELLSHELL预定义变量预定义变量常用于常用于SHELLSHELL参数检测的有参数检测的有$#$#命令行参数个数命令行参数个数$*$*“参数参数1 1 参数参数2”2”形式保存的参数形式保存的参数$“参数参数1”“1”“参数参数2”2”形式保存的参数形式保存的参数$n$n第第n n个参数个参数$0$0当前程序名当前程序名$?$?前一个命令或函数的返回码前一个命令或函数的返回码$本程序的本程序的PIDPID$!$!上一个命令的上一个命令的PIDPID3030使用使用shellshell预定义变量的脚本举例预定义变量的脚本举例31313 3)用户变量用户变量由用户定义的由子母、下划线组成,第由用户定义的由子母、下划线组成,第1 1个字符不能是个字符不能是数数无须声明,直接赋值即声明了变量。两种赋值方式:无须声明,直接赋值即声明了变量。两种赋值方式:第一、从标准输入设备读入用户输入的值第一、从标准输入设备读入用户输入的值 read read 变量变量1 1 变量变量2 2 read a bread a b第二,将一个命令执行的输出赋给指定的变量第二,将一个命令执行的输出赋给指定的变量 用户变量用户变量=命令命令 dtdt=date=date3232使用变量的格式要求使用变量的格式要求a=morninga=morningecho“good$a!”echo“good$a!”unset aunset aunset unset 变量名变量名清空变量的赋值清空变量的赋值readonlyreadonly 变量名变量名 设置为只读,即成常数设置为只读,即成常数local local 变量名变量名变量默认是全局作用,加变量默认是全局作用,加locallocal会限会限制为局部制为局部n注意赋值不要有空格注意赋值不要有空格n使用变量时,变量名最好用使用变量时,变量名最好用括起,变量名前必括起,变量名前必须加须加$符号。符号。n灵活用灵活用echoecho显示变量的值方便调试脚本显示变量的值方便调试脚本3333默认赋值是字符串的,声明数字或数组需加默认赋值是字符串的,声明数字或数组需加declaredeclaredeclare declare 参数参数 变量名变量名=值值declare i a=8declare i a=8-i integer-i integer-a array-a array-f function-f function-r-r readonlyreadonly-x-x 通过环境输出变量通过环境输出变量又如又如declare i a=8declare i a=8declare i b=8declare i b=8declare i cdeclare i cc=$a*$bc=$a*$becho$cecho$c注意变量别少注意变量别少$,c c不定义会得不到数值不定义会得不到数值646434344 4)变量表达式)变量表达式条件判断命令条件判断命令testtesttest n1-test n1-参数参数 n2n2(或(或 参数参数 表达式)表达式)真返回真返回0 0,假返回,假返回1 1。1.1.整数,比较运算符见右表整数,比较运算符见右表test 1test 1 lt lt 4 4#判断判断14104 4、其他参数、其他参数-a-a 逻辑与逻辑与-o-o 逻辑或逻辑或!逻辑非逻辑非36363 3、控制流程、控制流程shellshell运算符和运算符和CC语言基本类似,也有分支、循环流程语言基本类似,也有分支、循环流程控制。控制。简单举例简单举例后面例子涉及的命令后面例子涉及的命令seqseq命令:产生命令:产生1-91-9的数字序列的数字序列exprexpr命令:对表达式求值命令:对表达式求值 直接求值命令:对被括起来的表达式求值直接求值命令:对被括起来的表达式求值37371 1)分支结构)分支结构nifif分支分支if if$#-$#-eqeq 0 0 thenthenecho“echo“输入了输入了0 0个参数个参数”elifelif$#-$#-ltlt 1 1 then echo“then echo“输入了多个参数输入了多个参数”else echo“else echo“输入了输入了1 1个参数个参数”fifincasecasecase“$#”case“$#”inin 0 0)echo“echo“输入了输入了0 0个参数个参数”;1 1)echo“echo“输入了输入了1 1个参数个参数”;*)echo“echo“输入了多个参数输入了多个参数”;esacesac每个分支条件后必须以两每个分支条件后必须以两个分号结尾个分号结尾38382 2)循环结构)循环结构for for 例子例子输出输出100100内内1010的倍数的倍数for i in for i in seqseq 1 9 1 9dodoecho echo exprexpr$i*10$i*10donedone或写或写echo$(echo$(exprexpr$i*10)$i*10)n乘号前加转义符,乘号前加转义符,与数字间要有空格。与数字间要有空格。3939read read 变量变量1 1 变量变量2 2 可以从键盘上读取多个变量的值,用户输入数据时,以空格可以从键盘上读取多个变量的值,用户输入数据时,以空格或者或者TabTab键作为分隔。键作为分隔。如果输入的数据个数不够,则从左到右对应赋值,没有输入如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;的变量为空;如果输入的数据个数超了,则从左到右对应赋值,最后一个如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。变量被赋予剩余的所有数据。4040read a bread a bfor i in for i in seqseq$a$b$a$bdodoecho echo exprexpr$i*10$i*10donedone输出输出a a到到b b序列数各数的序列数各数的1010倍数倍数4141whilewhile例子例子求求1 1到到100100的和的和i=1i=1sum=0sum=0while$i le 100 while$i le 100 dodosum=$sum=$sum+$isum+$i i=$i+1 i=$i+1donedoneecho$sumecho$sumn:直接求值命令:直接求值命令42424 4、命令结果重定向、命令结果重定向1 1stdoutstdout标准输出标准输出2 2stderrstderr标准错误标准错误输出重定向到文件输出重定向到文件filefile,终端上只能看到标准错误:,终端上只能看到标准错误:#命令命令 file file错误重定向到文件错误重定向到文件file file,终端上只能看到标准输出:,终端上只能看到标准输出:#命令命令 2file2file标准输出和标准错误都重定向到标准输出和标准错误都重定向到filefile,终端上看不到任,终端上看不到任何信息:何信息:#命令命令 filefile 2&1 2&1(等于(等于#命令命令 1file1file 2&1 2&1)4343屏蔽命令任何输出的:/dev/null 2&1cp/etc/cp/etc/my.confmy.conf /dev/null 2&1/dev/null 2&1/dev/null/dev/null空设备空设备此句命令的结果是:此句命令的结果是:1.1.cpcp命令没有目标文件命令没有目标文件,应该输出错误。应该输出错误。2.2.2&12&1表示错误重定向指向标准输出。表示错误重定向指向标准输出。3.3./dev/null/dev/null又使标准输出重定向到空,就是不要又使标准输出重定向到空,就是不要输出信息输出信息即:一个错误的命令执行,什么功能都不实现,且没有任何信息或即:一个错误的命令执行,什么功能都不实现,且没有任何信息或错误提示输出。错误提示输出。44441 1)command file 2filecommand file 2file2 2)command file 2&1 command file 2&1 有什么区别?有什么区别?1 1)的写法)的写法,stdoutstdout和和stderrstderr都直接送到都直接送到filefile中中,会出现会出现两个同抢占两个同抢占filefile的管道,的管道,filefile会被打开两次会被打开两次,stdoutstdout和和stderrstderr输出的信息会互相覆盖。输出的信息会互相覆盖。2 2)的写法将)的写法将stdoutstdout直接送向直接送向file,file,stderrstderr继承继承1 1的管道的管道后后,再被送往再被送往file,file,此时此时,file,file 只被打开了一次只被打开了一次,也只使用了也只使用了一个管道一个管道FD1,FD1,它包括了它包括了stdoutstdout和和stderrstderr的内容。的内容。从从IOIO效率上效率上,前一条命令的效率要比后面一条的命前一条命令的效率要比后面一条的命令效率要低令效率要低,所以在编写所以在编写shellshell脚本的时候脚本的时候,常用常用command file 2&1 command file 2&1 这样的写法。这样的写法。還可以:還可以:命令命令 2file&2命令命令&/dev/null4545*有趣的有趣的IO RedirectionIO Redirection$cat$cat filefile文件內容会被洗掉文件內容会被洗掉$cat file$cat file此处会没有内容此处会没有内容 stdoutstdout、stderrstderr 的管道先准备好才会从的管道先准备好才会从 stdinstdin读内容读内容 file file 会先清空会先清空 filefile,然後才读进,然後才读进 file/dev/null“$user”/dev/nulldodosleep 300sleep 300donedoneecho“$user has logged on!”echo“$user has logged on!”fi fi说明:说明:(1 1)如果没有从命令行输入用户名,则测试)如果没有从命令行输入用户名,则测试$#-$#-nene 1 1为为“真真”,显示用法,显示用法提示信息。提示信息。(2 2)程序中)程序中untiluntil语句的语句的expressionexpression(循环条件)是(循环条件)是who|grepwho|grep“$user”“$user”命令执行的返回码,如果没有找到指定的用户名,返回码为非命令执行的返回码,如果没有找到指定的用户名,返回码为非0 0(为(为“假假”),则),则用用sleepsleep命令暂停执行程序命令暂停执行程序5 5分钟;找到后返回码为分钟;找到后返回码为0 0(为(为“真真”),则终止循环),则终止循环并显示该用户已经登录的信息。并显示该用户已经登录的信息。(3 3)采用重定向到)采用重定向到/dev/null/dev/null空文件的目的是不显示查找到的用户其他信空文件的目的是不显示查找到的用户其他信息。息。每隔每隔5 5分钟检查指定的用户是否登录系统分钟检查指定的用户是否登录系统5555实验实验8.18.1关键代码提示关键代码提示1)checkuser1)checkusera=cut-d:-f1/etc/a=cut-d:-f1/etc/passwdpasswd|grepgrep-c“$1$”-c“$1$”if$a-if$a-gtgt 0 0 2)printnumber2)printnumber判断参数是否是数判断参数是否是数a=$(echo$1|bc 2/dev/dull)