




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
UbuntuLinux操作系统(第3版)(微课版)第8章Shell编程能力CAPACITY要求熟悉Shell编程的基本步骤,掌握脚本的执行和调试方法。了解Shell变量、表达式和运算符,学会使用它们编写程序。了解条件语句和循环语句,学会编写流程控制程序。掌握函数的定义和调用,学会使用函数对Shell程序进行模块划分。学会在Shell脚本中使用正则表达式与文本处理命令,实现自动化运维任务。Shell变量Shell编程基本步骤表达式与运算符流程控制语句函数Shell正则表达式与文本处理命令8.1Shell编程基本步骤编写Shell脚本脚本的编写Shell脚本本身就是一个文本文件,示例:
#!/bin/bash#显示”HelloWorld!”
echo"HelloWorld!"与其他脚本语言编程一样,Shell脚本编程无需编译器,也不需要集成开发环境,一般使用文本编辑器即可。多数Shell程序员首选的编辑器是Vi或Emacs,在桌面环境中可直接使用图形化编辑器gedit或kate。推荐初学者使用nano字符终端文本编辑器。8.1Shell编程基本步骤编写Shell脚本Shell脚本的基本构成#!/bin/bash#这是一个测试脚本echo-n"当前日期和时间:"dateecho-n"程序执行路径:"$PATHecho"当前登录用户名:`whoami`"echo-n"当前目录:"pwd#end8.1Shell编程基本步骤编写Shell脚本包含外部脚本包含外部脚本文件的用法如下:
.脚本文件名或
source脚本文件名两种方式的作用一样,为简单起见,一般使用点号,但要注意点号和脚本文件名之间一定要有一个空格。8.1Shell编程基本步骤执行Shell脚本执行Shell脚本使用指定的Shell解释器执行脚本使用指定的Shell解释器执行脚本,以脚本名作为参数。Shell解释器脚本文件[参数]示例cxz@linuxpc1:~$shhello.shHelloWorld!使用source命令执行脚本在当前Shell环境下读取并执行Shell脚本文件中的代码并依次执行。source脚本文件示例cxz@linuxpc1:~$.hello.shHelloWorld!将输入重定向到Shell脚本让Shell从指定文件中读入命令行,并进行相应处理
bash<脚本名示例cxz@linuxpc1:~$bash<hello.shHelloWorld!都不要求脚本文件具有执行权限8.1Shell编程基本步骤调试Shell脚本利用Shell解释器的选项实现调试。Shell解释器[选项]脚本文件示例cxz@linuxpc1:~$bash-vhello.sh#!/bin/bash#显示"HelloWorld!"echo"HelloWorld!"HelloWorld!cxz@linuxpc1:~$bash-xhello.sh+echo'HelloWorld!'HelloWorld!Shell变量Shell编程基本步骤表达式与运算符流程控制语句函数Shell正则表达式与文本处理命令8.2Shell变量变量类型用户自定义变量在编写Shell脚本时定义,可以在Shell程序内任意使用和修改。可以将它看作局部变量,仅在当前Shell实例中有效。环境变量作为系统环境的一部分,不必去定义它们,可以在Shell程序中使用它们,某些变量(如PATH)可以在Shell中加以修改。可以将它看作全局变量。内部变量此类变量在程序中用来做出判断。在Shell程序内,这类变量的值是不能修改的。8.2Shell变量变量赋值和访问变量定义变量无须事先声明,给变量赋值也就是定义一个变量的过程变量名=值变量名的命名应当遵循如下规则:
首个字符必须为字母(a-z,A-Z)中间不能有空格,可以使用下划线(_)不能使用标点符号不能使用Shell中的关键字8.2Shell变量变量赋值和访问变量访问如果要访问变量值,可以在变量名前面加一个美元符号“$”。通常使用函数echo来显示变量。变量名加花括号“{}”是可选的。只读变量使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。8.2Shell变量变量赋值和访问删除变量使用unset命令可以删除变量。添加环境变量使用export命令将变量添加到环境中,作为临时的环境变量(一种全局变量)。export变量名=变量值8.2Shell变量内部变量变量说明$0当前脚本的文件名$n传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第1个参数是$1,第2个参数是$2,以此类推$#传递给脚本或函数的参数个数$*传递给脚本或函数的所有参数$@传递给脚本或函数的所有参数。被双引号("")包含时,与$*稍有不同$?上个命令的退出状态,或函数的返回值$$当前Shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID8.2Shell变量位置参数编写一个带有若干参数的Shell脚本时,可用命令行或从其他Shell脚本调用位置参数。位置参数使用系统给出的专用名,存放在变量中的第1个参数名为1,可以用$1来访问;第2个参数名为2,可以利用$2来访问它,依此类推。当参数超过10个时,要用花括号将参数序号括起来,如${12}。$0是一个比较特殊的位置参数,用于表示脚本自己的文件名。$*和$@都表示传递给函数或脚本的所有参数。$#是指传递参数的个数。调用Shell程序可以省略位置居后的位置参数。在Shell程序中,可以利用set命令为位置参数赋值或重新赋值
set[参数列表]8.2Shell变量变量值输出echo命令Shell变量可以使用echo命令实现标准输出,在屏幕上打印出指定的字符串。echo可以用来实现更复杂的输出格式控制。输出内容使用双引号将阻止Shell对大多数特殊字符进行解释,但美元符号($)、反引号(`)和双引号(")仍然保持其特殊意义,如果要在双引号中的内容中显示这些符号,需要使用转义符。printf命令printf命令用于格式化输出。printf命令可以提供格式控制字符串,语法如下:
printf格式字符串[参数列表...]8.2Shell变量变量值读取使用read命令可以将变量的值作为字符串从键盘读入:
read变量在执行read命令时可以不指定变量参数,它会将接收到的数据放置在环境变量$REPLY中。read读入的变量可以有多个,第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给第一个变量。下面的脚本示例读取两个数,并显示出来。可以使用选项-n对输入的字符进行计数,当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。8.2Shell变量变量替换可以使用以下几种变量替换形式。${var}:替换为变量本来的值。${var:-word}:如果变量var为空或已被删除,则返回word,但不改变var的值。${var:=word}:如果变量var为空或已被删除,则返回word,并将var的值设置为word。${var:?message}:如果变量var为空或已被删除,则将消息message发送到标准错误输出,可以用来检测变量var是否可以被正常赋值。${var:+word}:如果变量var被定义,则返回word,但不改变var的值。8.2Shell变量数组bash支持一维数组(不支持多维数组。在Shell中用括号来表示数组,数组元素用空格符号分开数组名=(值1...值n)可以单独定义数组的各个元素。可以不使用连续的下标,而且下标的范围没有限制。读取数组元素值的语法格式为:
${数组名[下标]}采用以下用法获取数组元素的个数:
${#数组名[@]}以下方法用于取得数组单个元素的长度:
${#数组名[n]}Shell变量Shell编程基本步骤表达式与运算符流程控制语句函数Shell正则表达式与文本处理命令8.3表达式与运算符表达式算术表达式bash自身并不支持简单的数学运算,但可通过awk和expr等命令来实现数学运算。expr最为常用,使用它能够完成表达式的求值操作。
expr5+3
更为简单的方式是使用$[]表达式进行数学计算。
val=$[5+3]
操作数与运算符之间一定要有空格操作数与运算符之间不能有空格8.3表达式与运算符表达式逻辑表达式逻辑表达式主要用于条件判断,值为true(或0)表示结果为真;值为false(非零值)表示结果为假。通常使用test命令来判断表达式的真假。
test逻辑表达式Linux每个版本中都包含test命令,但该命令有一个更常用的别名,即左方括号“[”。
[逻辑表达式]当使用左方括号而非test时,其后必须始终跟着一个空格、要评估的逻辑表达式、一个空格和右方括号,右方括号表示所需评估表达式的结束。逻辑表达式两边的空格是必需的。8.3表达式与运算符算术运算符+:加法-:减法*:乘法/:除法%:取余=:赋值8.3表达式与运算符整数关系运算符运算符功能说明示例-eq检测两个数是否相等,相等则返回true[$a-eq$b]返回false-ne检测两个数是否不相等,不相等则返回true[$a-ne$b]返回true-gt检测运算符左边的数是否大于右边的,如果是,则返回true[$a–gt$b]返回false-lt检测运算符左边的数是否小于右边的,如果是,则返回true[$X-lt$Y]返回true-ge检测运算符左边的数是否大于或等于右边的,如果是,则返回true[$X-ge$Y]返回false-le检测运算符左边的数是否小于或等于右边的,如果是,则返回true[$X-le$Y]返回true8.3表达式与运算符字符串检测运算符运算符功能说明示例=检测两个字符串是否相等,相等则返回true[$a=$b]返回false!=检测两个字符串是否不相等,不相等则返回true[$a!=$b]返回true-z检测字符串长度是否为0,为0则返回true[-z$a]返回false-n检测字符串长度是否不为0,不为0则返回true[-n“$b”]返回true$检测字符串是否为空,不为空则返回true[$a]返回true8.3表达式与运算符文件测试运算符运算符功能说明-b检测文件是否为块设备文件,如果是,则返回true-c检测文件是否为字符设备文件,如果是,则返回true-d检测文件是否为目录文件,如果是,则返回true-f检测文件是否为普通文件(既不是目录文件,又不是设备文件),如果是,则返回true-g检测文件是否设置了SGID位,如果是,则返回true-k检测文件是否设置了Sticky位,如果是,则返回true-p检测文件是否为具名管道,如果是,则返回true-u检测文件是否设置了SUID位,如果是,则返回true-r检测文件是否可读,如果是,则返回true-w检测文件是否可写,如果是,则返回true-x检测文件是否可执行,如果是,则返回true-s检测文件是否为空(文件大小是否大于0),如果不为空,则返回true-e检测文件(包括目录)是否存在,如果是,则返回true8.3表达式与运算符布尔运算符运算符功能说明示例-a“与”运算。两个表达式都为true才返回true[$a-lt10-a$b-gt15]返回false-o“或”运算。有一个表达式为true就返回true[$a-lt10-o$b-gt15]返回true!“非”运算。表达式值为true则返回false,否则返回true[!$a-lt10]返回true8.3表达式与运算符三目运算符语法格式
<条件表达式>?<值1>:<值2>bash使用$(())实现三目运算。三目运算示例
cxz@linuxpc1:~$echo$((10>5?2:4))2Shell变量Shell编程基本步骤表达式与运算符流程控制语句函数Shell正则表达式与文本处理命令8.4流程控制语句多命令的组合执行使用逻辑与符号“&&”连接多条命令命令1&&命令2使用逻辑或符号“||”连接多条命令命令1||命令2联合使用符号“&&”和“||”命令1&&命令2||命令3命令1||命令2&&命令3使用括号()组合多条命令
8.4流程控制语句分支结构if语句if...else语句
if[条件表达式]then
语句序列
fiif...else...fi语句
if[条件表达式] then
语句序列1 else
语句序列2 fiif...elif...fi语句
if[条件表达式1] then
语句序列1 elif[条件表达式2] then
语句序列2 elif[条件表达式3] then
语句序列3 …… else
语句序列n fi8.4流程控制语句分支结构case语句case值in模式1) 语句序列1
;;模式1) 语句序列2
;;
……模式n)
语句序列n
;;*)
其他语句序列esac8.4流程控制语句循环结构循环语句while循环语句while测试条件do
语句序列doneuntil循环语句
until测试条件do
语句序列donefor循环语句
for变量[in列表]do
语句序列done其他循环语句break语句用来终止一个重复执行的循环break[n]continue语句跳过循环体中位于它后面的语句
continue[n]exit语句用来退出一个Shell程序并设置退出值
exit[n]Shell变量Shell编程基本步骤表达式与运算符流程控制语句函数Shell正则表达式与文本处理命令8.5函数函数的定义和调用函数定义Shell函数必须先定义后使用。
[function]函数名() {
命令序列
[return返回值]函数调用调用函数只需要给出函数名,不需要加括号,就像一般命令那样使用。函数名参数1参数2……参数n8.5函数函数的返回值使用全局变量先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数的返回值。使用变量要注意不要修改父脚本里不期望被修改的内容。在函数中使用标准输出将一个Shell函数作为一个子程序调用(命令替换),将返回值写到子程序的标准输出。在函数中使用return返回整数值$?是一个特殊的内部变量,可用于获取上一个命令执行后的返回结果,可以直接通过函数return语句来接收返回值。8.5函数函数参数在Shell中调用函数时可以向其传递参数。与脚本一样,在函数体内部也是通过$n的形式来获取参数的值。$1表示第一个参数。$2表示第二个参数。Shell变量Shell编程基本步骤表达式与运算符流程控制语句函数Shell正则表达式与文本处理命令8.6Shell正则表达式与文本处理命令为什么要用正则表达式正则表达式功能检查一个字符串是否符合指定的规则。将字符串中符合规则的内容提取出来。Linux系统运维工作中使用正则表达式处理文本内容配置文件程序源代码命令输出日志文件8.6Shell正则表达式与文本处理命令Shell正则表达式正则表达式的构成一个正则表达式是由一系列字符组成的字符串,由普通字符和元字符组成。普通字符只表示它们的字面涵义。元字符是正则表达式中具有特殊意义的字符,其作用是使正则表达式具有处理能力。正则表达式的类型基本正则表达式(BasicRegularExpression,BRE)扩展正则表达式(ExtendedRegularExpression,ERE)Perl正则表达式(PerlRegularExpression,PRE)8.6Shell正则表达式与文本处理命令使用grep命令查找文本内容语法格式grep[选项]...模式[文件]...使用BRE正则表达式的示例cxz@linuxpc1:~$grep-G"^cxz"/etc/passwdcxz:x:1000:1000:cxz,,,:/home/cxz:/bin/bash选项-e用于显式指定正则表达式的模式,可指定多个模式cxz@linuxpc1:~$grep-e"^cxz"-e"sync$"/etc/passwdsync:x:4:65534:sync:/bin:/bin/synccxz:x:1000:1000:cxz,,,:/home/cxz:/bin/bash8.6Shell正则表达式与文本处理命令使用sed命令处理文本内容sed命令的基本用法sed[选项]...{脚本(如果没有其他脚本)}[输入文件]...sed命令的子命令子命令说明a在目标行的下面新增一行或多行,后面的参数可以字符串的形式指定新增行的内容。多行时除最后一行外,每行末尾需用“\”符号续行c替换指定行,后面的参数可以字符串的形式指定要替换的行内容。多行时除最后一行外,每行末尾需用“\”符号续行d删除指定行i在目标行的上面插入一行或多行,后面的参数可以字符串的形式指定插入行的内容。多行时除最后一行外,每行末尾需用“\”符号续行p显示指定行,通常与-n选项一起使用s替换内容,无须指定地址范围,通常与正则表达式配合使用!表示后面的命令对所有未被选定的行发生作用=输出当前行号#将注释扩展到下一个换行符之前8.6Shell正则表达式与文本处理命令使用sed命令处理文本内容sed命令的地址行号(“$”表示最后一行正则表达式使用sed修改文本文件只有使用-i选项才可以改变文件内容方便使用Shell脚本修改配置文件使用sed命令替换文件内容sed[选项]...'s/原字符串/新字符串/'文件sed[选项]...'s/原字符串/新字符串/g'文件8.6Shell正则表达式与文本处理命令使用sed命令处理文本内容在sed命令中使用正则表达式可以使用正则表达式高效实现复杂的查找和替换功能。sed的正则表达式使用两个正斜杠标识。sed命令默认使用BRE,使用选项-r则可以使用ERE。示例cxz@linuxpc1:~$sed's/#.*//g'/etc/ssh/ssh_config|sed/^$/dInclude/etc/ssh/ssh_config.d/*.confHost*SendEnvLANGLC_*HashKnownHostsyesGSSAPIAuthenticationyes8.6Shell正则表达式与文本处理命令使用awk命令处理文本内容awk命令的基本用法awk[选项]...脚本[输入文件]...常用的awk内置变量内置变量说明内置变量说明$n当前记录的第n个字段FILENAME当前文件名$0完整的输入记录FS字段分隔符,默认是空格和制表符ARGC命令行参数的数目RS行分隔符,默认是换行符ARGIND命令行中当前文件的位置(从0开始算)OFS输出字段的分隔符,默认为空格NF一条记录的字段的数目ORS输出记录的分隔符,默认为换行符NR已经读出的行数,从1开始OFMT数字输出的格式,默认为%.6g8.6Shell正则表达式与文本处理命令使用awk命令处理文本内容awk命令的自定义变量-v变量名=变量值awk命令的运算符算术运算符赋值运算符关系运算符逻辑运算符正则运算符输出操作命令print的参数可以是变量、数值或者字符串printf命令的用法和C语言中的printf基本相似8.6Shell正则表达式与文本处理命令使用awk命令处理文本内容awk命令的函数awk命令提供一些内置函数split()——将字符串分隔后保存至
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025天津市建筑安全员A证考试题库附答案
- 生物-四川省金太阳2025届高三2月开学考试试题和答案
- 2025年度房产出售代理售后服务协议
- 2025年度化工原料运输事故应急预案合同
- 2025年度文化艺术公司公司挂靠文化艺术交流活动合同
- 2025年度农村鱼塘养殖权转让与渔业资源可持续利用合同
- 2025年度图书出版著作权许可及翻译权合同
- 2025年度电商运营顾问劳动合同
- 2025年度商业地产开发车位赠送及使用维护合同
- 2025年度个人自愿捐赠残疾人福利基金协议书
- 《劳动合同法》普法宣传资料
- 二年级下册科学教案-2.3科技产品体验会 大象版
- 退役军人优待证申领表
- Q∕SY 19001-2017 风险分类分级规范
- 劳务分包项目经理岗位职责
- 幼儿绘本故事:奇怪的雨伞店
- 钢琴基础教程教案
- 糖基转移酶和糖苷酶课件(PPT 111页)
- 屋面网架结构液压提升施工方案(50页)
- (语文A版)四年级语文下册课件跳水 (2)
- 第6章向量空间ppt课件
评论
0/150
提交评论