《linuxShellprogramming》由会员分享,可在线阅读,更多相关《linuxShellprogramming(79页珍藏版)》请在金锄头文库上搜索。
1、linux-Shell-linux-Shell-programmingprogrammingContent1.Shell综述综述 什么是什么是什么是什么是 Shell?Shell?为什么要用为什么要用为什么要用为什么要用 Shell?Shell?2.创建和执行创建和执行Shell程序程序3.Shell程序设计的语法程序设计的语法 变量、条件测试、条件语句、重复语句、命变量、条件测试、条件语句、重复语句、命变量、条件测试、条件语句、重复语句、命变量、条件测试、条件语句、重复语句、命令表和语句块、函数令表和语句块、函数令表和语句块、函数令表和语句块、函数4.实例实例1. Shell Overvie
2、wuuShell用户和操作系统之间的接口用户和操作系统之间的接口用户和操作系统之间的接口用户和操作系统之间的接口作为核外程序而存在作为核外程序而存在作为核外程序而存在作为核外程序而存在文件子系统文件子系统用户用户硬硬 件件 控控 制制硬硬 件件内核内核Shell用户用户用户用户用户用户高级语言和实用程序高级语言和实用程序系统调用系统调用进程进程管理管理子系统子系统进程间通信进程间通信存储管理存储管理调度程序调度程序设备驱动程序设备驱动程序字符设备字符设备块设备块设备高速缓存高速缓存核外程序核外程序Shell: 用户用户和操作系统和操作系统之间的接口之间的接口Shell: 用户和操作系统之间的接
3、口用户和操作系统之间的接口 csh 其它程序其它程序 bash X窗口系统窗口系统Shell: 作为核外程序而存在内核内核各种不同的Shellshellshell名称名称名称名称描述描述描述描述位置位置位置位置ashash一个小的一个小的一个小的一个小的shellshell/bin/ash/bin/ashash.staticash.static一个不依靠软件库的一个不依靠软件库的一个不依靠软件库的一个不依靠软件库的ashash版本版本版本版本/bin/ash.static/bin/ash.staticbshbshashash的一个符号链接的一个符号链接的一个符号链接的一个符号链接/bin/bs
4、h/bin/bshbashbash“BourneAgainShell”“BourneAgainShell”。LinuxLinux中的主角,来自中的主角,来自中的主角,来自中的主角,来自GNUGNU项目项目项目项目/bin/bash/bin/bashshshbashbash的一个符号链接的一个符号链接的一个符号链接的一个符号链接/bin/sh/bin/shcshcshCshell,tcshCshell,tcsh的一个符号链接的一个符号链接的一个符号链接的一个符号链接/bin/csh/bin/cshtcshtcsh和和和和cshcsh兼容的兼容的兼容的兼容的shellshell/bin/tcsh/
5、bin/tcshkshkshKornShellKornShell/bin/ksh/bin/kshShell 的双重角色的双重角色uu命令解释程序命令解释程序命令解释程序命令解释程序 LinuxLinux的开机启动过程;进程树的开机启动过程;进程树的开机启动过程;进程树的开机启动过程;进程树 ShellShell的工作步骤的工作步骤的工作步骤的工作步骤uu打印提示符;得到命令行;解析命令;查找文件;打印提示符;得到命令行;解析命令;查找文件;打印提示符;得到命令行;解析命令;查找文件;打印提示符;得到命令行;解析命令;查找文件;准备参数;执行命令准备参数;执行命令准备参数;执行命令准备参数;执行
6、命令uu独立的程序设计语言解释器独立的程序设计语言解释器独立的程序设计语言解释器独立的程序设计语言解释器uuShellShell编程非常容易掌握,可帮助用户完成特定的任务、编程非常容易掌握,可帮助用户完成特定的任务、编程非常容易掌握,可帮助用户完成特定的任务、编程非常容易掌握,可帮助用户完成特定的任务、提高维护系统的效率。提高维护系统的效率。提高维护系统的效率。提高维护系统的效率。Shell的元字符(通配符)的元字符(通配符)uu. . 上一级目录上一级目录上一级目录上一级目录uu. . 当前工作的目录当前工作的目录当前工作的目录当前工作的目录uu 用户目录用户目录用户目录用户目录uu a-z
7、* a-z* 小写字母开头的所有字符小写字母开头的所有字符小写字母开头的所有字符小写字母开头的所有字符串串串串uuA-Z*A-Z*大写字母开头的所有字大写字母开头的所有字大写字母开头的所有字大写字母开头的所有字符串符串符串符串uu$ $ bashbash提示符,也是提示符,也是提示符,也是提示符,也是shellshell的位置的位置的位置的位置变量参数变量参数变量参数变量参数uu& & 将命令以后台方式执行将命令以后台方式执行将命令以后台方式执行将命令以后台方式执行uu 将命令的输出重导人文件中将命令的输出重导人文件中将命令的输出重导人文件中将命令的输出重导人文件中uu将输出加在一个已经存在的
8、将输出加在一个已经存在的将输出加在一个已经存在的将输出加在一个已经存在的文件后面文件后面文件后面文件后面uu将命令的输入流指定为由文件将命令的输入流指定为由文件将命令的输入流指定为由文件将命令的输入流指定为由文件中加载中加载中加载中加载uu|建立管道建立管道建立管道建立管道 * 匹配任意匹配任意长度的字符度的字符?匹配匹配长度度为一个的任意字符一个的任意字符 匹配包含在括号里的任何匹配包含在括号里的任何单字符字符括号内的一个字符串括号内的一个字符串转义符,解除特殊字符的特殊意符,解除特殊字符的特殊意义;分隔命令行的多个命令用;分隔命令行的多个命令用做注做注释用用标准输入、输出和错误处理文件uu
9、shellshell解释执行一条解释执行一条解释执行一条解释执行一条linuxlinux命令时,同时启动了系统命令时,同时启动了系统命令时,同时启动了系统命令时,同时启动了系统的监控程序,用于跟踪和监视该命令的输入、输出和执的监控程序,用于跟踪和监视该命令的输入、输出和执的监控程序,用于跟踪和监视该命令的输入、输出和执的监控程序,用于跟踪和监视该命令的输入、输出和执行情况。这种监督机制通过系统的行情况。这种监督机制通过系统的行情况。这种监督机制通过系统的行情况。这种监督机制通过系统的3 3种种种种“ “标准文件标准文件标准文件标准文件”执执执执行的。它们分别用不同的文件描述字表示。行的。它们分
10、别用不同的文件描述字表示。行的。它们分别用不同的文件描述字表示。行的。它们分别用不同的文件描述字表示。uu(1 1)标准输入文件:描述命令获得输入数据。用文件)标准输入文件:描述命令获得输入数据。用文件)标准输入文件:描述命令获得输入数据。用文件)标准输入文件:描述命令获得输入数据。用文件描述字描述字描述字描述字0 0表示,一般指键盘输入表示,一般指键盘输入表示,一般指键盘输入表示,一般指键盘输入 。uu(2 2)标准输出文件:描述接收命令的输出。用文件描)标准输出文件:描述接收命令的输出。用文件描)标准输出文件:描述接收命令的输出。用文件描)标准输出文件:描述接收命令的输出。用文件描述字述字
11、述字述字1 1表示,一般为屏幕输出信息。表示,一般为屏幕输出信息。表示,一般为屏幕输出信息。表示,一般为屏幕输出信息。uu(3 3)标准错误处理文件:接受命令产生的任何错误信)标准错误处理文件:接受命令产生的任何错误信)标准错误处理文件:接受命令产生的任何错误信)标准错误处理文件:接受命令产生的任何错误信息。用文件描述字息。用文件描述字息。用文件描述字息。用文件描述字2 2表示,一般回显于屏幕输出信息。表示,一般回显于屏幕输出信息。表示,一般回显于屏幕输出信息。表示,一般回显于屏幕输出信息。输入、输出重定向uu1使用改向符进行标准输入重定向使用改向符进行标准输入重定向uu输入重定向输入重定向输
12、入重定向输入重定向 uu追加输入重定向追加输入重定向追加输入重定向追加输入重定向uu 2使用改向符进行标准输入重定向使用改向符进行标准输入重定向uu输出重定向输出重定向输出重定向输出重定向 uu追加重定向追加重定向追加重定向追加重定向uu 3.标准错误输出的改向(、)标准错误输出的改向(、)uu格式为:格式为:格式为:格式为:uucommand2command2filefile uucommand2command2filefileUNIXs Philosophy (Examples)uu重定向重定向用用用用“echo”echo”来创建一个文件来创建一个文件来创建一个文件来创建一个文件? ?uu
13、管道管道获取目录中文件的个数获取目录中文件的个数获取目录中文件的个数获取目录中文件的个数? ?显示子目录显示子目录显示子目录显示子目录? ?art/usr/lib/libc.a|grepprintf|pr-4-tart/usr/lib/libc.a|grepprintf|pr-4-t(?)(?)2. 创建和执行Shell程序uu编写脚本文件编写脚本文件uu执行脚本文件执行脚本文件uu运行环境运行环境编写脚本文件uu脚本文件注释注释退出码退出码(exit code)(exit code)ExampleExample#!/bin/bash# Here is commentsecho “are yo
14、u ok? yes or no”read answer if “$answer” = “yes” ; then echo “good guy!”else echo “come on dont be silly!” fiexit 0执行脚本文件uu方法方法方法方法1:1:$shscript_file$shscript_fileuu方法方法方法方法2:2: chmod+xscript_file(chown,chgrpoptionally)chmod+xscript_file(chown,chgrpoptionally) ./script_file./script_fileuu方法方法方法方法3:3
15、: sourcescript_filesourcescript_file用户环境uu.bash_profile,.bash_logout,.bashrcfiles.bash_profile,.bash_logout,.bashrcfiles .bash_profile:.bash_profile:用户登录时被读取,其中包含的命令被用户登录时被读取,其中包含的命令被用户登录时被读取,其中包含的命令被用户登录时被读取,其中包含的命令被 bashbash执行执行执行执行 .bashrc:.bashrc:启动一个新的启动一个新的启动一个新的启动一个新的shellshell时读取并执行时读取并执行时读取
16、并执行时读取并执行 .bash_logout:.bash_logout:登录退出时读取执行登录退出时读取执行登录退出时读取执行登录退出时读取执行uuAlias(Alias(设置别名设置别名设置别名设置别名) ) alias/unaliasalias/unalias commandcommanduu环境变量环境变量环境变量环境变量 exportcommandexportcommand(export(exportenv/setenv/setset)set) export,env&setcommandexport,env&setcommand(set(set显示所有的变量显示所有的变量显示所有的变量
17、显示所有的变量, ,局部和全局的局部和全局的局部和全局的局部和全局的envenv只显示全局的变量只显示全局的变量只显示全局的变量只显示全局的变量) )3. Shell程序设计的语法uu变量变量uu条件测试条件测试uu条件语句条件语句uu重复语句重复语句uu命令表和语句块命令表和语句块uu函数函数uu其它其它3.1 变量uu用户变量用户变量uu环境变量环境变量uu参数变量和内部变量参数变量和内部变量用户变量uu变量的赋值和使用变量的赋值和使用var=valuevar=valueecho$varecho$varuuread命令命令REPLYvariableREPLYvariableuu引号的用法引
18、号的用法双引号,单引号双引号,单引号双引号,单引号双引号,单引号转义符转义符转义符转义符“ “”echo uu使用格式使用格式使用格式使用格式: :echostringechostringuu说明说明说明说明:使用使用使用使用echoecho命令可以显示文本行或变量。命令可以显示文本行或变量。命令可以显示文本行或变量。命令可以显示文本行或变量。uu例例例例1 1:$echonaaaaaechonaaaaauu例例例例2 2:$echoe“007echoe“007你的主目录是:你的主目录是:你的主目录是:你的主目录是:$HOME$HOMEuu uu说明:说明:说明:说明:1 1、- -nn表示在
19、显示信息时不自动换行(默认会自表示在显示信息时不自动换行(默认会自表示在显示信息时不自动换行(默认会自表示在显示信息时不自动换行(默认会自动换行)动换行)动换行)动换行)uu2 2、- -ee表示使转义符生效表示使转义符生效表示使转义符生效表示使转义符生效uu3 3、007007或或或或 aa让终端铃响一声。让终端铃响一声。让终端铃响一声。让终端铃响一声。反引号 uu使用格式使用格式使用格式使用格式:commandcommanduu说明说明说明说明:反引号内的字符作为命令执行反引号内的字符作为命令执行反引号内的字符作为命令执行反引号内的字符作为命令执行。 uu例例例例1 1:$echoThec
20、urrenttimeisechoThecurrenttimeis datedateuuThecurrenttimeisMay1517:43:232007ThecurrenttimeisMay1517:43:232007uu例例例例2 2:$echoThecurrentpathisechoThecurrentpathis pwdpwduuThecurrentpathis/home/rootThecurrentpathis/home/root单引号 uu使用格式使用格式使用格式使用格式:commandcommanduu说明说明说明说明:禁止单引号内的任何语法分析禁止单引号内的任何语法分析禁止单引号
21、内的任何语法分析禁止单引号内的任何语法分析。 uu例:例:例:例:$echoThecurrenttimeisechoThecurrenttimeis datedateuuThecurrenttimeisMay1517:43:232007ThecurrenttimeisMay1517:43:232007uu例:例:例:例:$echoThecurrenttimeisechoThecurrenttimeis datedateuuThecurrenttimeisThecurrenttimeis datedateuu双引号双引号双引号双引号:引用除字符:引用除字符:引用除字符:引用除字符$($(美元符号
22、美元符号美元符号美元符号)()(反引号反引号反引号反引号)、(反斜线反斜线反斜线反斜线) )外外外外的任意字符或字符串。的任意字符或字符串。的任意字符或字符串。的任意字符或字符串。转义符 uu使用格式使用格式使用格式使用格式:charcharuu说明说明说明说明:禁止转义符后的单个字符进行语法分析禁止转义符后的单个字符进行语法分析禁止转义符后的单个字符进行语法分析禁止转义符后的单个字符进行语法分析。 uu例:例:例:例:$echoThecurrenttimeisechoThecurrenttimeis datedateuuThecurrenttimeisThecurrenttimeis dat
23、edateExample & experimentsuuExampleExample: :写一个写一个写一个写一个shellshell程序,接受用户输入的登陆用程序,接受用户输入的登陆用程序,接受用户输入的登陆用程序,接受用户输入的登陆用户名,打印登陆信息。户名,打印登陆信息。户名,打印登陆信息。户名,打印登陆信息。uuExperimentExperiment: : :写一个写一个写一个写一个shellshell程序,接受用户输入的程序,接受用户输入的程序,接受用户输入的程序,接受用户输入的登陆用户名,和登陆组名,打印当前日期和当前路径。登陆用户名,和登陆组名,打印当前日期和当前路径。登陆用户
24、名,和登陆组名,打印当前日期和当前路径。登陆用户名,和登陆组名,打印当前日期和当前路径。环境变量环境变量环境变量环境变量环境变量说明说明说明说明$HOME$HOME当前用户的登陆目录当前用户的登陆目录当前用户的登陆目录当前用户的登陆目录$PATH$PATH以冒号分隔的用来搜索命令的目录清单以冒号分隔的用来搜索命令的目录清单以冒号分隔的用来搜索命令的目录清单以冒号分隔的用来搜索命令的目录清单$PS1$PS1命令行提示符,通常是命令行提示符,通常是命令行提示符,通常是命令行提示符,通常是”$”$”字符字符字符字符$PS2$PS2辅助提示符,用来提示后续输入,通常是辅助提示符,用来提示后续输入,通常
25、是辅助提示符,用来提示后续输入,通常是辅助提示符,用来提示后续输入,通常是”字符字符字符字符$IFS$IFS输入区分隔符。当输入区分隔符。当输入区分隔符。当输入区分隔符。当shellshell读取输入数据时会把一组字读取输入数据时会把一组字读取输入数据时会把一组字读取输入数据时会把一组字符看成是单词之间的分隔符,通常是空格、制表符、符看成是单词之间的分隔符,通常是空格、制表符、符看成是单词之间的分隔符,通常是空格、制表符、符看成是单词之间的分隔符,通常是空格、制表符、换行符等。换行符等。换行符等。换行符等。参数变量和内部变量环境变量环境变量环境变量环境变量说明说明说明说明$ $传递到脚本程序的
26、参数个数传递到脚本程序的参数个数传递到脚本程序的参数个数传递到脚本程序的参数个数$0$0脚本程序的名字脚本程序的名字脚本程序的名字脚本程序的名字$1,$2,$1,$2,脚本程序的参数脚本程序的参数脚本程序的参数脚本程序的参数$*$*一个全体参数组成的清单,它是一个独立的变量,各一个全体参数组成的清单,它是一个独立的变量,各一个全体参数组成的清单,它是一个独立的变量,各一个全体参数组成的清单,它是一个独立的变量,各个参数之间用环境变量个参数之间用环境变量个参数之间用环境变量个参数之间用环境变量IFSIFS中的第一个字符分隔开中的第一个字符分隔开中的第一个字符分隔开中的第一个字符分隔开$“$*”“
27、$*”的一种变体,它不使用的一种变体,它不使用的一种变体,它不使用的一种变体,它不使用IFSIFS环境变量。环境变量。环境变量。环境变量。Example & experimentsuuExampleExample: :写一个写一个写一个写一个shellshell程序,接受用户参数,并打印程序,接受用户参数,并打印程序,接受用户参数,并打印程序,接受用户参数,并打印出来。出来。出来。出来。uuExperimentExperiment: : :写一个写一个写一个写一个shellshell程序,接受用户参数,程序,接受用户参数,程序,接受用户参数,程序,接受用户参数,并打印出来并打印出来并打印出来并
28、打印出来shellshell程序和用户参数。并显示当前用户的登程序和用户参数。并显示当前用户的登程序和用户参数。并显示当前用户的登程序和用户参数。并显示当前用户的登陆目录。陆目录。陆目录。陆目录。3.2 条件测试条件测试uu退出码退出码uutest命令命令testexpressiontestexpression或或或或 expressionexpressionuutest命令支持的条件测试命令支持的条件测试字符串比较字符串比较字符串比较字符串比较算术比较算术比较算术比较算术比较与文件有关的条件测试与文件有关的条件测试与文件有关的条件测试与文件有关的条件测试逻辑操作逻辑操作逻辑操作逻辑操作字符串
29、比较字符串比较字符串比较字符串比较字符串比较字符串比较结果结果结果结果str1=str2str1=str2两个字符串相同则结果为真两个字符串相同则结果为真两个字符串相同则结果为真两个字符串相同则结果为真str1!=str2str1!=str2两个字符串不相同则结果为真两个字符串不相同则结果为真两个字符串不相同则结果为真两个字符串不相同则结果为真-zstr-zstr字符串为空则结果为真字符串为空则结果为真字符串为空则结果为真字符串为空则结果为真-nstr-nstr字符串不为空则结果为真字符串不为空则结果为真字符串不为空则结果为真字符串不为空则结果为真算术比较算术比较算术比较算术比较算术比较算术比
30、较结果结果结果结果expr1eqexpr2expr1eqexpr2两个表达式相等则结果为真两个表达式相等则结果为真两个表达式相等则结果为真两个表达式相等则结果为真expr1neexpr2expr1neexpr2两个表达式不等则结果为真两个表达式不等则结果为真两个表达式不等则结果为真两个表达式不等则结果为真expr1gtexpr2expr1gtexpr2expr1expr1大于大于大于大于 expr2expr2则结果为真则结果为真则结果为真则结果为真expr1geexpr2expr1geexpr2expr1expr1大于或等于大于或等于大于或等于大于或等于 expr2expr2则结果为真则结果为
31、真则结果为真则结果为真expr1ltexpr2expr1ltexpr2expr1expr1小于小于小于小于 expr2expr2则结果为真则结果为真则结果为真则结果为真expr1leexpr2expr1leexpr2expr1expr1小于或等于小于或等于小于或等于小于或等于 expr2expr2则结果为真则结果为真则结果为真则结果为真与文件有关的条件测试与文件有关的条件测试文件条件测试文件条件测试文件条件测试文件条件测试结果结果结果结果-efile-efile文件存在则结果为真文件存在则结果为真文件存在则结果为真文件存在则结果为真-dfile-dfile文件是一个子目录则结果为真文件是一个子
32、目录则结果为真文件是一个子目录则结果为真文件是一个子目录则结果为真-ffile-ffile文件是一个普通文件则结果为真文件是一个普通文件则结果为真文件是一个普通文件则结果为真文件是一个普通文件则结果为真-sfile-sfile文件的长度不为零则结果为真文件的长度不为零则结果为真文件的长度不为零则结果为真文件的长度不为零则结果为真-rfile-rfile文件可读则结果为真文件可读则结果为真文件可读则结果为真文件可读则结果为真-wfile-wfile文件可写则结果为真文件可写则结果为真文件可写则结果为真文件可写则结果为真-xfile-xfile文件可执行则结果为真文件可执行则结果为真文件可执行则结
33、果为真文件可执行则结果为真逻辑操作逻辑操作逻辑操作逻辑操作逻辑操作逻辑操作结果结果结果结果!expr!expr逻辑表达式求反逻辑表达式求反逻辑表达式求反逻辑表达式求反expr1aexpr2expr1aexpr2两个逻辑表达式两个逻辑表达式两个逻辑表达式两个逻辑表达式“ “And”And”(“ “与与与与” ”)expr1oexpr2expr1oexpr2两个逻辑表达式两个逻辑表达式两个逻辑表达式两个逻辑表达式“ “Or”Or”(“ “或或或或” ”)3.3 条件语句uuif语句语句uucase语句语句if语句语句(1)uu形式形式形式形式ifexpressionifexpressionthen
34、thenstatementsstatementselifexpressionelifexpressionthenthenstatementsstatementselifelifelseelsestatementsstatementsfifiuu紧凑形式紧凑形式紧凑形式紧凑形式 ;(;(同一行上多个命令的分隔符同一行上多个命令的分隔符同一行上多个命令的分隔符同一行上多个命令的分隔符) )if语句语句(2)uu例例例例1(.bash_profile1(.bash_profile文件中文件中文件中文件中) )if-f/.bashrc;thenif-f/.bashrc;then./.bashrc./.
35、bashrcfifiuu例例例例2 2#!/bin/sh#!/bin/shecho“Isthismorning?Pleaseansweryesorno.”echo“Isthismorning?Pleaseansweryesorno.”readanswerreadanswerif“$answer”=“yes”;thenif“$answer”=“yes”;thenecho“Goodmorning”echo“Goodmorning”elif“$answer”=“no”;thenelif“$answer”=“no”;thenecho“Goodafternoon”echo“Goodafternoon”e
36、lseelseecho“Sorry,$answernotrecognized.Enteryesorno”echo“Sorry,$answernotrecognized.Enteryesorno”exit1exit1fifiexit0exit0Example & experimentsuuExampleExample: :写一个写一个写一个写一个shellshell程序,测试目录程序,测试目录程序,测试目录程序,测试目录/home/shell/home/shell是否存在,如果存在则在该目录下是否存在,如果存在则在该目录下是否存在,如果存在则在该目录下是否存在,如果存在则在该目录下创建创建创建创
37、建hello.chello.c文件,否则创建该文件夹再创建文件,否则创建该文件夹再创建文件,否则创建该文件夹再创建文件,否则创建该文件夹再创建hello.chello.c文件。文件。文件。文件。uuExperimentExperiment: : :写一个写一个写一个写一个shellshell程序,测试文件程序,测试文件程序,测试文件程序,测试文件/home/shell/hello.c/home/shell/hello.c是否存在,如果存在则将是否存在,如果存在则将是否存在,如果存在则将是否存在,如果存在则将其拷贝到其拷贝到其拷贝到其拷贝到/home/backup/home/backup目录下,
38、再在目录下,再在目录下,再在目录下,再在/home/shell/home/shell目录下重新创建一个。目录下重新创建一个。目录下重新创建一个。目录下重新创建一个。uuExperimentExperiment: : :写一个写一个写一个写一个shellshell程序,让用户输程序,让用户输程序,让用户输程序,让用户输入用户名和密码,验证用户名和密码是否分别为入用户名和密码,验证用户名和密码是否分别为入用户名和密码,验证用户名和密码是否分别为入用户名和密码,验证用户名和密码是否分别为“ “admin”admin”,“ “” ”,如果不是则报错,如果不是则报错,如果不是则报错,如果不是则报错,如果
39、是则显示正确。如果是则显示正确。如果是则显示正确。如果是则显示正确。case语句语句(1)uu形式形式casestrincasestrinstr1|str2)statements;str1|str2)statements;str3|str4)statements;str3|str4)statements;*)statements;*)statements;esacesaccase语句语句(2)uuExampleExample#!/bin/sh#!/bin/shecho“Isthismorning?Pleaseansweryesorecho“Isthismorning?Pleaseanswery
40、esorno.”no.”readanswerreadanswercase“$answer”incase“$answer”inyes|y|Yes|YES)echo“Goodmorning!”;yes|y|Yes|YES)echo“Goodmorning!”;no|n|No|NO)echo“Goodafternoon!”;no|n|No|NO)echo“Goodafternoon!”;*)echo“Sorry,answernotrecognized.”;*)echo“Sorry,answernotrecognized.”;esacesacexit0exit0Example & experiment
41、suuExampleExample44: :写一个写一个写一个写一个shellshell程序,测试当前时间,程序,测试当前时间,程序,测试当前时间,程序,测试当前时间,打印出相应的问候,如上午则打印打印出相应的问候,如上午则打印打印出相应的问候,如上午则打印打印出相应的问候,如上午则打印“ “goodgoodmorning!”morning!”等。等。等。等。uuExperimentExperiment55: : :写一个写一个写一个写一个shellshell程序,测试当程序,测试当程序,测试当程序,测试当前月份,如果是寒假前月份,如果是寒假前月份,如果是寒假前月份,如果是寒假2 2月,暑假月
42、,暑假月,暑假月,暑假7,87,8月则分别打印月则分别打印月则分别打印月则分别打印“ “WinterHoliday”WinterHoliday”和和和和“ “SummerHoliday”SummerHoliday”,否否否否则打印则打印则打印则打印“ “GotoschoolGotoschool”。3.4 重复语句uufor语句语句uuwhile语句语句uuuntil语句语句uuselect语句语句for语句(1)uu形式形式forvarinlistforvarinlistdodostatementsstatementsdonedoneuu适用于对一系列字符串循环处理适用于对一系列字符串循环处理
43、for语句(2)uuExample#!/bin/sh#!/bin/shforfilein$(lsf*.sh);doforfilein$(lsf*.sh);dolpr$filelpr$filedonedoneexit0exit0Example & experimentsuuExampleExample55: :写一个写一个写一个写一个shellshell程序,将当年目录下的所有程序,将当年目录下的所有程序,将当年目录下的所有程序,将当年目录下的所有C C文件改名,在后面加上文件改名,在后面加上文件改名,在后面加上文件改名,在后面加上_ _test,test,如如如如1.1.c c改为改为改为改为
44、1 1.c.c_ _testtest。uuExperiment6Experiment6 : : :写一个写一个写一个写一个shellshell程序,打印九九乘法程序,打印九九乘法程序,打印九九乘法程序,打印九九乘法表表表表 。提示提示提示提示: :uuforainseq19forainseq19uuecho-n$a*$b=expr$a*$becho-n$a*$b=expr$a*$bwhile语句(1)uu形式形式whileconditionwhileconditiondodostatementsstatementsdonedonewhile语句(2)uuExampleExamplequit=n
45、quit=nwhile“$quit”!=“y”;dowhile“$quit”!=“y”;doreadmenu_choicereadmenu_choicecase“$menu_choice”incase“$menu_choice”ina)do_something;a)do_something;b)do_anotherthing;b)do_anotherthing;q|Q)quit=y;q|Q)quit=y;*)echo“Sorry,choicenotrecognized.”;*)echo“Sorry,choicenotrecognized.”;esacesacdonedoneExample &
46、experimentsuuExampleExample66: :写一个写一个写一个写一个shellshell程序,实现一个数的累程序,实现一个数的累程序,实现一个数的累程序,实现一个数的累加。加。加。加。uuExperiment7Experiment7 :写一个:写一个:写一个:写一个shellshell程序,实现一个数程序,实现一个数程序,实现一个数程序,实现一个数的阶乘。的阶乘。的阶乘。的阶乘。until语句uu形式形式untilconditionuntilconditiondodostatementsstatementsdonedoneuuNotrecommended(whilestat
47、ementispreferred)select语句(1)uu形式形式selectiteminitemlistselectiteminitemlistdodostatementsstatementsdonedoneuu作用作用生成菜单列表生成菜单列表生成菜单列表生成菜单列表uuselect表达式是一种表达式是一种bash的扩展应用,的扩展应用,动作包括:动作包括:uu自动用自动用1,2,3,4列出菜单列出菜单(没有(没有echo指指令,自动显示菜单)令,自动显示菜单)uu自动自动read输入选择输入选择(没有(没有read指令,指令,自动输入)自动输入)uu赋值给变量赋值给变量(没有赋值指令,自
48、动输入(没有赋值指令,自动输入数字后,赋值字符串给变量)数字后,赋值字符串给变量)select语句(2)uu例例例例( (一个简单的菜单选择程序一个简单的菜单选择程序一个简单的菜单选择程序一个简单的菜单选择程序) )#!/bin/sh#!/bin/shclearclearselectiteminContinueFinishselectiteminContinueFinishdodocase“$item”incase“$item”inContinue);Continue);Finish)break;Finish)break;*)echo“Wrongchoice!Pleaseselectagain
49、!”*)echo“Wrongchoice!Pleaseselectagain!”;esacesacdonedoneuuQuestion:Question:用用用用whilewhile语句模拟语句模拟语句模拟语句模拟? ?Shift命令uu如如如如果果果果要要要要向向向向一一一一个个个个shellshellshellshell脚脚脚脚本本本本传传传传递递递递信信信信息息息息,可可可可以以以以使使使使用用用用位位位位置置置置参参参参数数数数完完完完成成成成此此此此功功功功能能能能。参参参参数数数数相相相相关关关关数数数数目目目目传传传传入入入入脚脚脚脚本本本本,此此此此数数数数目目目目可可可可以以
50、以以任任任任意意意意多多多多,但但但但只只只只有有有有前前前前9 9 9 9个个个个可可可可以以以以被被被被访访访访问问问问,使使使使用用用用shiftshiftshiftshift命命命命令令令令可可可可以以以以改改改改变变变变这这这这个个个个限限限限制制制制。参参参参数数数数从从从从第第第第一一一一个个个个开开开开始始始始,在在在在第第第第9 9 9 9个个个个结结结结束束束束;每个访问参数前要加每个访问参数前要加每个访问参数前要加每个访问参数前要加$ $ $ $符号。符号。符号。符号。uu如如如如果果果果向向向向脚脚脚脚本本本本传传传传送送送送Did Did Did Did You Yo
51、u You You See See See See The The The The Full Full Full Full MoonMoonMoonMoon信信信信息息息息,下下下下面面面面讲讲讲讲解解解解如如如如何何何何访访访访问每一个参数。问每一个参数。问每一个参数。问每一个参数。uu$0$0$0$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $1 $2 $3 $4 $5 $6 $7 $8 $9 $1 $2 $3 $4 $5 $6 $7 $8 $9 $1 $2 $3 $4 $5 $6 $7 $8 $9uu脚本名字脚本名字脚本名字脚本名字 Did You See The Full
52、 MoonDid You See The Full MoonDid You See The Full MoonDid You See The Full Moonuu这里只传递这里只传递这里只传递这里只传递6 6 6 6个参数,个参数,个参数,个参数,7 7 7 7、8 8 8 8、9 9 9 9参数为空。参数为空。参数为空。参数为空。uushiftshiftshiftshift命令用来将命令行参数左移。也可指定左移的位数:命令用来将命令行参数左移。也可指定左移的位数:命令用来将命令行参数左移。也可指定左移的位数:命令用来将命令行参数左移。也可指定左移的位数:shift 2shift 2shif
53、t 2shift 2uu$0$0$0$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $1 $2 $3 $4 $5 $6 $7 $8 $9 $1 $2 $3 $4 $5 $6 $7 $8 $9 $1 $2 $3 $4 $5 $6 $7 $8 $9uu脚本名字脚本名字脚本名字脚本名字 Did You See The Full MoonDid You See The Full MoonDid You See The Full MoonDid You See The Full Moonuu See The Full Moon (shift 2) See The Full Moon (shi
54、ft 2) See The Full Moon (shift 2) See The Full Moon (shift 2) uu$# $# $# $# 减一减一减一减一 $* $* $* $* 减少减少减少减少uu例子:shift.shcomprehensive exercisesuucexe1:创建一个程序名为创建一个程序名为创建一个程序名为创建一个程序名为optionsoptions的的的的shellshell程序,程序,程序,程序,对命令行参数的处理如下:对命令行参数的处理如下:对命令行参数的处理如下:对命令行参数的处理如下:uu命令行的第一个参数是命令行的第一个参数是命令行的第一个参数
55、是命令行的第一个参数是-d-d,程序会运行,程序会运行,程序会运行,程序会运行 datedate命令。命令。命令。命令。uu命令行的第一个参数是命令行的第一个参数是命令行的第一个参数是命令行的第一个参数是-w-w,程序会显示目前已经,程序会显示目前已经,程序会显示目前已经,程序会显示目前已经登录系统的所有用户。登录系统的所有用户。登录系统的所有用户。登录系统的所有用户。uu命令行的第一个参数是命令行的第一个参数是命令行的第一个参数是命令行的第一个参数是-l-l,程序会显示以命令行第,程序会显示以命令行第,程序会显示以命令行第,程序会显示以命令行第二个参数为名字的目录的内容。二个参数为名字的目录
56、的内容。二个参数为名字的目录的内容。二个参数为名字的目录的内容。uu如果没有参数或者超过两个参数,发一个用法信息,如果没有参数或者超过两个参数,发一个用法信息,如果没有参数或者超过两个参数,发一个用法信息,如果没有参数或者超过两个参数,发一个用法信息,将返回码设为将返回码设为将返回码设为将返回码设为1010。uu如果提供的参数不在上述范围,发一个用法信息,如果提供的参数不在上述范围,发一个用法信息,如果提供的参数不在上述范围,发一个用法信息,如果提供的参数不在上述范围,发一个用法信息,将返回码设为将返回码设为将返回码设为将返回码设为2020。 comprehensive exercisesuu
57、cexe2:cexe2:在主目录下创建一个名为在主目录下创建一个名为在主目录下创建一个名为在主目录下创建一个名为.waste.waste的目录。编写的目录。编写的目录。编写的目录。编写一个名为一个名为一个名为一个名为myrmmyrm的的的的shellshell程序,这个程序可以将要删除的程序,这个程序可以将要删除的程序,这个程序可以将要删除的程序,这个程序可以将要删除的文件移到文件移到文件移到文件移到.waste.waste目录下,这个目录是你的回收站。这是目录下,这个目录是你的回收站。这是目录下,这个目录是你的回收站。这是目录下,这个目录是你的回收站。这是一个非常有用的工具,可以用来恢复已经
58、删除的文件。记一个非常有用的工具,可以用来恢复已经删除的文件。记一个非常有用的工具,可以用来恢复已经删除的文件。记一个非常有用的工具,可以用来恢复已经删除的文件。记住:住:住:住:UNIXUNIX系统没有取消删除系统没有取消删除系统没有取消删除系统没有取消删除(undelete)(undelete)的功能。的功能。的功能。的功能。myrmmyrm包括以下选项,包括以下选项,包括以下选项,包括以下选项,ll列举回收站的内容,列举回收站的内容,列举回收站的内容,列举回收站的内容,-d-d删除回删除回删除回删除回收站的内容。收站的内容。收站的内容。收站的内容。3.5 命令表和语句块uu命令表命令表命
59、令组合命令组合命令组合命令组合uu语句块语句块命令表uu命令组合命令组合分号串联分号串联分号串联分号串联uucommand1;command2;command1;command2;条件组合条件组合条件组合条件组合uuANDAND命令表命令表命令表命令表格式:格式:格式:格式:statement1&statement2&statement3statement1&statement2&statement3&uuOROR命令表命令表命令表命令表格式:格式:格式:格式:statement1|statement2|statement3|statement1|statement2|statement3|语
60、句块uu形式形式statement1statement1statement2statement2 或或或或 statement1;statement2;statement1;statement2;3.6 函数uu形式形式形式形式func()func() statementsstatements uu局部变量局部变量局部变量局部变量 locallocal关键字关键字关键字关键字uu函数的调用函数的调用函数的调用函数的调用funcpara1para2funcpara1para2uu返回值返回值返回值返回值 returnreturn函数的例子uu例:例:例:例:uu#!/bin/bash#!/bin
61、/bash#!/bin/bash#!/bin/bashuuhello()hello()hello()hello()uu uuecho hello there todays dateecho hello there todays dateecho hello there todays dateecho hello there todays date is:dateis:dateis:dateis:dateuu uuecho now going to the function helloecho now going to the function helloecho now going to th
62、e function helloecho now going to the function hellouuhellohellohellohellouuecho back from the functionecho back from the functionecho back from the functionecho back from the functionuu#end#end#end#endExample & experimentsuuExampleExample77: :写一个写一个写一个写一个shellshell程序,实现一个带程序,实现一个带程序,实现一个带程序,实现一个带有一
63、个参数的函数,如果参数是有一个参数的函数,如果参数是有一个参数的函数,如果参数是有一个参数的函数,如果参数是- -ww则执行命则执行命则执行命则执行命令令令令who,who,如果参数是如果参数是如果参数是如果参数是- -dd则执行命令则执行命令则执行命令则执行命令datedate。uuExample8Example8 :写一个:写一个:写一个:写一个shellshell程序,实现一个程序,实现一个程序,实现一个程序,实现一个带有两个参数的函数,参数是两个整数,函数带有两个参数的函数,参数是两个整数,函数带有两个参数的函数,参数是两个整数,函数带有两个参数的函数,参数是两个整数,函数返回两个数中
64、较大的一个。返回两个数中较大的一个。返回两个数中较大的一个。返回两个数中较大的一个。uuExperiment8Experiment8:写一个:写一个:写一个:写一个shellshell程序,实现一程序,实现一程序,实现一程序,实现一带有三个参数的函数,参数是三个整数,函数带有三个参数的函数,参数是三个整数,函数带有三个参数的函数,参数是三个整数,函数带有三个参数的函数,参数是三个整数,函数返回三个数中较大的一个。返回三个数中较大的一个。返回三个数中较大的一个。返回三个数中较大的一个。3.7 其它uu杂项命令杂项命令break,continue,exit,return,break,continu
65、e,exit,return,export,set,unset,trap,“:”,“.”,export,set,unset,trap,“:”,“.”,uu捕获命令输出捕获命令输出uu算术扩展算术扩展uu参数扩展参数扩展uu即时文档即时文档杂项命令uubreak:break:从从从从for/while/untilfor/while/until循环退出循环退出循环退出循环退出uucontinue:continue:跳到下一个循环继续执行跳到下一个循环继续执行跳到下一个循环继续执行跳到下一个循环继续执行uuexitn:exitn:以退出码以退出码以退出码以退出码”n”n”退出脚本运行退出脚本运行退出脚
66、本运行退出脚本运行uureturn:return:函数返回函数返回函数返回函数返回uuexport:export:将变量导出到将变量导出到将变量导出到将变量导出到shellshell,使之成为,使之成为,使之成为,使之成为shellshell的环境变的环境变的环境变的环境变量量量量uuset:set:为为为为shellshell设置参数变量设置参数变量设置参数变量设置参数变量uuunset:unset:从环境中删除变量或函数从环境中删除变量或函数从环境中删除变量或函数从环境中删除变量或函数uutrap:trap:指定在收到操作系统信号后执行的动作指定在收到操作系统信号后执行的动作指定在收到操作
67、系统信号后执行的动作指定在收到操作系统信号后执行的动作uu“ “:”(:”(冒号命令冒号命令冒号命令冒号命令):):空命令空命令空命令空命令uu“.”(“.”(句点命令句点命令句点命令句点命令) )或或或或source:source:在当前在当前在当前在当前shellshell中执行命令中执行命令中执行命令中执行命令uutrapechoTerminated-pleaselogintrapechoTerminated-pleaseloginagain!;exit0SIGINTSIGKILLagain!;exit0SIGINTSIGKILLuutrapechoTerminated-pleaselo
68、gintrapechoTerminated-pleaseloginagain!SIGINTSIGKILLagain!SIGINTSIGKILLuu输入输入输入输入ctrl+cctrl+c强制退出强制退出强制退出强制退出, ,之前将打印输出之前将打印输出之前将打印输出之前将打印输出Terminated-pleaseloginagain!Terminated-pleaseloginagain!文字文字文字文字捕获命令输出uu语法语法$(command)$(command)commandcommanduu举例举例#!/bin/sh#!/bin/shecho“Thecurrentdirectoryis
69、$PWD”echo“Thecurrentdirectoryis$PWD”echo“Thecurrentdirectoryis$(pwd)”echo“Thecurrentdirectoryis$(pwd)”exit0exit0算术扩展uuexprexpr命令命令命令命令uu$()$()扩展扩展扩展扩展#!/bin/sh#!/bin/shx=0x=0while“$x”ne10;dowhile“$x”ne10;doecho$xecho$xx=$($x+1)x=$($x+1)donedoneexit0exit0参数扩展uu问题问题问题问题: : 批处理批处理批处理批处理 1_tmp,2_tmp,1_t
70、mp,2_tmp,uu方法方法方法方法#!/bin/sh#!/bin/shi=0i=0while“$i”ne10;dowhile“$i”ne10;dotouch“$i_tmp”touch“$i_tmp”i=$($i+1)i=$($i+1)donedoneexit0exit04. 综合练习uuInstall脚本脚本uuCD唱盘管理程序唱盘管理程序4. 综合练习uuInstall脚本uuCD唱盘管理程序uu要求:在一个文件夹下,有五个文件,要求:在一个文件夹下,有五个文件,分别是分别是abc.pldef.plabc.confdef.confsample.movuu1.将将.pl文件拷贝到文件拷贝到
71、/usr/local/testpro下,如果没有该下,如果没有该文件夹则先创建该文件夹再拷贝;如果文件夹则先创建该文件夹再拷贝;如果已经存在相应的文件则先将旧文件移动已经存在相应的文件则先将旧文件移动到到/usr/local/testproback目录下。目录下。uu2.将将.conf文件拷贝到文件拷贝到/usr/local/etc下,如果没有该文件下,如果没有该文件夹则先创建该文件夹再拷贝;如果已经夹则先创建该文件夹再拷贝;如果已经存在相应的文件则先将旧文件移动到存在相应的文件则先将旧文件移动到/usr/local/etcback目录下。目录下。uu3.将将.mov文件拷贝到文件拷贝到/us
72、r/local/movies下,如果没有该下,如果没有该文件夹则先创建该文件夹再拷贝;如果文件夹则先创建该文件夹再拷贝;如果已经存在相应的文件则先将旧文件移动已经存在相应的文件则先将旧文件移动到到/usr/local/moviesback目录下。目录下。uu4.最后要求用户输入一个用户名和密码,最后要求用户输入一个用户名和密码,以明文的形式存储到一个文件以明文的形式存储到一个文件/usr/local/usepass.txt中中uu最后打印出安装成功信息,结束程序最后打印出安装成功信息,结束程序4. 综合练习uuInstall脚本uuCD唱盘管理程序设计uu用文件进行数据存取用文件进行数据存取T
73、extprocessing:grepcommand/sedTextprocessing:grepcommand/sedcommandcommandComparedwithdatabase-useasimpleComparedwithdatabase-useasimplefilefileTips:(1)uu主程序主程序主程序主程序quit=nquit=nwhile“$quit”!=“y”;dowhile“$quit”!=“y”;doset_menu_choiceset_menu_choicecase“$menu_choice”incase“$menu_choice”ina)add_records
74、;a)add_records;r)remove_records;r)remove_records;f)find_recordsy;f)find_recordsy;u)update_records;u)update_records;q|Q)quit=y;q|Q)quit=y;*)echo“Sorry,choicenotrecognized.”;*)echo“Sorry,choicenotrecognized.”;esacesacdonedoneTips:(2)uu全局变量全局变量menu_choicemenu_choiceuu功能模块功能模块add_records:add_records:输入歌
75、曲名称与对应的专辑输入歌曲名称与对应的专辑输入歌曲名称与对应的专辑输入歌曲名称与对应的专辑(CDCD唱盘)标题信息唱盘)标题信息唱盘)标题信息唱盘)标题信息find_records:find_records:歌曲位于哪个专辑中歌曲位于哪个专辑中歌曲位于哪个专辑中歌曲位于哪个专辑中Tips:(3:1)uuDatabase:用一个普通文件充当,每一行是用一个普通文件充当,每一行是一首歌曲信息,歌名与专辑名用一首歌曲信息,歌名与专辑名用“”隔开。隔开。uu查找查找/模式匹配模式匹配uu1.res=echo$records|grep“#”uu变量变量records中是否包含中是否包含“”,将包含,将包
76、含“”的内容赋给变量的内容赋给变量resTips:(3:2)2.songname=echo$records|grep-o.*#将变量将变量records中中“#”前面的内容取出,赋前面的内容取出,赋给变量给变量songname(注意选项注意选项-o)3.sed-i/$patstr/dcdmanager.db将文件将文件cdmanager.db中包含中包含“$patstr”内内容的行删除容的行删除Tips(3:3)4.patstr=catcdmanager.db|grep$records查找在文件中是否存在查找在文件中是否存在$records记录记录ReviewuuShell概述:是什么,角色,
77、地位概述:是什么,角色,地位uuShell脚本的创建和执行脚本的创建和执行uuShell脚本的语法:变量、控制结构、函数、脚本的语法:变量、控制结构、函数、特殊命令特殊命令进入夏天,少不了一个热字当头,电扇空调陆续登场,每逢此时,总会想起进入夏天,少不了一个热字当头,电扇空调陆续登场,每逢此时,总会想起那一把蒲扇。蒲扇,是记忆中的农村,夏季经常用的一件物品。记忆中的故那一把蒲扇。蒲扇,是记忆中的农村,夏季经常用的一件物品。记忆中的故乡,每逢进入夏天,集市上最常见的便是蒲扇、凉席,不论男女老少,个个手持乡,每逢进入夏天,集市上最常见的便是蒲扇、凉席,不论男女老少,个个手持一把,忽闪忽闪个不停,嘴
78、里叨叨着一把,忽闪忽闪个不停,嘴里叨叨着“怎么这么热怎么这么热”,于是三五成群,聚在大树,于是三五成群,聚在大树下,或站着,或随即坐在石头上,手持那把扇子,边唠嗑边乘凉。孩子们却在周下,或站着,或随即坐在石头上,手持那把扇子,边唠嗑边乘凉。孩子们却在周围跑跑跳跳,热得满头大汗,不时听到围跑跑跳跳,热得满头大汗,不时听到“强子,别跑了,快来我给你扇扇强子,别跑了,快来我给你扇扇”。孩。孩子们才不听这一套,跑个没完,直到累气喘吁吁,这才一跑一踮地围过了,这时子们才不听这一套,跑个没完,直到累气喘吁吁,这才一跑一踮地围过了,这时母亲总是,好似生气的样子,边扇边训,母亲总是,好似生气的样子,边扇边训,
79、“你看热的,跑什么?你看热的,跑什么?”此时这把蒲扇,此时这把蒲扇,是那么凉快,那么的温馨幸福,有母亲的味道!蒲扇是中国传统工艺品,在是那么凉快,那么的温馨幸福,有母亲的味道!蒲扇是中国传统工艺品,在我国已有三千年多年的历史。取材于棕榈树,制作简单,方便携带,且蒲扇的表我国已有三千年多年的历史。取材于棕榈树,制作简单,方便携带,且蒲扇的表面光滑,因而,古人常会在上面作画。古有棕扇、葵扇、蒲扇、蕉扇诸名,实即面光滑,因而,古人常会在上面作画。古有棕扇、葵扇、蒲扇、蕉扇诸名,实即今日的蒲扇,江浙称之为芭蕉扇。六七十年代,人们最常用的就是这种,似圆非今日的蒲扇,江浙称之为芭蕉扇。六七十年代,人们最常用的就是这种,似圆非圆,轻巧又便宜的蒲扇。蒲扇流传至今,我的记忆中,它跨越了半个世纪,圆,轻巧又便宜的蒲扇。蒲扇流传至今,我的记忆中,它跨越了半个世纪,也走过了我们的半个人生的轨迹,携带着特有的念想,一年年,一天天,流向长也走过了我们的半个人生的轨迹,携带着特有的念想,一年年,一天天,流向长长的时间隧道,袅长的时间隧道,袅结束