Linux-Shell-脚本编写.ppt

上传人:ni****g 文档编号:570177548 上传时间:2024-08-02 格式:PPT 页数:61 大小:725.52KB
返回 下载 相关 举报
Linux-Shell-脚本编写.ppt_第1页
第1页 / 共61页
Linux-Shell-脚本编写.ppt_第2页
第2页 / 共61页
Linux-Shell-脚本编写.ppt_第3页
第3页 / 共61页
Linux-Shell-脚本编写.ppt_第4页
第4页 / 共61页
Linux-Shell-脚本编写.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《Linux-Shell-脚本编写.ppt》由会员分享,可在线阅读,更多相关《Linux-Shell-脚本编写.ppt(61页珍藏版)》请在金锄头文库上搜索。

1、Company nameLinux培培训训主主讲讲人:人:曾健曾健QQ 920086359Linux Shell 脚本的编写Vi manual Company nameLinux培培训训主主讲讲人:人:曾健曾健QQ 920086359Linux 培培训训Shell 脚本的概念l在Linux下,Shell脚本广泛用于系统管理和软件开发.是Linux系统管理员和开发人员必备知识之一.lbash或称BourneAgainshell:标准的GNUshell,直观而又灵活。或是初学者的最明智选择同时对高级和专业用户来说也是一个强有力的工具在Linux上,bash是普通用户的标准shell这个shell因

2、此称为Bourneshell的超集,一套附件和插件。意味bash和sh是兼容的:在sh中可以工作的命令,在bash中也能工作,反之则不然本教程所有的例子均使用Bashl用cat/etc/shells可以显示系统安装的ShellLinux 培培训训Shell 脚本的概念lLinuxShell脚本是多个Linux命令的集合,是一个具有执行权限的文本文件Shell脚本是一个写入系列命令文本文件里,可以一次性执行的可执行文件Linux大量采用Shell脚本来完成重复性或系统维护工作Shell脚本类似于Windows的批处理文件(*.bat)但是功能远强于它.可以用vi创建脚本,也可以用其它文本工具创建

3、后上传到Linux.在Windows下可以UltraEdit保存成Unix文本格式BashShell脚本与CShell脚本语法有差别,本教程主要采用BashShell语法.Shell脚本必须有执行权限Linux 培培训训Shell 脚本格式lShell脚本必须为Unix文本文件lShell脚本的第一句必须指定解释的Shell通常固定为#!/bin/shlShell中,以井号(#)开始一个注释行,#号及其后面跟随的同一行的所有内容都被忽略l脚本必须有可执行权限chmod u+x myscript由所有者执行chmod a+x myscript同组加上可执行权限chmod 777 myscript

4、全部用户加上可执行权限l$,*,是脚本保留字符,如果需要作为显示字符,则需要在前面加入转义字符,如,*,$,Company nameLinux培培训训主主讲讲人:人:曾健曾健QQ 920086359Linux 培培训训Shell 变量lShell可以使用变量,对Shell而且,所有变量值都是字符串类型lShell变量,分为三大类:系统变量,环境变量,用户自定义变量所有变量不需要自定义可以直接使用系统变量是指BashShell内部定义的保留变量,环境变量可以看成是在整个Shell的各个程序都能访问的全局变量用户自定义变量由用户自行定义.定义格式为变量名=值,等号两边不能有空格等号两边不能有空格,

5、引用时用$lmyvar=“Hello,world”#定义一个变量lmyvar=“hello”#错误定义,等号两边带了空格Linux 培培训训变量的引用和显示l变量通过$来引用值A=“123”$A的值就是”123”,并且在运行中可以改变l变量值的显示主要通过echo命令A=100;echo$Al在LinuxShell脚本里,字符串和”表示不同的含义,最大区别就是在于对变量引用的处理.单引号包括之中表示字符串,如果字符串包含保留字符,则保留字符失效,按原样输出lx=5;echo x=$x输出x=$x双引号“”包括之中表示字符串,如果字符串包含保留字符,则保留字符生效,如变量要显示变量值lx=5;e

