1、ShellShell脚本基础脚本基础主讲主讲:刘晓涛刘晓涛1创建和执行创建和执行创建和执行创建和执行shellshellshellshell脚本脚本脚本脚本使用使用使用使用echoechoechoecho命令显示消息命令显示消息命令显示消息命令显示消息创建变量创建变量创建变量创建变量使用本地和全局变量使用本地和全局变量使用本地和全局变量使用本地和全局变量计算表达式计算表达式计算表达式计算表达式使用使用使用使用ifififif构造执行基于条件的构造执行基于条件的构造执行基于条件的构造执行基于条件的shellshellshellshell脚本脚本脚本脚本使用使用使用使用casecasecaseca
2、se构造执行基于条件的构造执行基于条件的构造执行基于条件的构造执行基于条件的shellshellshellshell脚本脚本脚本脚本识别用于执行重复任务的识别用于执行重复任务的识别用于执行重复任务的识别用于执行重复任务的whilewhilewhilewhile、forforforfor、和、和、和、和untiluntiluntiluntil构造构造构造构造在在在在shellshellshellshell脚本中使用脚本中使用脚本中使用脚本中使用breakbreakbreakbreak和和和和continuecontinuecontinuecontinue语句语句语句语句控制进程的执行控制进程的执
3、行控制进程的执行控制进程的执行计算命令的开始到结束之间的时间计算命令的开始到结束之间的时间计算命令的开始到结束之间的时间计算命令的开始到结束之间的时间议程议程2Shell图示图示3ShellShellShellShell脚本脚本脚本脚本u如果你有一系列经常使用的如果你有一系列经常使用的如果你有一系列经常使用的如果你有一系列经常使用的LinuxLinuxLinuxLinux命令,你可命令,你可命令,你可命令,你可以把它们存储在一个文件中。以把它们存储在一个文件中。以把它们存储在一个文件中。以把它们存储在一个文件中。ShellShellShellShell可以读取这可以读取这可以读取这可以读取这个
4、文件并执行其中的命令。这样的文件被称为个文件并执行其中的命令。这样的文件被称为个文件并执行其中的命令。这样的文件被称为个文件并执行其中的命令。这样的文件被称为脚本文件脚本文件脚本文件脚本文件执行执行执行执行shellshellshellshell脚本脚本脚本脚本u要创建一个要创建一个要创建一个要创建一个shellshellshellshell脚本,你要使用任何编辑器脚本,你要使用任何编辑器脚本,你要使用任何编辑器脚本,你要使用任何编辑器比如比如比如比如vivivivi在文本文件中编写它在文本文件中编写它在文本文件中编写它在文本文件中编写它u为了使用为了使用为了使用为了使用bash shellb
5、ash shellbash shellbash shell来执行脚本来执行脚本来执行脚本来执行脚本magic,magic,magic,magic,其命令其命令其命令其命令是:是:是:是:n$bash magic$bash magic$bash magic$bash magic 或或或或$./magic$./magic$./magic$./magicn$为终端提示符为终端提示符为终端提示符为终端提示符(普通用户普通用户普通用户普通用户)概述概述4echoechoechoecho命令命令命令命令 u用于在屏幕上显示消息用于在屏幕上显示消息用于在屏幕上显示消息用于在屏幕上显示消息u$echo Thi
6、s is an example of the echo echo This is an example of the echo echo This is an example of the echo echo This is an example of the echo commandcommandcommandcommandu这是这是这是这是echoechoechoecho命令的一个例子命令的一个例子命令的一个例子命令的一个例子概述概述5#符号符号符号符号 u用于在用于在用于在用于在shellshellshellshell脚本中可以包含脚本中可以包含脚本中可以包含脚本中可以包含注解注解注解注
7、解入口入口入口入口uecho echo echo echo“HelloHelloHelloHello”u#This is a comment line.This would#This is a comment line.This would#This is a comment line.This would#This is a comment line.This would not produce any outputnot produce any outputnot produce any outputnot produce any outputuecho echo echo echo“wo
8、rldworldworldworld”u这个例子中,第二行是一个注解的例子。它这个例子中,第二行是一个注解的例子。它这个例子中,第二行是一个注解的例子。它这个例子中,第二行是一个注解的例子。它将被将被将被将被shellshellshellshell忽略,而且不产生任何消息忽略,而且不产生任何消息忽略,而且不产生任何消息忽略,而且不产生任何消息概述概述6创建变量创建变量创建变量创建变量u可以在任何时间通过简单的赋值来创建。可以在任何时间通过简单的赋值来创建。可以在任何时间通过简单的赋值来创建。可以在任何时间通过简单的赋值来创建。u语法语法语法语法n =variable name=variable
9、 name=variable name=uLinuxLinuxLinuxLinux中的中的中的中的所有变量都被当作字符串所有变量都被当作字符串所有变量都被当作字符串所有变量都被当作字符串。引用变量引用变量引用变量引用变量u$符号用于引用一个变量的内容符号用于引用一个变量的内容符号用于引用一个变量的内容符号用于引用一个变量的内容uvariable1=$variable2variable1=$variable2变量变量7读入值给变量读入值给变量u在执行在执行shellshell脚本时,脚本时,shellshell还允许用户还允许用户从键盘中输入一个值给变量。可以使用从键盘中输入一个值给变量。可以使
10、用readread命令来做命令来做n$read fname$read fname8局部变量局部变量局部变量局部变量u当引用当引用当引用当引用shellshellshellshell时,只有创建它的时,只有创建它的时,只有创建它的时,只有创建它的shellshellshellshell能够知道能够知道能够知道能够知道到变量的存在到变量的存在到变量的存在到变量的存在全局变量全局变量全局变量全局变量u称为子称为子称为子称为子shellshellshellshellushellshellshellshell中创建的变量局部于创建它的中创建的变量局部于创建它的中创建的变量局部于创建它的中创建的变量局部于
11、创建它的shell,shell,shell,shell,除除除除非使用非使用非使用非使用exportexportexportexport命令特别指出是全局的命令特别指出是全局的命令特别指出是全局的命令特别指出是全局的环境变量环境变量环境变量环境变量u通过改变这些变量的值,用户能够定制此环境通过改变这些变量的值,用户能够定制此环境通过改变这些变量的值,用户能够定制此环境通过改变这些变量的值,用户能够定制此环境本地和全局本地和全局 Shell 变量变量9环境变量环境变量环境变量环境变量(续续续续)u一些环境变量的例子是一些环境变量的例子是一些环境变量的例子是一些环境变量的例子是HOME,PATH,
12、PS1,HOME,PATH,PS1,HOME,PATH,PS1,HOME,PATH,PS1,PS2,LOGNAME,SHLVL,PS2,LOGNAME,SHLVL,PS2,LOGNAME,SHLVL,PS2,LOGNAME,SHLVL,及及及及SHELLSHELLSHELLSHELLuHOMEHOMEHOMEHOME变量变量变量变量uLinuxLinuxLinuxLinux系统中的每个用户都有一个相关的称系统中的每个用户都有一个相关的称系统中的每个用户都有一个相关的称系统中的每个用户都有一个相关的称作作作作HOMEHOMEHOMEHOME的目录的目录的目录的目录u当一个用户登录后当一个用户登录
13、后当一个用户登录后当一个用户登录后,进入相应的进入相应的进入相应的进入相应的HOMEHOMEHOMEHOME的目录的目录的目录的目录u$echo$HOME$echo$HOME$echo$HOME$echo$HOME 本地和全局本地和全局 Shell 变量变量(续续)10环境变量环境变量环境变量环境变量(续续续续)uPATHPATHPATHPATH变量变量变量变量n包含一列包含一列包含一列包含一列用冒号定界用冒号定界用冒号定界用冒号定界的目录的路径名字,的目录的路径名字,的目录的路径名字,的目录的路径名字,便于可执行程序的搜索便于可执行程序的搜索便于可执行程序的搜索便于可执行程序的搜索uPS1P
14、S1PS1PS1变量变量变量变量nPS1(Prompt String 1)PS1(Prompt String 1)PS1(Prompt String 1)PS1(Prompt String 1)变量包含了变量包含了变量包含了变量包含了shellshellshellshell提提提提示符,示符,示符,示符,$符号符号符号符号n$PS1=HELLO$PS1=HELLO$PS1=HELLO$PS1=HELLOnHELLOHELLOHELLOHELLONew promptNew promptNew promptNew prompt本地和全局本地和全局 Shell 变量变量(续续)11环境变量环境变量环
15、境变量环境变量(续续续续)uPS2PS2PS2PS2变量变量变量变量n是为第二个提示符设置值的环境变量是为第二个提示符设置值的环境变量是为第二个提示符设置值的环境变量是为第二个提示符设置值的环境变量uLOGNAMELOGNAMELOGNAMELOGNAME变量变量变量变量n包含用户的注册名字包含用户的注册名字包含用户的注册名字包含用户的注册名字n$echo echo echo echo“$LOGNAME$LOGNAME$LOGNAME$LOGNAME”uSHLVLSHLVLSHLVLSHLVL变量变量变量变量n该变量包含你当前工作的该变量包含你当前工作的该变量包含你当前工作的该变量包含你当前工
16、作的shell levelshell levelshell levelshell level本地和全局本地和全局 Shell 变量变量(续续)12环境变量环境变量环境变量环境变量(续续续续)uSHELLSHELLSHELLSHELL变量变量变量变量n环境变量存储了用户的缺省环境变量存储了用户的缺省环境变量存储了用户的缺省环境变量存储了用户的缺省shellshellshellshelluenvenvenvenv命令命令命令命令n可用来查看所有的已移出的环境变量表和可用来查看所有的已移出的环境变量表和可用来查看所有的已移出的环境变量表和可用来查看所有的已移出的环境变量表和它们各自的值它们各自的值它
17、们各自的值它们各自的值本地和全局本地和全局 Shell 变量变量(续续)13在单个命令行中使用多个命令的另一种方法(非在单个命令行中使用多个命令的另一种方法(非在单个命令行中使用多个命令的另一种方法(非在单个命令行中使用多个命令的另一种方法(非PipesPipesPipesPipes)是通过命令替换是通过命令替换是通过命令替换是通过命令替换uecho The date is dateecho The date is date”exprexprexprexpr命令命令命令命令u用于求值算术表达式。该命令的输出被发送到用于求值算术表达式。该命令的输出被发送到用于求值算术表达式。该命令的输出被发送到
18、用于求值算术表达式。该命令的输出被发送到标准输出标准输出标准输出标准输出u$expr 4+5$expr 4+5$expr 4+5$expr 4+5 将在屏幕上显示将在屏幕上显示将在屏幕上显示将在屏幕上显示9 9 9 9命令替换命令替换14算术展开:算术展开:u你可以在你可以在$($()中括一个表达式,用中括一个表达式,用下面的命令来计算它的值:下面的命令来计算它的值:n$(expression)$(expression)命令替换命令替换(续续)15编写一个编写一个编写一个编写一个shellshellshellshell脚本用于计算呼叫中心未应答的询问的数量。该脚本脚本用于计算呼叫中心未应答的询
19、问的数量。该脚本脚本用于计算呼叫中心未应答的询问的数量。该脚本脚本用于计算呼叫中心未应答的询问的数量。该脚本应该接收一天内所报告的询问的总数和应答的询问的数量,以便计算应该接收一天内所报告的询问的总数和应答的询问的数量,以便计算应该接收一天内所报告的询问的总数和应答的询问的数量,以便计算应该接收一天内所报告的询问的总数和应答的询问的数量,以便计算未应答的询问的数量。未应答的询问的数量。未应答的询问的数量。未应答的询问的数量。所有未应答的询问的总数所有未应答的询问的总数所有未应答的询问的总数所有未应答的询问的总数=所有询问的总数所有询问的总数所有询问的总数所有询问的总数-应答的询问的应答的询问的
20、应答的询问的应答的询问的数量数量数量数量echoecho Please enter the total number of queries reported today.Please enter the total number of queries reported today.read read totalqueriestotalqueriesecho Please enter the number of queries answered.echo Please enter the number of queries answered.read answeredread answeredp
21、ending=pending=$($(totalqueriestotalqueries-answered)-answered)echo Number of calls pending=$pending“echo Number of calls pending=$pending“chmodchmod+x +x callpendingcallpending Example116test test test test 和和和和 命令命令命令命令u求值表达式,并返回求值表达式,并返回求值表达式,并返回求值表达式,并返回true(0)true(0)true(0)true(0)或或或或 falsefals
22、efalsefalseifififif构造构造构造构造uLinux shellLinux shellLinux shellLinux shell提供了循环和判定的构造,可以提供了循环和判定的构造,可以提供了循环和判定的构造,可以提供了循环和判定的构造,可以在在在在shellshellshellshell脚本中使用脚本中使用脚本中使用脚本中使用算术测试算术测试算术测试算术测试u结合结合结合结合ifififif构造,它可用于测试变量的数字值构造,它可用于测试变量的数字值构造,它可用于测试变量的数字值构造,它可用于测试变量的数字值条件执行条件执行17串测试串测试串测试串测试utesttesttest
23、test命令也可用于字符串命令也可用于字符串命令也可用于字符串命令也可用于字符串文件测试文件测试文件测试文件测试utesttesttesttest命令也可用于检查文件的状态命令也可用于检查文件的状态命令也可用于检查文件的状态命令也可用于检查文件的状态exitexitexitexit命令命令命令命令u用于终止用于终止用于终止用于终止shellshellshellshell脚本的执行并返回到脚本的执行并返回到脚本的执行并返回到脚本的执行并返回到$提示符提示符提示符提示符下下下下条件执行条件执行(续续)18test测试命令测试命令1 -eqeqeqeq:等于则为真:等于则为真:等于则为真:等于则为真
24、nenenene:不等于则为真:不等于则为真:不等于则为真:不等于则为真-gtgtgtgt:大于则为真:大于则为真:大于则为真:大于则为真-gegegege:大于等于则为真:大于等于则为真:大于等于则为真:大于等于则为真-ltltltlt:小于则为真:小于则为真:小于则为真:小于则为真-le-le-le-le:小于等于则为真:小于等于则为真:小于等于则为真:小于等于则为真数值测试数值测试 19test测试命令测试命令2=:等于则为真:等于则为真:等于则为真:等于则为真!=!=!=!=:不相等则为真:不相等则为真:不相等则为真:不相等则为真-z-z-z-z字符串:字符串长度为零则为真字符串:字
25、符串长度为零则为真字符串:字符串长度为零则为真字符串:字符串长度为零则为真-n-n-n-n字符串:字符串长度不为零则为真字符串:字符串长度不为零则为真字符串:字符串长度不为零则为真字符串:字符串长度不为零则为真字符串测试字符串测试20test测试命令测试命令3-e-e-e-e文件名:如果文件存在则为真文件名:如果文件存在则为真文件名:如果文件存在则为真文件名:如果文件存在则为真-r-r-r-r文件名:如果文件存在且可读则为真文件名:如果文件存在且可读则为真文件名:如果文件存在且可读则为真文件名:如果文件存在且可读则为真-w-w-w-w文件名:如果文件存在且可写则为真文件名:如果文件存在且可写则
26、为真文件名:如果文件存在且可写则为真文件名:如果文件存在且可写则为真-x-x-x-x文件名:如果文件存在且可执行则为真文件名:如果文件存在且可执行则为真文件名:如果文件存在且可执行则为真文件名:如果文件存在且可执行则为真-s-s-s-s文件名:如果文件存在且至少有一个字符则为真文件名:如果文件存在且至少有一个字符则为真文件名:如果文件存在且至少有一个字符则为真文件名:如果文件存在且至少有一个字符则为真-d-d-d-d文件名:如果文件存在且为目录则为真文件名:如果文件存在且为目录则为真文件名:如果文件存在且为目录则为真文件名:如果文件存在且为目录则为真-f-f-f-f文件名:如果文件存在且为普通
27、文件则为真文件名:如果文件存在且为普通文件则为真文件名:如果文件存在且为普通文件则为真文件名:如果文件存在且为普通文件则为真-c-c-c-c文件名:如果文件存在且为字符型特殊文件则为真文件名:如果文件存在且为字符型特殊文件则为真文件名:如果文件存在且为字符型特殊文件则为真文件名:如果文件存在且为字符型特殊文件则为真-b-b-b-b文件名:如果文件存在且为块特殊文件则为真文件名:如果文件存在且为块特殊文件则为真文件名:如果文件存在且为块特殊文件则为真文件名:如果文件存在且为块特殊文件则为真-a-a-a-a 并且并且并且并且 o o o o 或者或者或者或者 !非非非非文件测试文件测试21#!/b
28、in/bash#!/bin/bashecho Enter the percentage of calls answered same echo Enter the percentage of calls answered same day.day.read actualread actualif if$actual-le 80$actual-le 80 thenthen echo Your Grade is Average.echo Your Grade is Average.elifelif$actual-$actual-gtgt 80 80-a-a$actual-le 90$actual-
29、le 90 thenthen echo Your Grade is Good.echo Your Grade is Good.elseelse echo Your Grade is Outstanding.echo Your Grade is Outstanding.fi fiExample222shellshell脚本中使用的这个构造依据变量的值脚本中使用的这个构造依据变量的值而执行一组特定指令而执行一组特定指令当变量的值和其中一个指定的值相匹配时,当变量的值和其中一个指定的值相匹配时,就执行写在该值下的一组命令就执行写在该值下的一组命令caseesac 构造构造23#!/bin/bash#
30、/bin/bashecho List of Services Offered by Diaz Telecommunications echo List of Services Offered by Diaz Telecommunications echo 1)Global Roamecho 1)Global Roamecho 2)V-mailecho 2)V-mailecho 3)Mail on Moveecho 3)Mail on Moveecho 4)Caller-IDecho 4)Caller-IDecho 5)Dial a Pizzaecho 5)Dial a Pizzaecho n
31、 Select the service for which you need more information 1-5:echo n Select the service for which you need more information 1-5:read choiceread choicecase$choice incase$choice in1)echo You just need one cell-phone number wherever you travel across 1)echo You just need one cell-phone number wherever yo
32、u travel across the world.;the world.;2)echo You can record your messages when you are not able to take a 2)echo You can record your messages when you are not able to take a call.;call.;3)echo You can receive e-mail messages on your cell-phone.;3)echo You can receive e-mail messages on your cell-pho
33、ne.;4)echo You can display the callers telephone number on your handset 4)echo You can display the callers telephone number on your handset screen whenever you receive a call so that you know whos calling.;screen whenever you receive a call so that you know whos calling.;5)echo You can order for piz
34、za from your cell-phone.;5)echo You can order for pizza from your cell-phone.;*)*)echo You have selected an invalid option.;echo You have selected an invalid option.;esacesacExample324whilewhilewhilewhile构造构造构造构造while while while while dodododo s)s)s)donedonedonedoneu只有条件为真时,就执行只有条件为真时,就执行只有条件为真时,就执
35、行只有条件为真时,就执行dodododo和和和和donedonedonedone之间的命令之间的命令之间的命令之间的命令 untiluntiluntiluntil构造构造构造构造uuntiluntiluntiluntil循环构造的求值模式于循环构造的求值模式于循环构造的求值模式于循环构造的求值模式于whilewhilewhilewhile循环相反。循环相反。循环相反。循环相反。untiluntiluntiluntil循环将继续执行直到求值的条件为真。循环将继续执行直到求值的条件为真。循环将继续执行直到求值的条件为真。循环将继续执行直到求值的条件为真。迭代迭代25forforforfor构造构造
36、构造构造for variable_name in for variable_name in for variable_name in for variable_name in dododododonedonedonedoneuforforforfor循环取一列值作为输入并对循环中每个值循环取一列值作为输入并对循环中每个值循环取一列值作为输入并对循环中每个值循环取一列值作为输入并对循环中每个值执行循环执行循环执行循环执行循环breakbreakbreakbreak和和和和continuecontinuecontinuecontinue命令命令命令命令ubreakbreakbreakbreak命令
37、引起终止循环命令引起终止循环命令引起终止循环命令引起终止循环ucontinuecontinuecontinuecontinue命令的使用将强迫一个新的重复命令的使用将强迫一个新的重复命令的使用将强迫一个新的重复命令的使用将强迫一个新的重复迭代迭代(续续)26#!/bin/bash#!/bin/bashecodeecode=1000=1000while$while$ecodeecode-le 1008 -le 1008 dodo echo Enter data for the employee with Employee Code=$echo Enter data for the employe
38、e with Employee Code=$ecodeecode echo-n Employee Name:echo-n Employee Name:read name read name echo-n Email Address:echo-n Email Address:read email read email echo-n Telephone Number:echo-n Telephone Number:read read telnotelno echo$echo$ecodeecode:$name:$email:$:$name:$email:$telnotelno ccemployeec
39、cemployee(ecodeecode=$ecode+1)=$ecode+1)donedoneExample427请求后台处理请求后台处理u用于请求后台进程的符号是用于请求后台进程的符号是(&)(&)n$wc tempfile&$wc tempfile&n1 2082 1 2082 n$vi newfile$vi newfile检查后台进程检查后台进程uPsPs(进程状态)命令为每个当前活动的进程状态)命令为每个当前活动的每个进程产生一行入口。每个进程产生一行入口。控制进程的执行控制进程的执行28终止后台进程终止后台进程终止后台进程终止后台进程u可用可用可用可用killkillkillkil
40、l命令,如下所示命令,如下所示命令,如下所示命令,如下所示n$kill 278$kill 278$kill 278$kill 278查看完成一个命令所花的时间查看完成一个命令所花的时间查看完成一个命令所花的时间查看完成一个命令所花的时间u你可以使用你可以使用你可以使用你可以使用timetimetimetime命令来查看一个命令从开始命令来查看一个命令从开始命令来查看一个命令从开始命令来查看一个命令从开始到结束所花的时间。到结束所花的时间。到结束所花的时间。到结束所花的时间。u$time find/etc-name time find/etc-name time find/etc-name ti
41、me find/etc-name passwdpasswdpasswdpasswd 2 2 2 2/dev/null/dev/null/dev/null/dev/null控制进程的执行控制进程的执行(续续)29垂直条垂直条垂直条垂直条 (|)(|)(|)(|)是管道字符是管道字符是管道字符是管道字符它指示它指示它指示它指示shell shell shell shell:|前面的命令的输出作为前面的命令的输出作为前面的命令的输出作为前面的命令的输出作为|之后命令的输入发送之后命令的输入发送之后命令的输入发送之后命令的输入发送lsls l|morel|more用管道组合命令用管道组合命令,功能强大
42、功能强大管道的介绍管道的介绍30创建和执行创建和执行创建和执行创建和执行shellshellshellshell脚本脚本脚本脚本使用使用使用使用echoechoechoecho命令显示消息命令显示消息命令显示消息命令显示消息创建变量创建变量创建变量创建变量使用本地和全局变量使用本地和全局变量使用本地和全局变量使用本地和全局变量计算表达式计算表达式计算表达式计算表达式使用使用使用使用ifififif构造执行基于条件的构造执行基于条件的构造执行基于条件的构造执行基于条件的shellshellshellshell脚本脚本脚本脚本使用使用使用使用casecasecasecase构造执行基于条件的构造执
43、行基于条件的构造执行基于条件的构造执行基于条件的shellshellshellshell脚本脚本脚本脚本识别用于执行重复任务的识别用于执行重复任务的识别用于执行重复任务的识别用于执行重复任务的whilewhilewhilewhile、forforforfor、和、和、和、和untiluntiluntiluntil构造构造构造构造在在在在shellshellshellshell脚本中使用脚本中使用脚本中使用脚本中使用breakbreakbreakbreak和和和和continuecontinuecontinuecontinue语句语句语句语句控制进程的执行控制进程的执行控制进程的执行控制进程的执行计算命令的开始到结束之间的时间计算命令的开始到结束之间的时间计算命令的开始到结束之间的时间计算命令的开始到结束之间的时间小结小结31