《第10章 Shell编程.ppt》由会员分享,可在线阅读,更多相关《第10章 Shell编程.ppt(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第10章章 Shell编程编程 Linux Shell作为作为Linux下一种强大的管下一种强大的管理工具,其本身也具备相当强的可编程性。理工具,其本身也具备相当强的可编程性。如此就能根据不同的情况,使计算机做出如此就能根据不同的情况,使计算机做出不同的响应,以实现智能化管理的目的。不同的响应,以实现智能化管理的目的。本章将对本章将对Shell下的编程方法进行全面介绍。下的编程方法进行全面介绍。10.1 Shell编程基础编程基础10.1.1 介绍介绍Shell脚本脚本 简单地说,简单地说,Shell脚本就是一个包含若脚本就是一个包含若干行干行Shell或者或者linux命令的文件。对于一次
2、命令的文件。对于一次编写,多次使用的大量命令,就可以使用编写,多次使用的大量命令,就可以使用文件单独保存下来,以便日后使用。文件单独保存下来,以便日后使用。通常通常Shell脚本以脚本以.sh为后缀。在编写为后缀。在编写Shell时,第一行一定要指明系统需要那种时,第一行一定要指明系统需要那种Shell解释用户的解释用户的shell程序,如程序,如#!bin/sh,#!bin/bash,#!/bin/csh,#!/bin/tcsh和和#!/bin/ksh等。等。10.1.2 输入输出重定向输入输出重定向 Linux使用标准输入使用标准输入stdin和标准输出和标准输出stdout,来表示每个命
3、令的输入和输出,来表示每个命令的输入和输出,还使用一个标准错误输出还使用一个标准错误输出stderr用于输出错用于输出错误信息。这三个标准输入输出系统默认与误信息。这三个标准输入输出系统默认与控制终端设备相联系在一起的。因此,在控制终端设备相联系在一起的。因此,在标准情况下,每个命令通常从它的控制终标准情况下,每个命令通常从它的控制终端中获取输入,将输出打印到控制终端的端中获取输入,将输出打印到控制终端的屏幕上。屏幕上。1输入重定向输入重定向 输入重定向使用小于号输入重定向使用小于号“”实现;另一种是实现;另一种是以附加的方式输出,使用两个大于号以附加的方式输出,使用两个大于号“”实现。实现。
4、10.1.3 管道管道 管道和输入输出重定向十分类似。管道管道和输入输出重定向十分类似。管道的作用是在一个命令的标准输出和另一个的作用是在一个命令的标准输出和另一个命令的标准输入之间建立一个通道。命令的标准输入之间建立一个通道。10.1.4 Shell里的特殊字符里的特殊字符 和其他编程语言一样,和其他编程语言一样,Shell里也有特里也有特殊字符。常见的有美元符号(殊字符。常见的有美元符号($)、反斜线)、反斜线()和引号。)和引号。1美元符号美元符号 美元符号美元符号“$”表示变量替换,即用其表示变量替换,即用其后指定的变量的值来代替变量。后指定的变量的值来代替变量。2双引号(双引号()由
5、双引号括起来的字符,除由双引号括起来的字符,除$、倒引号、倒引号()和反斜线(和反斜线()仍保留其特殊功能外,)仍保留其特殊功能外,其余字符均作为普通字符对待。其余字符均作为普通字符对待。3单引号(单引号()由单引号括起来的字符都作为普通字符由单引号括起来的字符都作为普通字符出现。出现。4倒引号(倒引号()由倒引号括起来的字符串被由倒引号括起来的字符串被Shell解释解释为命令行,在执行时,为命令行,在执行时,Shell会先执行该命会先执行该命令行,并以它的标准输出结果取代整个倒令行,并以它的标准输出结果取代整个倒引号部分。引号部分。10.1.5 Shell脚本的注释脚本的注释 Shell脚本
6、和其他编程语言一样,也拥脚本和其他编程语言一样,也拥有注释。注释方法为在注释行前加有注释。注释方法为在注释行前加#号。号。10.2 Shell变量变量 在在Shell中有中有3种变量:系统变量、环境种变量:系统变量、环境变量和用户变量。其中系统变量在对参数变量和用户变量。其中系统变量在对参数判断和命令返回值判断会使用,环境变量判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置,用户主要是在程序运行的时候需要设置,用户变量在编程过程中使用最多。变量在编程过程中使用最多。10.2.1 系统变量系统变量 Shell常用的系统变量并不多,但在做常用的系统变量并不多,但在做一些参数检测的
7、时候十分有效。表一些参数检测的时候十分有效。表10-1是是Shell常用的系统变量。常用的系统变量。变变 量量 名名含含 义义$#$#命令行参数的个数命令行参数的个数$n$n$1$1表示第一个参数,表示第一个参数,$2$2表示第二个参数,以此类推表示第二个参数,以此类推$0$0当前程序的名称当前程序的名称$?$?前一个命令或函数的返回码前一个命令或函数的返回码$*$*以以 参数参数1 1 参数参数2.2.形式保存所有参数形式保存所有参数$以以 参数参数1 1 参数参数2.2.形式保存所有参数形式保存所有参数$本程序的本程序的(进程进程IDID号号)PID)PID$!$!上一个命令的上一个命令的
8、PIDPID表表10-110-1常用的系统变量常用的系统变量10.2.2 环境变量环境变量 当当Shell程序启动时,都自动设置一组程序启动时,都自动设置一组变量,这组变量就是环境变量。变量,这组变量就是环境变量。10.2.3 用户变量用户变量 用户变量是最常用到的变量,使用也十用户变量是最常用到的变量,使用也十分简单。分简单。用户定义的变量名必须由字母数用户定义的变量名必须由字母数字及下划线组成,并且变量名的第一个字字及下划线组成,并且变量名的第一个字符不能为数字。符不能为数字。10.2.4 变量的赋值与使用变量的赋值与使用 Shell下的变量和下的变量和C语言中的变量不同,语言中的变量不同
9、,无须声明即可使用,赋值同时即声明了变无须声明即可使用,赋值同时即声明了变量。对于用户变量,用户可按如下方式赋量。对于用户变量,用户可按如下方式赋值。值。varible_name=value10.2.5 数字和数组的声明数字和数组的声明 默认的赋值是对字符串赋值默认的赋值是对字符串赋值。如果要对数字或数组进行声明,则要用如果要对数字或数组进行声明,则要用declare命令。命令。当然也可以把两个变量放入一行。当然也可以把两个变量放入一行。declare支持的声明类型如下。使用支持的声明类型如下。使用“-类型类型”开启,开启,“+类型类型”关闭。关闭。(1)i:定义整数:定义整数integer。
10、(2)a:定义数组:定义数组array。(3)f:定义函数:定义函数function。(4)r:定义为只读:定义为只读readonly。(5)x:定义为通过环境输出变量。:定义为通过环境输出变量。10.3 Shell运算符运算符 Shell也有自己的运算符,其运算符和也有自己的运算符,其运算符和C 语言基本类似。其运算符及结合方式见语言基本类似。其运算符及结合方式见表表10-3。优先级从上到下递减。优先级从上到下递减。运运 算算 符符解解 释释结结 合合 方方 式式()()括号(函数等),数组括号(函数等),数组由左向右由左向右!+-+-+-+-否定,按位否定,增量,减否定,按位否定,增量,减
11、量,正负号量,正负号由右向左由右向左*/%/%乘,除,取模乘,除,取模由左向右由左向右+-+-加,减加,减由左向右由左向右表表10-310-3运算符表运算符表运运 算算 符符解解 释释结结 合合 方方 式式左移,右移左移,右移由左向右由左向右 =小于,小于等于,大于等于,小于,小于等于,大于等于,大于大于由左向右由左向右=!=!=等于,不等于等于,不等于由左向右由左向右&按位与按位与由左向右由左向右 按位异或按位异或由左向右由左向右|按位或按位或由左向右由左向右&逻辑与逻辑与由左向右由左向右|逻辑或逻辑或由左向右由左向右?:?:条件条件由右向左由右向左=+=-=*=/=&=+=-=*=/=&=
12、|=|=各种赋值各种赋值由右向左由右向左,逗号(顺序)逗号(顺序)由左向右由左向右续表续表10.4 Shell的流程控制的流程控制10.4.1 分支结构分支结构test命令命令 如果要对程序流程进行分支处理,首先如果要对程序流程进行分支处理,首先需要对条件进行判断,这时就需要使用需要对条件进行判断,这时就需要使用test命令。命令。test命令被用来判断表达式并且产生命令被用来判断表达式并且产生返回值。返回值。test命令不会产生标准输出,因此必须命令不会产生标准输出,因此必须通过其返回值来判断通过其返回值来判断test的结果,如果表达的结果,如果表达式为真,返回值会为式为真,返回值会为0(T
13、RUE),如果表),如果表达式为假,返回值为达式为假,返回值为1(FALSE)。)。test命命令可对整数、字符串,以及文件进行判断,令可对整数、字符串,以及文件进行判断,其使用方法如下:其使用方法如下:test expression或者或者 expression 1整数整数 用于比较整数的关系运算符有:用于比较整数的关系运算符有:-lt(小于)、(小于)、-le(小于或者等于)、(小于或者等于)、-gt(大(大于)、于)、-ge(大于或者等于)、(大于或者等于)、-eq(等于)、(等于)、-ne(不等于)。(不等于)。2字符串字符串 用于字符串时,用于字符串时,test可用的关系运算符可用的
14、关系运算符有:有:=(等于)和(等于)和!=(不等于)。(不等于)。3文件文件 用于文件时,用于文件时,test可用的关系运算符如可用的关系运算符如下所示。下所示。(1)-f file:如果文件存在并且是一个普通:如果文件存在并且是一个普通文件(不是目录或者设备文件),会返回文件(不是目录或者设备文件),会返回真。真。(2)-s file:如果文件存在并且其字节数大:如果文件存在并且其字节数大于于0,会返回真。,会返回真。(3)-r file:如果文件存在并且是可读的时:如果文件存在并且是可读的时候为真。候为真。(4)-w file:如果文件存在并且是可写的:如果文件存在并且是可写的时候为真。
15、时候为真。(5)-x file:如果文件存在并且是可执行的:如果文件存在并且是可执行的时候为真。时候为真。(6)-d directory:目录存在并且是个目录:目录存在并且是个目录的时候为真。的时候为真。4其他参数其他参数 除了上面介绍的参数外,除了上面介绍的参数外,test命令的可命令的可用参数还有如下这些。用参数还有如下这些。(1)-a:逻辑与(:逻辑与(AND)。)。(2)-o:逻辑或(:逻辑或(OR)。)。(3)!:逻辑非(:逻辑非(NOT)。)。(4)():分组括号(:分组括号(GROUPING)。)。10.4.2 分支结构分支结构if语句语句 if语句是用来表示判断的最常用的一条语
16、句是用来表示判断的最常用的一条语句。其语法结构分为语句。其语法结构分为3种,如下所示。种,如下所示。1if结构结构 if结构的格式如下:结构的格式如下:if expressionthen EXPRESSIONSfi2if/else结构结构 if/else结构的格式如下所示:结构的格式如下所示:if expressionthen EXPRESSIONSelse EXPRESSIONSfi3if/elif/./else结构结构 if/elif/./else结构的格式如下所示:结构的格式如下所示:if expressionthen EXPRESSIONSelif then EXPRESSIONSel
17、if then EXPRESSIONS.else then EXPRESSIONSfi10.4.3 分支结构分支结构case语句语句 除了除了if语句外,语句外,case语句也是一个重要语句也是一个重要的分支语句。其含义和的分支语句。其含义和C语言中的语言中的switch语语句相似。句相似。case语句的格式如下所示:语句的格式如下所示:case word in condition1)EXPRESSIONS ;condition2)EXPRESSIONS ;.*)EXPRESSIONS ;esac10.4.4 循环结构循环结构for语句语句 for语句是常用的循环语句,其格式如语句是常用的循环
18、语句,其格式如下所示:下所示:for NAME in LIST;do EXPRESSIONS;done10.4.5 循环结构循环结构while语句和语句和until语句语句 除了除了for语句以外,还有两个语句可以语句以外,还有两个语句可以执行循环,即执行循环,即while语句和语句和until语句。语句。其语法格式如下所示:其语法格式如下所示:/while循环循环while CONTROL-COMMAND;do EXPRESSIONS;done/until循环循环until TEST-COMMAND;do EXPRESSIONS;done while循环和循环和until循环的区别在于,循环
19、的区别在于,while是当判断条件为真时才执行循环,而是当判断条件为真时才执行循环,而until循环在判断条件为假时才停止循环。循环在判断条件为假时才停止循环。10.4.6 break、continue和和exit语句语句 break语句的作用是在正常结束之前退语句的作用是在正常结束之前退出当前循环。例如下面求和的这个例子,出当前循环。例如下面求和的这个例子,while的循环条件永远为真,在循环体内部的循环条件永远为真,在循环体内部用了一个用了一个if语句跳出循环。语句跳出循环。continue语句的作用是不执行本次循语句的作用是不执行本次循环,直接跳到下一次循环。环,直接跳到下一次循环。ex
20、it语句用于中止脚本程序并返回值。语句用于中止脚本程序并返回值。10.5 Shell函数函数 Shell里也可以使用函数。里也可以使用函数。Shell函数的函数的名字必须是唯一的,且符合变量命名规则。名字必须是唯一的,且符合变量命名规则。所有用来组织函数的命令就像普通命令一所有用来组织函数的命令就像普通命令一样执行。当以一个简单的命令名来调用函样执行。当以一个简单的命令名来调用函数的时候,和该函数相关的命令就被执行。数的时候,和该函数相关的命令就被执行。10.5.1 声明声明Shell函数函数 函数在必须声明,然后才能在函数在必须声明,然后才能在Shell里里执行。自定义函数可以采用如下所示两
21、种执行。自定义函数可以采用如下所示两种方法声明。方法声明。/方法一方法一function FUNCTION_NAME EXPRESSIONS/方法二方法二FUNCTION_NAME()EXPRESSIONS10.5.2 调用调用Shell函数函数 Shell函数的调用也和函数的调用也和C语言中调用函语言中调用函数的方法有所区别。其参数是直接跟在函数的方法有所区别。其参数是直接跟在函数名后,而无须通过括号括起来,如下所数名后,而无须通过括号括起来,如下所示:示:FUNCTION_NAME PARAM1 PARAM2.10.5.3 递归调用递归调用 Shell也支持函数的递归调用。也支持函数的递归
22、调用。10.6 编写交互脚本编写交互脚本 前面介绍的都是非交互脚本,而实际上前面介绍的都是非交互脚本,而实际上Linux中有许多脚本,需要来自用户的输入,中有许多脚本,需要来自用户的输入,或者在运行的时候给用户输出信息。交互或者在运行的时候给用户输出信息。交互脚本的优势有如下这些。脚本的优势有如下这些。(1)可以建立更加灵活的脚本。)可以建立更加灵活的脚本。(2)用户可自定义脚本使得其在运行时产)用户可自定义脚本使得其在运行时产生不同的行为。生不同的行为。(3)脚本可以在运行过程中报告状态。)脚本可以在运行过程中报告状态。10.6.1 提示用户提示用户 提示用户最常用的命令是提示用户最常用的命
23、令是echo,其基,其基本用法前面已经使用过很多次了。这里仅本用法前面已经使用过很多次了。这里仅列出其常用的一些选项。列出其常用的一些选项。(1)-e:解释反斜杠转义字符。:解释反斜杠转义字符。(2)-n:禁止换行。:禁止换行。echo中常用的转义字符序列见表中常用的转义字符序列见表10-4。序序 列列含含 义义aa响铃响铃bb退格退格cc强制换行强制换行ee退出退出ff清除屏幕清除屏幕Form feed.Form feed.nn换行换行rr回车回车tt水平制表符水平制表符vv垂直制表符垂直制表符反斜杠反斜杠ONNNONNN值为八进制值值为八进制值NNNNNN(0 0到到3 3个八进制数字)的
24、个八进制数字)的8 8比特字符比特字符NNNNNN值为八进制值值为八进制值NNNNNN(1 1到到3 3个八进制数字)的个八进制数字)的8 8比特字符比特字符 xHHxHH值为十六进制值(值为十六进制值(1 1或者或者2 2个十六进制数字)的个十六进制数字)的8 8比特字符比特字符表表10-410-4echoecho转义字符序列转义字符序列10.6.2 接受用户输入接受用户输入 接受用户输入的命令为接受用户输入的命令为read 命令。命令。read 命令的语法如下所示:命令的语法如下所示:read options NAME1 NAME2.NAMEN 其选项如表其选项如表10-5所示。所示。选选
25、 项项含含 义义-a ANAME-a ANAME将输入读入将输入读入ANAMEANAME的数组的数组 -d DELIM-d DELIM用于截断输入的字符,默认是换行符用于截断输入的字符,默认是换行符nn-n NCHARS-n NCHARS读入读入n n个字符个字符-p PROMPT-p PROMPT显示一个提示显示一个提示 -r-r取消转义,例如启用时取消转义,例如启用时nn将可能不会被解释为换行将可能不会被解释为换行符符-s-s安静模式,输入的字符将不会显示安静模式,输入的字符将不会显示-t TIMEOUT-t TIMEOUT超时,超过指定时间,超时,超过指定时间,readread自动停止自动停止表表10-510-5readread选项列表选项列表小小 结结 本章对本章对Linux Shell的脚本编程中一些的脚本编程中一些重要知识进行了介绍。其中包括重要知识进行了介绍。其中包括Shell的管的管道和输入输出重定向,道和输入输出重定向,Shell变量,以及变量,以及Shell程序的控制结构与交互等几个方面。程序的控制结构与交互等几个方面。当然,学些当然,学些Shell编程的主要目的还是为了编程的主要目的还是为了管理管理Linux,只有将,只有将Shell编程和编程和Linux系统系统管理结合起来,才能真正掌握管理结合起来,才能真正掌握Shell编程的编程的精髓。精髓。