6、cho “x=$x”输出x=5Linux 培培训训变量引用实例#!/bin/sh myvar=Hello, world echo 1= $myvar echo 2= $myvar echo 3= $myvar echo 4= $myvar echo 5= $myvar echo 6= $myvar echo 7= $myvar echo 8= $myvarLinux 培培训训执行脚本注意l当前路径不在环境变量PATH当中。换句话在当前目录执行某一个程序(如a.sh),必须要加./a.sh这样主要出于安全考虑Linux 培培训训变量名保护l在shell中,由于书写比较随意,很容易造成变量名引写错

7、情况.由于Shell不需要变量定义,所以非常容易出错.var1书写成$var1hello,这样形成新的变量lShell可以用来保护变量的引用var1=hello;echo$var1helloLinux 培培训训变量值的赋值lshell变量不需定义即可使用,这样对变量值初始值就有一些问题,Shell提供一些简单的判断或初始化机lVar=value变量赋值l$variable:-value空值置换如果变量已经赋值,则使用该变量值。如果变量为空,则整个引用值使用value。需要注意的是,value并不赋给variable。lvar3=11;echo$var3:-12类似于C语言的var3=NULL?

8、12:var3表达lecho$var3:-12l$variable:=value空值赋值该表达式上面的区别就是,如果variable为空,则value赋给variable。lecho$var4:=12;echo$var4l$variable:?空值出错检验变量是否为空,如果为空的话则显示带有系统错误信息l$variable:?customedmessage检验变量是否为空,如果为空的话则显示自定义错误信息l$variable:+word有值置换-变量被赋值的情况下置换一个值echo$DEBUG:+”Debugisactive.”Linux 培培训训Shell 环境变量lshell环境变量是所有

9、shell程序都会接受的参数PATH命令搜索路径,以冒号为分隔符.注意与DOS下不同的是,当前目录不在系统路径里HOME用户home目录的路径名,是cd命令的默认参数IFS定义SHELL使用的分隔符,指命令行参数分隔符lIFS=$tnLOGNAME用户登录名SHELLSHELL的路径名TERM终端类型LD_LIBRARY_PATH寻找库的路径,以冒号分隔l定义自定义环境变量exportMY_NAME=AndrewexportPATH=/home/hxy/bin:$PATH如果每次启动想使用自定义环境变量,需要修改home目录下/.bash_profile文件,可以lsal查看取消环境变量和自定

10、义变量用unset变量名如unsetUSERLinux 培培训训Shell环境变量规定l一个程序在Shell下被执行,那么首先是在这个Shell下创建一个子shell.在这个子Shell再执行程序。l子Shell所有上一级Shell继承下来l程序/脚本修改是子Shell的环境变量。父Shell不受影响,这个主要为了安全考虑。Linux 培培训训Shell 系统变量l常用系统变量$n$1表示第一个参数,$2表示第二个参数.$#命令行参数的个数$0当前程序的名称$?前一个命令或函数的返回码$*以“参数1参数2.”形式保存所有参数$以“参数1”“参数2”.形式保存所有参数$本程序的(进程ID号)PI

11、D$!上一个命令的PIDLinux 培培训训系统变量的实例#!/bin/sh#This file is used to explain the shell system variable.echo the number of parameter is $# ;echo the return code of last command is $?;echo the script name is $0 ;echo the parameters are $* ;xxx=10echo $1 = $1 ; $2 = $2 ;echo $* = $*echo $ = $l./sys_var.shAndrew

12、hxyLinux 培培训训Shell表达式运算lShell用用$(expr)来进行表达式运算来进行表达式运算echo $(1+3)它等效于它等效于let命令命令,即即 let expr 等效于等效于 $(expr)llet x=1+3;echo $xl$()支持多种进制表示支持多种进制表示echo $(013)#八进制echo $(0xA4)#十六进制l任意进制表示$(进制#数)echo$(2#1101010)#2进制表示echo$(8#377)#8进制表示echo$(16#D8)#16进制表示echo$(12#10)#12进制表示echo$(36#ZZYY)#36进制表示l支持运算符+-*%

