版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.,1,第4章 Linux shell程序设计,.,2,4.1 shell概述4.1.1 shell的特点和主要版本,作为命令解释程序 一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if、case、while、for等语句,支持函数模块,有自己的语法结构 1.shell的特点 组合新命令 提供了文件名扩展字符 直接使用shell的内置命令 灵活地使用数据流 结构化的程序模块 在后台执行命令 可配置的环境 高级的命令语言,.,3,2shell的种类 (1)Bourne shell(简称sh) (2)C shell(简称csh) (3)Korn shell(简称ksh) (4)Bour
2、ne Again shell(即bash),.,4,4.1.2 shell程序示例,【例4.1】 由三条简单命令组成的shell程序(文件名为ex1)。 $ cat ex1 date pwd cd .,.,5,【例4.2】 带有控制结构的shell程序(文件名为ex2)。 $ cat ex2 #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing each subdirectory. if test $# = 0 then ls . else for i do ls -l $
3、i | grep d done fi,.,6,4.1.3 shell脚本的建立和执行,shell脚本的建立 2执行shell脚本的方式 执行shell脚本的方式基本上有三种: (1)输入定向到shell脚本 $ bash 脚本名 (2)以脚本名作为参数 其一般形式是: $ bash 脚本名 参数 如果以目前shell(以表示)执行一个shell脚本,则可以使用如下简便形式: $ 脚本名 参数 (3)将shell脚本的权限设置为可执行,然后在提示符下直接执行它。 $ chmod a+x ex2 $ PATH=$PATH:. $ ex2 注意,此时该脚本所在的目录应被包含在命令搜索路径(PATH)
4、中,.,7,4.5 shell特殊字符 4.5.1 通配符,1一般通配符 *(星号),它匹配任意字符的0次或多次出现 ?(问号),它匹配任意一个字符 (一对方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符 !(惊叹号),如果它紧跟在一对方括号的左方括号()之后,则表示不在一对方括号中所列出的字符 2模式表达式 是那些包含一个或多个通配符的字 *(模式表)匹配给定模式表中“模式”的0次或多次出现,各模式之间以“”分开(下同) +(模式表)匹配给定模式表中“模式”的1次或多次出现 ?(模式表)匹配模式表中任何一种“模式”的0次或1次出现 (模式表)仅匹配模式表中给定“模式”的一
5、次出现 !(模式表)除给定模式表中的一个“模式”之外,可以匹配其他任何东西,.,8,4.5.2 引号,1双引号 由双引号括起来的字符(除$、倒引号()和反斜线()外)均作为普通字符对待。 2单引号 由单引号括起来的字符都作为普通字符出现 3倒引号 倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。 倒引号还可以嵌套使用。但应注意,嵌套使用时内层的倒引号必须用反斜线()将其转义。,.,9,4.5.3 输入/输出重定向符,自动打开三个标准文件,即标准输入文件(stdin),标准输出文件(stdout)和标准出错输出文件(st
6、derr)。 1输入重定向符 一般形式是:命令 文件名 如:$ who abc 3输出附加定向符 一般形式是:命令文件名 如:$ ps -l psfile 输入和输出重新定向可以连在一起使用。例如: $ wc -l outfile,.,10,4.5.4 注释、管道线,1注释 #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing each subdirectory. 2管道线 ls -l $HOME | wc l ls | grep m?.c | wc l,.,11,4.5.
7、5 命令执行操作符,1顺序执行 在执行时,以分号隔开的各条命令从左到右依次执行 pwd ; who | wc -l ; cd /usr/bin 2逻辑与 命令1 who ; | pr 使用花括号时在格式上应注意:左括号 “ ”后面应有一个空格;右括号“”之前应有一个分号( ;) 2( )形式 (echo Current directory is pwd . cd /home/mengqc ; ls -l ; cp m1 em1 cd /home/mengqc ; ls -d),.,16,4.6.3 变量引用,有效的变量引用表达式有以下形式: $name $name#pattern $name
8、$name#pattern $namen $name % pattern $name* $name % pattern $name $# $name:-word $#* $name:=word $# name $name:?word $# name* $name:+word $#name,.,17,表达式$name表示变量name的值,若变量未定义,则用空值替换。 表达式$name将被变量name的值替换。用花括号括起name,目的在于把变量名与后面的字符分隔开,避免出现混淆。替换后花括号被取消。 $namen表示数组变量name中第n个元素的值。 表达式$name*和$name都表示数组na
9、me中所有非空元素的值,每个元素的值用空格分开。如果用双引号把它们都括起来,那么二者的含义就有区别:对于$name*,它被扩展成一个词(即字符串),这个词由以空格分开的各个数组元素组成;对于$name,它被扩展成多个词,每个数组元素是一个词。如果数组name中没有元素,则$name被扩展为空串。,.,18,表达式$name:-word、$name:=word、$name:+word、$name:?word的计算方法在4.7节中介绍 表达式$name#pattern和$name#pattern 如果pattern(Shell模式)与name值的开头匹配,那么name的值去掉匹配部分后的结果就是该
10、表达式的值;否则, name的值就是该表达式的值。在第一种格式中,name值去掉的部分是与pattern匹配的最少的部分;而第二种格式中,name值去掉的部分是与pattern匹配的最多的部分。 表达式$name % pattern和$name % pattern 如果pattern与name值的末尾匹配,那么name的值中去掉匹配部分后的结果就是该表达式的值;否则,该表达式的值就是name的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。,.,19,表达式$#和$#* 它们的值分别是由$和$*返回的参数的个数。 表达式$#namei 该表达式的值是
11、数组name第i个元素值的长度(字符个数)。 表达式$#nane*和$#name 它们的值都是数组name中已经设置的元素的个数。,.,20,4.6.4 输入/输出命令,1read命令 可以利用read命令从键盘上读取数据,然后赋给指定的变量。read命令的一般格式是: read 变量1 变量2 变量个数与给定数据个数相同,则依次对应赋值 变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据。 变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串 2 echo命令显示其后的变量值或者直接显示它后面的字符串 如果echo命令带有选项“-e”,那么在其后
12、的参数中可以有以下转义字符: a b c e f n r t v m xm,.,21,4.6.5 位置参数,1位置参数及其引用 位置变量的名称很特别,分别是0,1,2, 命令行实参与脚本中位置变量的对应关系如下所示: exam1 m1 m2 m3 m4 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 引用它们的方式依次是$0, $1, $2, , $9, $10, $11等。 其中,$0始终表示命令名或shell脚本名。 位置变量不能通过一般赋值的方式直接赋值 通过命令行上对应位置的实参传值,.,22,4.6.6 移动位置参数,每执行一次shift命令,就把命令行上
13、的实参向左移一位,即相当于位置参数向右移动一个位置。 命令行: ex7 A B C D EF 原位置参数: $0 $1$2 $3 $4 $5 $6 移位后位置参数: $0 $1 $2 $3 $4 $5 shift命令不能将$0移走,所以经shift右移位置参数后, $0的值不会发生变化。 shift命令可以带有一个整数作为参数,.,23,4.6.7 预先定义的特殊变量,$# 命令行上参数的个数,但不包含shell脚本名本身。因此,$#可以给出实际参数的个数。 $? 上一条命令执行后的返回值(也称作 “返回码”、 “退出状态”、“退出码”等)。它是一个十进制数。 $ 当前进程的进程号。 $! 上
14、一个后台命令对应的进程号,这是一个由15位数字构成的数字串。 $ 由当前shell设置的执行标志名组成的字符串。 $* 表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。 $ 它与$*基本功能相同,即表示在命令行中给出的所有实参。但“$”与“$*”不同。,.,24,4.6.8 环境变量,1常用的环境变量 HOME:用户主目录的全路径名 LOGNAME:即你的注册名,由Linux自动设置 MAIL:你的系统信箱的路径 PATH:shell从中查找命令的目录列表。可以设置它, 如:PATH=$PATH:$HOME/bin PS1:shell的主提示符。 bash默认的主提示符一般为“s
15、-v$ ”。其中,s表示shell的名称;v表示bash的版本号 PS1=Enter Command PWD:你当前工作目录的路径 SHELL:你当前使用的shell TERM:你的终端类型,.,25,2使用环境变量 如果要使用环境变量或其它shell变量的值,必须在变量名之前加上一个“$”符号,不能直接使用变量名。 如:cd $HOME 3删除环境变量 $ unset NAME,.,26,4.8 算 术 运 算,bash中执行整数算术运算的命令是let,其语法格式为: let arg 其中arg是单独的算术表达式。它使用C语言中表达式的语法、优先级和结合性。除+、-和逗号(,)之外,所有整型
16、运算符都得到支持,此外,还提供了方幂运算符“*”。 在算术表达式中直接利用名称访问命名的参数,不要前面带有“$”符号 let 命令的替代表示形式是: (算术表达式) 例如: let “j=i*6+2 等价于: (j=i*6+2) 如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1。,.,27,当表达式中有shell的特殊字符时,必须用双引号将其括起来。例如,let val=a|b 只有使用 $(算术表达式) 形式才能返回表达式的值,.,28,4.9 控制结构 4.9.1 if语句,if语句用于条件控制结构中,其一般格式为: if 测试条件 then 命令1 else 命令2 f
17、i 其中,if、then、else和fi是关键字。例如: if test -f $1 then echo $1 is an ordinary file . else echo $1 is not an ordinary file . fi,.,29,if语句中else部分可以缺省。例如, if test -f $1 then echo $1 is an ordinary file . fi if 语句的else部分还可以是elseif结构,则用关键字“elif”代替“else if”。例如, if test - f $1 then pr $1 elif test - d $1 then ( c
18、d $1 ; pr * ) else echo $1 is neither a file nor a directory . fi,.,30,if的语句的更一般形式是: if 命令表1 then 命令表2 else 命令表3 fi,.,31,4.9.2 条件测试,条件测试有三种常用形式:一种是用test 命令,如上所示。另一种是用一对方括号将测试条件括起来。这两种形式是完全等价的。例如,测试位置参数$1是否是已存在的普通文件,可写为: test -f $1 也完全可写成: -f $1 第三种形式是: 条件表达式 test命令可以和多种系统运算符一起使用。这些运算符可以分为四类:文件测试运算符、
19、字符串测试运算符、数值测试运算符和逻辑运算符。,.,32,1有关文件方面的测试,.,33,2有关字符串方面的测试,.,34,3有关数值方面的测试,.,35,5特殊条件测试 (1) :表示不做任何事情,其退出值为0。 (2)true 表示总为真,其退出值总是0。 (3)false 表示总为假,其退出值是255。,.,36,4.9.3 case语句,case语句允许进行多重条件选择。其一般语法形式是: case 字符串 in 模式字符串1) 命令 命令; 模式字符串2) 命令 命令; 模式字符串n) 命令 命令; esac,.,37,在使用case语句时应注意: 每个模式字符串后面可有一条或多条命
20、令,其最后一条命令必须以两个分号(即;)结束。 模式字符串中可以使用通配符 如果一个模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表示各模式是“或”的关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表 各模式字符串应是唯一的,不应重复出现。并且要合理安排它们的出现顺序。 case语句以关键字case开头,以关键字esac(是case倒过来写!)结束。 case的退出(返回)值是整个结构中最后执行的那个命令的退出值。若没有执行任何命令,则退出值为零,.,38,4.9.4 while语句,shell中有三种用于循环的语句,它们是:while语句、for语句和until语句
21、。 while语句的一般形式是: while 测试条件 do 命令表 done 测试条件部分除使用test命令或等价的方括号外,还可以是一组命令。根据其最后一个命令的退出值决定是否进入循环体执行。,.,39,4.9.5 until语句,until语句的一般形式是: until 测试条件 do 命令表 done 它与while语句很相似,只是测试条件不同:当测试条件为假时,才进入循环体,直至测试条件为真时终止循环。,.,40,4.9.6 for语句,其使用方式主要有两种:一种是值表方式,另一种是算术表达式方式。 1值表方式 其一般格式是: for 变量 in 值表 ;do 命令表;done 根据循环变量的取值方式,其使用格式可分为三种: 格式一: for 变量 in 值表 do 命令表 done,.,41,格式二: for 变量 in 文件正则表达式 do 命令表 done 格式三: for i in $* 或者 for i do do 命令表 命令表 done done,.,42,2算术表达式方式 其一般格式是: for ( e1;e2;e3) ; do 命令表;done 或者 for (e1;e2;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东阳江市江城区顺安粮油储备有限公司招聘4人备考题库及答案详解(网校专用)
- 2026上海同济大学自主智能机器人研究院逻辑工程师岗位招聘2人备考题库及答案详解(真题汇编)
- 2026陕西渭南脊柱康复医院招聘13人备考题库及答案详解(名校卷)
- 2026紫金矿业招聘备考题库及答案详解(典优)
- 2025-2026学年爱学习中班教案
- 2025-2026学年散步教学设计教材分析
- 2025-2026学年海滨小城公开课教学设计
- 2025-2026学年蜀道难高中教学设计
- 2024-2025学年一、图形的运动(二)教案及反思
- 2025-2026学年司马光教学设计图纸
- 塑料行业常识培训课件
- 2025全国不动产登记代理人《不动产登记代理实务》考试真题(附完整解析)
- 重庆市七校联考2024-2025学年高一下学期第一次月考数学试卷(含答案)
- 布控球管理制度
- 计量标准器具,检测仪器设备的使用、保管、降级和报废制度
- 青马工程培训心得体会
- 口腔数字化修复技术课件
- 统编版 一年级下册道德与法治 第3课《错了就要改》(第二课时)教案教学设计
- 系统软件安装与使用说明手册
- 2022新一代配电网与微电网
- 美容仪器应用第二版讲解
评论
0/150
提交评论