版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章Linux
shell程序设计李威liweizhisjb@163.com1Linux内核概述shell层是内核之外的中间层,是用户和系统交互的界面。2Linux内核概述在前面章节,shell被解释为命令解释程序,即,它接收用户输入的命令,然后创建子进程,由子进程实现命令所规定的功能,等子进程终止工作后发出提示符。这是shell常见的使用方式。3Linux内核概述其实shell还是一种高级程序设计语言,它有变量、关键字还有各种控制语句4Linux
shell程序设计Linux提供多种不同的shell。常用的有Bourneshell(简称sh)、C-shell(简称csh)、Kornshell(简称ksh)和BourneAgainshell(简称bash)。
5Linux
shell程序设计Bourneshell是AT&TBell实验室为AT&T的UNIX开发的,是UNIX默认的shell6Linux
shell程序设计C-shell(简称csh)是加州伯克利大学的BillJoy为BSDUNIX开发的,与sh不一样7Linux
shell程序设计Kornshell(简称ksh)也是AT&TBell实验室开发的,其命令交互界面和编程界面很好8Linux
shell程序设计BourneAgainshell(简称bash)是GNU开发的一个shell,是Linux默认的shell9Linux
shell程序设计shell特点:☆对已有命令进行组合构成新命令,组合方式简单;☆提供了文件名扩展字符,使单一字符串可以匹配多个文件名;☆可以直接使用shell的内置命令而不需创建新的进程;☆shell灵活使用数据流,提供通配符、输入/输出重定向、管道线等机制;☆提供了顺序流程控制、条件控制、循环控制语句;☆shell提供了在后台执行命令的能力;☆shell提供了可配置的环境,允许用户创建修改命令、命令提示符等系统行为;☆shell提供了一个高级的命令语言,允许用户创建简单和复杂的程序。操作系统本身自带的命令。不需要外部软件支持的命令,如:cd、echo、kill等命令10Linux
shell程序设计shell脚本的创建和执行:☆使用shell的最简单的方法是从键盘上直接输入命令行或存入文件中,这种被shell解释执行的文件为shell脚本。☆利用编辑器建立一个shell脚本,和普通文件一样,例:$viex1建立一个名字为ex1的shell脚本11Linux
shell程序设计☆执行shell脚本的方式有三种:(1)$bash<脚本名(2)$bash脚本名[参数](3)将shell脚本的权限设置为可执行,然后再提示符下直接执行它用输入重定向让shell从给定文件中读入命令行,进行相应处理。
以脚本名作为参数传递给程序中的命令例(1)$bash<ex1(2)$·
ex1(3)$chmoda+xex2$./ex2()脚本后面不能带参数目前使用的shell以·表示把shell脚本ex2置为对所有用户都有执行权限,然后在提示符后可以直接执行该文件12Linux
shell程序设计☆bash提供了命令历史功能,即系统为每一个用户维护一个命令历史文件(/root/.bash_history),该文件把用户输入的命令自动的加到该命令历史表中。用户可以调用或者修改以前的命令。
$HISTFILE=”/home/.test_history”$HISTSIZE=100可以通过HISTFILE改变存放历史命令的文件将历史命令存放在/home/.test_history下设置历史文件中可以保留100条历史命令,默认是50013Linux
shell程序设计☆显示命令历史表中的命令
history[option][arg…]显示历史命令,包括刚输入的history例:$history$history50显示历史表中的最后50行命令14Linux
shell程序设计☆执行历史命令:以字符“!”开头,后随一个或多个字符来定义某种类型的历史命令。(符号间没有空格)格式意义!!重复上一条命令,相当于!-1!n重新执行第n条历史命令!-n重新执行倒数第n条历史命令。!-1等于!!!string重新执行以字符串string开头的最近的历史命令行。例:!ca表示访问最近的cat命令!?string?重新执行最近的、包含string的历史命令。例:!?hist?表示重复前面含有hist的命令15Linux
shell程序设计☆名称补全:在bash命令行上输入目录名和文件名时,可以按tab键让系统自动补全剩余的部分。例:$cd/us$cate系统自动补全/usr如果目录中有ex1、ex2、exam1则系统会补全到三者相同部分的最后一个字符,屏幕显示为$catex,如果此时用户继续按Tab键,屏幕显示为$catexex1ex2exam1等待用户选择16Linux
shell程序设计☆别名:对于常用的选项或参数比较多的固定命令可以取个别名替换,定义别名的命令
alias[name[=value]]…
例:$alias$aliasll=’ls-l’$ll$aliasll=ls-l$ll在屏幕上显示别名清单等价于$ls-l等价于$ls17Linux
shell程序设计☆别名:对于常用的选项或参数比较多的固定命令可以取个别名替换,定义别名的命令
alias[name[=value]]…☆取消别名:unaliasname执行后从别名表中删除name指定的别名18Linux
shell程序设计19Linux
shell程序设计☆模式表达式:除了*、?和[…]之外还有以下形式:(1)*(模式表):匹配给定模式表中的模式的0次或多次出现,各模式以|分开;(2)+(模式表):匹配给定模式表中的模式的1次或多次出现,各模式以|分开;(3)?(模式表):匹配给定模式表中任一模式的0次或1次出现,各模式以|分开;(4)@(模式表):仅匹配模式表中的给定模式的1次出现;(5)!(模式表):除给定模式表中的模式外匹配其他任何模式20Linux
shell程序设计例:file*(.c|.o)将匹配文件file、file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等
file+(.c|.o)将匹配文件file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等,不匹配file
file?(.c|.o)只匹配文件file、file.c、file.o,不匹配file.c.c、file.o.o、file.c.o、file.o.c等,
file@(.c|.o)只匹配文件file.c、file.o不匹配file、file.c.c、file.o.o、file.c.o、file.o.c等21Linux
shell程序设计☆引号:分为单引号、双引号和倒引号。用双引号括起来除$、倒引号(`)和反斜线(\)之外都作为普通字符对待,$表示变量替换;倒引号(`)表示命令替换;反斜线(\)表示转义字符。单引号括起来的字符表示都是普通字符。倒引号(`)括起来的字符被shell解释为命令行。22Linux
shell程序设计例:$catex3echo“currentdirectoryis`pwd`”echo”homedirectoryis$HOME”echo“file*.?”$bashex3currentdirectoryis/homehomedirectoryis/rootfile*.?23Linux
shell程序设计☆注释:shell程序中以#开头的正文行表示注释;在shell脚本的第一行以#!开头表示该脚本是用哪种shell编写的,从而调用相应的解释程序执行。☆后台命令:当程序执行需要时间过长时,那么在命令最后输入&符号,则shell在后台启动该程序,马上显示下一个提示符,允许用户输入新的命令。24Linux
shell程序设计等价于pwd这里分号隔开的命令,前面的命令执行成功who|wc–l与否并不影响后面命令的执行
cd/home☆命令执行操作符:多条命令可以在一行中出现,各命令之间以分号隔开,例pwd;who|wc-l;cd/home25Linux
shell程序设计☆命令执行操作符:逻辑与操作符&&可将两个命令联系在一起,命令1&&命令2表示先执行命令1,如果执行成功才执行命令2,否则不执行命令2。逻辑非操作符||可将两个命令联系在一起,命令1||命令2表示先执行命令1,如果不成功则执行命令2,如果命令成功则不执行命令2。26Linux
shell程序设计27Linux
shell程序设计☆成组命令:在shell中有两种方式将若干命令组合在一起,一个是花括号,一个是圆括号;(1){…;}形式:以花括号括起来的全部命令作为一条命令执行,左括号后有一个空格右括号前有分号
(2)(…)形式:左括号后不需有空格,右括号之前也不需加分号例:${echo“userreportfor`date`”;who;}|cat(echo和who命令的执行结果经管道传给屏幕进行输出)28Linux
shell程序设计二者区别:花括号括起来的组命令在本shell执行命令,不产生新进程;圆括号括起来的组命令要在新的子shell内执行,要建立新的子进程。29Linux
shell程序设计shell有两类变量:环境变量和临时变量。环境变量是永久性变量,值不会随shell脚本执行结束而消失;临时变量是在shell程序内部定义,使用范围仅限于定义它的程序,出了程序就不能使用,程序结束后,它的值就不存在了。环境变量像$HOME(用户主目录的全路径)$LOGNAME(用户的注册名,通过该变量系统来确认用户是否是文件的拥有者,是否有权利执行某个命令)$PATH(shell从中查找命令的目录列表,例:PATH=$PATH:/home)
30Linux
shell程序设计☆用户定义的变量:变量名是以字母或下划线开头,由字母、下划线和数字组成的序列。大小写意义不同,变量长度不受限制。定义变量并赋值的一般形式变量名=字符串引用变量时用“$变量”31Linux
shell程序设计例:$dir=/home/ccc$echo$dir$echodir$today=Sunday$echo$today$Today$dir=/home/cc$cat${dir}c/mi.c$cat$dirc/mi.c$cat$dir/mi.c显示结果/home/ccc显示结果dir显示结果SundayToday未被赋值,为空串将文件/home/ccc/mi.c显示出来提示出错,认为dirc是个新变量,前面未赋值,所以找不到文件mi.c将文件/home/cc/mi.c显示出来32Linux
shell程序设计☆数组:bash只提供一维数组,数组元素下标由0开始编号。一般形式为:declare
–a数组名读取数组元素值的一般形式是:${数组名[下标]}对数组元素赋值的一般形式是:数组名[下标]=值或数组名=(值1值2……值n)33Linux
shell程序设计例:$city[0]=Beijing$city[1]=Shanghai$echo${city[0]}$A=(thisisanexampleofshellscript)$echo${A[0]}${A[2]}${A[3]}${A[6]}$echo${A[8]}显示结果Beijing显示结果结果显示为thisanexamplescript显示结果结果显示为空串34Linux
shell程序设计☆输入命令——read命令:从键盘上读取数据,然后赋给指定的变量,例$readxyzTodayisMonday$echo$z$x$y显示结果Monday
Todayis35Linux
shell程序设计☆输入命令——read命令:从键盘上读取数据,然后赋给指定的变量,例$readn1n2n3FirstSecondThird1234abcd(回车键)
$echo$n3
$echo$n2$n1变量个数少于数据个数时,从左往右对应赋值,最后一个变量被赋予剩余的所有数据显示结果为Third1234abcd显示结果为SecondFirst36Linux
shell程序设计☆输入命令——read命令:从键盘上读取数据,然后赋给指定的变量,例$readn1n2n312(回车键)
$echo$n3$echo$n2$n1变量个数多于给定的数据个数时,依次对应赋值,没有数据对应的取空串显示结果为空串显示结果为2137Linux
shell程序设计☆预先定义的特殊变量(1)$#——命令行上参数的个数(2)$?——上一条命令的返回值,执行成功为0;执行失败返回非0值(3)$$——当前进程的进程号(4)$!——上一个后台命令对应的进程号,由1~5位数字构成(5)$-——由当前shell设置的执行标志名组成的字符串(6)$*——表示在命令行中实际给出的所有实参字符串例ex6m1.cm2.c($#值为2)38Linux
shell程序设计39Linux
shell程序设计bash中执行整数算术运算的命令是let,语法格式:letarg…
例:let“j=i*6+2”等价于((j=i*6+2))40Linux
shell程序设计优先级运算符结合性功能1-、+从右至左取表达式负值、正值2!、~从右至左逻辑非、按位取反3**从左至右方幂4*、/、%从左至右乘、除、取模5+、-从左至右加、减6<<、>>从左至右左移若干二进制位、右移若干二进制位、41Linux
shell程序设计7>、>=、<、<=从左至右大于、大于或等于、小于、小于或等于8==、!=从左至右相等、不相等9&从左至右按位与10^从左至右按位异或11|从左至右按位或12&&从左至右逻辑与13||从左至右逻辑或14?:从右至左条件计算15=、+=、-=、*=/=、%=&=、^=、|=、<<=、>>=从右至左赋值运算且赋值42Linux
shell程序设计注意:当表达式中有shell特殊字符时,必须用双引号括起来。例:$let“v=6|5”$echo$v$let
v=6|5
显示结果为7结果提示出错,把|看成管道符,左右两边由于不是命令因而无法正确执行43Linux
shell程序设计☆if语句一般格式:if测试条件then命令1else命令2fi
44Linux
shell程序设计例:
iftest-f“$1”thenecho“$1isanordinaryfile.”
elseecho“$1isnotanordinaryfile.”fi
通过test命令测试$1是否是一个已存在的普通文件,如果是则显示$1isanordinaryfile.否则显示$1isnotanordinaryfile45Linux
shell程序设计例:
iftest-f“$1”thenecho“$1isanordinaryfile.”
elseecho“$1isnotanordinaryfile.”fi
用test命令或一对方括号括起来是等价的,
test–f“$1”等价于[–f“$1”]
46Linux
shell程序设计☆条件测试命令——test(1)文件测试运算符及其功能参数功能-r文件名若文件存在并且是用户可读的,则测试条件为真-w文件名若文件存在并且是用户可写的,则测试条件为真-x文件名若文件存在并且是用户可执行的,则测试条件为真-f文件名若文件存在并且是普通文件,则测试条件为真-d文件名若文件存在并且是目录文件,则测试条件为真-p文件名若文件存在并且是命名的FIFO文件,则测试条件为真-b文件名若文件存在并且是块设备文件,则测试条件为真-c文件名若文件存在并且是字符设备文件,则测试条件为真-s文件名若文件存在并且文件长度大于0,则测试条件为真-t文件描述字如果文件被打开其文件描述字是与终端设备相关的,则测试条件为真47Linux
shell程序设计(2)有关字符串方面的测试参数功能-zs1如果字符串s1的长度为0,则测试条件为真-ns1如果字符串s1的长度大于0,则测试条件为真s1如果字符串s1不是空字符串,则测试条件为真s1=s2如果s1等于s2,则测试条件为真s1!=s2如果s1不等于s2,则测试条件为真s1<s2如果按字典顺序s1在s2之前,则测试条件为真s1>s2如果按字典顺序s1在s2之后,则测试条件为真48Linux
shell程序设计(3)有关数值方面的测试参数功能n1–eqn2如果整数n1等于n2,则测试条件为真n1–nen2如果整数n1不等于n2,则测试条件为真n1–ltn2如果整数n1小于n2,则测试条件为真n1–len2如果整数n1小于或等于n2,则测试条件为真n1–gtn2如果整数n1大于n2,则测试条件为真n1–gen2如果整数n1大于或等于n2,则测试条件为真49Linux
shell程序设计(4)逻辑运算符参数功能!放在任意逻辑表达式之前,使原来的表达式变为假-a放在两个逻辑表达式之间,当两个表达式为真时,结果为真-o放在两个逻辑表达式之间,其中只要一个表达式为真时,结果就为真()把一个逻辑表达式括起来,使其优先得到运算50Linux
shell程序设计(5)特殊条件测试:表示不作任何事情,退出值为0ture表示总为真,退出值总是0false表示总为假,退出值总是25551Linux
shell程序设计☆case语句,一般语法形式为case字符串in
模式字符串1)命令
…
命令;;模式字符串2)命令…
命令;;…模式字符串n)命令…
命令;;esac执行过程如下:用字符串依次同各模式字符串进行比较,如果发现某一个匹配,那就执行该模式字符串之后的命令,直至遇到两个分号为止;如果没有任何模式字符串与该字符串的值相符合,则不执行任何命令注意:(1)每个模式字符串后面可有一条或多条命令,其最后一条命令必须用两个分号结束;(2)模式字符串中可以使用通配符;(3)如果模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表示各模式是或的关系;(4)各模式字符串应是唯一的,不重复出现;(5)要以case开头以esac结束;(6)case的返回值是整个结构中最后执行的那个命令的退出值,若没有执行任何命令,则返回值为052Linux
shell程序设计☆while语句一般语法形式为:while测试条件do
命令表done执行过程如下:先进行条件测试,如果结果为真则进入循环体,执行其中的命令;然后再作条件测试……,直至测试条件为假才终止while语句的执行。53Linux
shell程序设计☆until语句一般语法形式如下:until测试条件do
命令表done执行过程如下:测试条件为假时进入循环体,直至测试条件为真时终止循序54Linux
shell程序设计for变量in值表do
命令表done执行过程如下:变量依次取值表里的各个值,然后执行命令表☆for语法一般语法主要有三种,(1)格式一:55Linux
shell程序设计例:fordayinMondayWednesdayFridaySundaydoecho$daydone执行过程如下:变量day依次取值表里的各个值,第一次将Monday赋给day,然后执行命令“echo$day”;第二次将Wednesday赋给day……☆for语法一般语法主要有三种,(1)格式一:56Linux
shell程序设计for变量in文件正则表达式do
命令表done执行过程如下:取当前目录下与正则表达式相匹配的文件名,每取值依次就进入循环体执行命令表一次☆for语法一般语法主要有三种(2)格式二:57Linux
shell程序设计例:forfileinm*.cdocat$file|prdone执行过程如下:将当前目录下所有以m开头的C程序文件按分页格式显示出来☆for语法一般语法主要有三种(2)格式二:58Linux
shell程序设计foriin$*do
命令表doneforido或者命令表done☆for语法一般语法主要有三种(3)格式三:执行过程如下:变量i依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止59Linux
shell程序设计☆位置参数:执行UNIX/Linux命令或Shell脚本时,Shell传递给脚本的参数,例:bashex1/home/l1ex15ex16ex17——实参$0$1$2$3$4注意:$0始终对应脚本名,不能为空;其他位置变量的值可以为空串——位置参数60Linux
shell程序设计例:bashex1/home/l1ex15ex16ex17$0$1$2$3$4注意:shift——移动位置命令,每执行一次,实参就左移一位,相当于位置参数右移一位☆位置参数:执行UNIX/Linux命令或Shell脚本时,Shell传递给脚本的参数,61Linux
shell程序设计例:命令行:bashex7ABCDEF$0$1$2$3$4shift后位置参数原位置:参数$5$6$0$1$2$3$4$562Linux
shell程序设计请解释下列程序并给出最终结果#ex8ec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 千岛湖东南旅游码头配套项目技术标
- 议论文作文课件
- 2024年度股权投资合同:某创业公司A轮融资2篇
- 虞美人教学课件
- 《铁路货物运输》课件
- 《肺癌病人的护理》课件
- 2024中国移动政企客户分公司暑期实习生校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国石化海洋石油工程公司毕业生招聘15人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国正大甘肃区校园招聘70人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国大唐集团资本控股限公司招聘16人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年消防月主题培训课件:全民消防 生命至上(含11月火灾事故)
- 高空蜘蛛人施工专项施工方案
- 2024广西公需课高质量共建“一带一路”谱写人类命运共同体新篇章答案
- 2024年连云港专业技术人员继续教育《饮食、运动和健康的关系》92分(试卷)
- 2024年安徽合肥交通投资控股有限公司招聘笔试参考题库含答案解析
- 说教材说目标-《长方形和正方形》单元说课一等奖
- 2022-2023年度中国家族财富可持续发展报告
- 心肌梗死后综合征
- IMDS提交程序步骤
- 收款确认函-模板(共2页)
- 交通工程标线、标志牌检验批质量验收记录表
评论
0/150
提交评论