13、=lexpr把后面字符串当成数学表达式计算l注意每个数之间的空格expr2+4expr3*5VAR=expr2+4#这里是,即ESC下面键,不是Company nameLinux培培训训主主讲讲人:人:曾健曾健QQ 920086359Linux 培培训训流程控制:条件语句lIf判断命令语法结构if TEST-COMMANDS; then CONSEQUENT-COMMANDS;else ELSE-Commnds; fil注意上面在写在一整行里的,所以在ifthenfi三个命令之间要加入;如果是多行定义;不是必要的,如下面定义if TEST-COMMANDS then CONSEQUENT-CO

14、MMANDS filTEST-COMMANDS多是一些固定检测,包含在test或之中,在下一节会详细讲解 -a FILE 如果FILE存在则为真。TestaFILEtest -z STRING“STRING”的长度为零则为真。lif/then/elif/fi用来表示更复杂的结构,这跟C语言的的if()elseif()类似lif/then/else/fi可以简化成expr&true_command|false_command,这样更简洁,但也更能看懂-ahello.txt&echotrue|echofalse等同于echotrue;elseechofalse;fiif-ahello.txt;th

15、enIf-ahello.txt;thenechotrue;elseechofalseLinux 培培训训条件判断式l我们来看繁多的test测试表达式,他们出现if,while,case的条件判断位置.l条件表达式是有两种等效的格式,一种是testexpr,还是有一种是expr,test内嵌命令会根据对表达式expr的计算结果来确定返回0(成功)或1(失败)。可以通过显示$?来检查返回值l在这里test,都是命令!换句话说,它们必须与expr要隔着至少一个空格.象C语言一样expr的书写是错误的,而且从错误提示中很难看出这个问题来.这是C开发者要特别注意的.后面都是以为例来讲解条件判断表l条件判

16、断分为几大类文件判断运算符文件判断运算符,主要用于判断文件类型或是否存在的条件字符串比较运算符字符串比较运算符,主要为比较字符串是否相同算术比较运算符算术比较运算符 ,主要和于判断两个数之间大小关系Linux 培培训训条件判断式(2)运算符运算符描述描述示例示例文件比较运算符文件比较运算符 -efilename如果filename存在,则为真-e/var/log/syslog-dfilename如果filename为目录,则为真-d/tmp/mydir-ffilename如果filename为常规文件,则为真-f/usr/bin/grep-Lfilename如果filename为符号链接,则为

17、真-L/usr/bin/grep-rfilename如果filename可读,则为真-r/var/log/syslog-wfilename如果filename可写,则为真-w/var/mytmp.txt-xfilename如果filename可执行,则为真-x/usr/bin/grepfilename1-ntfilename2如果filename1比filename2新,则为真/tmp/install/etc/services-nt/etc/servicesfilename1-otfilename2如果filename1比filename2旧,则为真/boot/bzImage-otarch/i

18、386/boot/bzImageLinux 培培训训条件判断式(3)运算符运算符描述描述示例示例字符串比较运算符字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)-zstring如果string长度为零,则为真-z$myvar-nstring如果string长度非零,则为真-n$myvarString =string2如果string1与string2相同,则为真$myvar=onetwothreeString1 !=string2如果string1与string2不同,则为真$myvar!=onetwothree算术比较运算符算术比较运算符 num1-eqnum2等于3-e

19、q$mynumnum1-nenum2不等于3-ne$mynumnum1-ltnum2小于3-lt$mynumnum1-lenum2小于或等于3-le$mynumnum1-gtnum2大于3-gt$mynumNum1-genum2大于或等于3-ge$mynumLinux 培培训训条件判断实例ltest 3 -gt 4 & echo True | echo false判断3是否大于4lif$?-eq0;thenechoThatwasagoodjob!;if判断上一个程序返回值是否为0ltest -d $HOME ;echo $?判断用户的主目录是否存在ltest abc = def ;echo $

20、?判断两个字符串是否相等l -f hello.txt ;echo $?判断文件hello.txt是否存在Linux 培培训训If实例l对上一个命令返回值作判断#查找本地密码文件是否包含当前用户grep$USER/etc/passwdif$?-ne0;thenechonotalocalaccount;fil检测脚本执行是否有参数if$#-eq0;thenecho$0noparameter&2exit1Fil字符串比较if$(whoami)!=root;thenechoYouhavenopermissiontorun$0asnon-rootuser.exit1;fi上面等效于$(whoami)!=

21、root&(echoyouareusinganon-privilegedaccount;exit1)Linux 培培训训流程控制流程控制:多向分支多向分支Case语句语句l类似于C语言中的Switchl多向分支Case语法结构case 字符串字符串 in ; 模式模式1) command;模式模式2 ) command; esaclC语言开发者又要注意了,模式后是)而不是:因为:好象也是保留字,而且执行语句后面是;l这还是单行定义语句,多行定义如下case 字符串字符串 in 模式模式1) command;模式模式2 ) command; esacl模式可以用多个值模式可以用多个值,用用|隔开

22、隔开1|2|3|8|9 )Linux 培培训训case 实例,菜单选择#Display a menu echo _ echo 1 Restore echo 2 Backup echo 3 Unload echo #Read and excute the users selection echo -n Enter Choice: read CHOICE case $CHOICE in 1) echo Restore; 2) echo Backup; 3) echo Unload; *) echo Sorry $CHOICE is not a valid choice “exit 1 esac L

23、inux 培培训训l*)表示类似于C语言的default分支l模式可以是正则表达式,或通配符*.txtab.outLinux 培培训训复杂实例Linux 培培训训流程控制流程控制:bash 循环机制循环机制lBash支持三种循环for循环有两种形式。shell脚本编程中最常见的形式是对一组值进行迭代,对每个值都执行命令列表一次。这组值可能为空,在这种情况下命令列表就不会被执行。另外一种形式更加类似于传统的Cfor循环,使用3个数学表达式来控制循环的起始条件、步进函数和结束条件。while循环每次都在循环开始时计算一个条件的值,如果这个条件为true,就执行命令列表。如果这个条件最初不为true

24、,那么这些命令就永远都不会执行。Linux 培培训训流程控制流程控制:bash 循环机制循环机制(2)until循环执行一个命令列表,并在每个循环结束时计算某个条件的值。如果这个条件为true,就再次执行这个循环。即使条件最初不为true,这些命令也会至少被执行一次。Linux 培培训训流程控制流程控制:for 循环循环l这也是一个C语言开发者头痛的地方,这个for循环在shell并不是象C语言累加的形式,而是采用是脚本中特有的fordo格式l语法结构forNAMEinLIST;doCOMMANDS;donel这里表示从LIST依次取值(以空格为界)赋给变量Name,然后执行dodone中的命

25、令,这跟C语言差别非常大.如果in LIST不存在的话,就使用in $替换且for对每个位置参数执行一次COMMANDS,$是指命令行参数列表l例子:for x in abd 2 my stuff; do echo $x; donel如果想for实现象C中循环累加的结果需要用到$()表达式for ( x=2; x5; x+ ); do echo $x; doneLinux 培培训训for 实例 #!/usr/bin/env bash #取得/etc/目录下所有以r打头的文件名,判断是不是目录 for myfile in /etc/r* do if -d $myfile then echo $m

26、yfile (dir)else echo $myfilefi doneLinux 培培训训流程控制流程控制:while循环循环lwhile结构允许重复执行一系列命令,只要控制while循环的命令执行成功(退出状态是零)l语法格式语法格式while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done CONTROL-COMMAND采用if同样的判断test表达式这里while,do,done都是命令,在一行内要;隔开Linux 培培训训while实例X=1while ( X 10 ) do cho hello X is $X let X=X+1 done

27、Linux 培培训训Shift命令命令l很多时候,变量值是一组以空格隔开的列表,如命令行参数,一组文件名列表等等.在循环中可能需要逐一处理.C语言只能数组加下标,或指针变量移动来处理.那Shell脚本呢,当然开发者可以自己处理字符串,一个一个把值分离出来,但是在Shell脚本里有更简单办法.l使用Shift命令来处理.Shift命令每次把从命令行参数位置变量值取一个值出来,并且把总数减一.这样处理循环起来非常简单lshift后可加整数进行一次多个移位shift3Linux 培培训训shift实例l注意命令行参数总数,$#每shift一次,值减一.#利用shift计算所有参数乘积,假设参数均为整

28、数#! /bin/shresult=1while $# -gt 0 do result=expr $result * $1 shiftdoneecho $result#打印所有命令行参数until $# -eq 0 ; do echo “para= $1 count $# shift doneLinux 培培训训循环跳转机制循环跳转机制lexit,break 和和 continue跳出机制l这些机制跟C语言是一样的,可用于if和循环中.都是用于提前跳出breakn中止循环过程的执行,并且跳到下一个命令。N表示跳出嵌套的层数continuen停止循环过程的当前一个反复并且跳到循环中的下一个反复过

29、程的开始部分,n表示忽略的层数exitn停止shell程序的执行,并且将返回值设置为n。lbreak命令让您可以从一个循环中立即退出。如果使用了嵌套循环,也可以指定退出的层次数。因此如果在for循环中有一个until循环,而这个for循环在另外一个for循环之中,所有这些循环又全部在一个while循环中,那么break3就会立即结束until循环和2个for循环,并将控制权返回给while循环中的代码lcontinue语句可以跳过命令列表中的剩下的语句,直接跳转到下一次循环的开头Linux 培培训训Continue和break的应用whiletruedoecho Enter file to r

30、emove: cread FILEif test ! -f $FILEthenecho $FILE is not a regular filecontinuefiecho removing $FILErm $FILEbreakdoneCompany nameLinux培培训训主主讲讲人:人:曾健曾健QQ 920086359Linux 培培训训建立交互式脚本(1)l用echo来输出信息lread接收用户的输入使用内建命令read,它从标准输入读取变量的值,读入单行输入并将各个输入词分配给各个变量lreadVAR;echo$VAR使用-p选项为每次read提供提示。使用以引号括起来的字符串提供提示

31、lread-pInsteadof$VAR,whatnumberwouldyoulike?VAR;$echoVAR从管道里读取lls | while read file; do ls $file; doneread可一次性读取多个变量lls -i | while read inode file; do lecho File $file has inode $inode; doneLinux 培培训训交互式菜单#! /bin/bashecho *echo Please select your operation:echo 1 Copyecho 2 Deleteecho 3 Backupecho *

32、read opcase $op in C) echo your selection is Copy ; D) echo your selection is Delete ; B) echo your selection is Backup ; *) echo invalid selectionesacLinux 培培训训建立交互式脚本(2)lselect表达式是一种bash的扩展应用,用户可以从一组不同的值中进行选择.l语句结构:selectvarin.;dobreakDonevar$存储用户所选的值Linux 培培训训select实例#!/bin/sh echo What is your f

33、avourite OS? select var in Linux Gnu Hurd Free BSD Other; do breakdone echo You have selected $varLinux 培培训训使用函数l脚本的函数比较受限制不能单独写在一个脚本里,至少有一个调用语句l定义function_name().函数用return返回值函数参数也采用$1,$2之类进行传输show() echo show $* echo $* echo after function show c d echo $* Linux 培培训训函数实例#!/usr/bin/env bash myvar=he

34、llo he h myfunc() local x local myvar=one two three for x in $myvar do echo $x done myfunc echo $myvar $xLinux 培培训训简单脚本调试l简单一般用echo直接输出内部变量,复杂一点采用trap命令l也在脚本执行时加入-x参数shxmenu1.sh#sh是Shell程序名字,表示运行menu1.sh并显示内部变量值或bashxmenu1.sh也可执行该脚本并显示所有变量的值。l不执行,只执行语法检查-n参数shnmenu1.sh不报错表示没有错误Linux 培培训训用trap调试脚本ltr

35、ap命令用于捕获指定的信号并执行预定义的命令。l其基本的语法是:trapcommandsignal其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。可以用killl命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。lshell脚本在执行时,会产生三个所谓的“伪信号”,(之所以称之为“伪信号”是因为这三个信号是由shell产生的,而其它的信号是由操作系统产生的),通过使用trap命令捕获这三个“伪信号”并输出相关信息对调试非常有帮助。lShell伪信号EXIT从一个函数中退出或整个脚本执行完毕E

36、RR当一条命令返回非零状态时(代表命令执行不成功DEBUG脚本中每一条命令执行之前Linux 培培训训trap调试脚本l通过捕获EXIT信号,我们可以在shell脚本中止执行或从函数中退出时,输出某些想要跟踪的变量的值,并由此来判断脚本的执行状态以及出错原因,其使用方法是:trapcommandEXIT或trapcommand0l通过捕获ERR信号,我们可以方便的追踪执行不成功的命令或函数,并输出相关的调试信息,以下是一个捕获ERR信号的示例程序,其中的$LINENO是一个shell的内置变量,代表shell脚本的当前行号。trapERRTRAP$LINENOERRLinux 培培训训trap

37、调试脚本l在调试过程中,为了跟踪某些变量的值,我们常常需要在shell脚本的许多地方插入相同的echo语句来打印相关变量的值,这种做法显得烦琐而笨拙。而通过捕获DEBUG信号,我们只需要一条trap语句就可以完成对相关变量的全程跟踪。trapecho“beforeexecuteline:$LINENO,a=$a,b=$b,c=$c”DEBUGLinux 培培训训trap ERR实例ERRTRAP()echo LINE:$1 Error: Command or function exited with status $?“foo()return 1;trap ERRTRAP $LINENO ER

38、RabcfooLinux 培培训训Trap EXITERRTRAP()echo LINE:$1 Error: Command or function exited with status $?“foo()return 1;trap ERRTRAP $LINENO EXITabcfooLinux 培培训训Trap Debug#!/bin/bashtrap echo before execute line:$LINENO, a=$a,b=$b,c=$c DEBUGa=1if $a -eq 1 Thenb=2Elseb=1Fic=3echo EndCompany nameLinux培培训训主主讲讲人

39、:人:曾健曾健QQ 920086359Linux 培培训训例:Service脚本l/sbin/service用于控制各种服务的启动和停止#!/bin/sh# Set up a default search path.PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/binexport PATHVERSION=basename $0 ver. 0.91USAGE=Usage: basename $0 | -status-all | service_name command | -full-restart SERVICE=SERVICEDIR=/etc/i

40、nit.dOPTIONS=if $# -eq 0 ; then #判断参数是否0,脚本要求必须有参数 echo $USAGE &2 exit 1fi Linux 培培训训复杂脚本样例l1.检测某个进程是否正常工作check_process.shl2.检测磁盘空间是否足够,并报警check_disk.shLinux 培培训训列出目录树#!/bin/sh# dtree: Usage: dtree any directorydir=$1:-.(cd $dir; pwd)find $dir -type d -print | sort -f | sed -e s,$1, -e /$/d -e s,/*/

41、(/*)$,-1, -e s,/*/,| ,gLinux 培培训训init脚本例子 l一个init脚本启动在UNIX和Linux机器上的系统服务l存储在系统的特定位置,比如/etc/rc,/etc/rc.d/init.d或者/etc/init.d目录下,lInit,初始化进程,读取它的配置文件来决定在某些运行等级哪些服务来启动或者停止,l在Linux启动部分,将详细分析启动脚本Linux 培培训训课堂作业l写一个脚本,计算脚本所有参数的累加比如ex.sh138,应该得出结果12来要求用shift和forindo两种方法求出值来l用for,和read写一个脚本来完成select的功能把一个列表加上序号分行显示用read的读取用户的值,并且用returnn的形式返回给调用者。l./my_select.shlinuxfreebsdwinntCompany nameLinux培培训训主主讲讲人:人:曾健曾健QQ 920086359在疯狂的时代把握未来在疯狂的时代把握未来

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号