版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 Linux Shell编程,Linux Shell概述 Shell启动及其命令 Shell命令的集成 Shell 变量 Shell的控制结构 Shell的运行环境,本章要点,什么是 Shell Shell的双重特性 Shell程序语言的特点 Shell的版本 Shell版本的选择,Shell概述,什么是 Shell,Shell就是Linux提供用户的使用界面 。 Shell处在内核与外层应用程序之间,起着 协调用户与系统的一致性、在用户与系统 之间进行交互的作用,即 Shell为用户提供 了输入命令和参数并可得到命令执行结果 的环境。,什么是 Shell,LINUX 系统层次结构图,获
2、取使用者的指令,分析使用者的指令,执行指令,一般的程序设计语言, 如C programming language,Tool.c int main()printf(“hello worldn”);,Compiler编译器,Linker(连接器),a.out(可执行档),Operating system:Linux, or Windows (可执行档的环境),Shell的双重特性, 命令解释程序(命令解释器) Shell解释用户输入的命令行,提交系统内核 处理,并将结果返回给用户; Shell与Linux命令一样都是实用程序,但有区 别。一旦用户注册到系统后, Shell 就被系统装 入内存,并一
3、直运行到用户退出系统之止;而一 般命令仅当被调用时,才由系统装入内存执行。 程序设计语言 Shell本身也是一种可编程的程序设计语言。,Shell程序语言的特点,Shell允许通过编程来完成复杂的功能处理, 但其作为语言与高级语言比较具有不同的特点: Shell是解释性的,多数高级语言是编译性的; Shell语言与高级语言处理的对象不同; Shell与系统有密切的关系; Shell易编写、调试、灵活性较强,但速度低; Shell作为命令级语言,命令组合功能很强。,Shell的版本,Shell有两种主要语法类型:Bourne和C,彼此不兼容. Bourne家族:sh ksh bash psh z
4、sh C 家族:csh tcsh 其中: bash和 zsh在不同程度上支持 csh 的语法。,常用Shell在交互式使用方面的比较,Shell版本的选择,选择Shell版本应考虑的因素: Bourne Shell在任何一个Unix系统平台上都 存在,因此又成为标准Shell; Bourne Shell家族有更丰富的程序语言,而 C Shell家族有简单的程序接口; Shell各类变种功能越来越强大,但学习和使 用也越难,因此可依据使用者编程经验来选择; Shell编程的脚本是个人使用还是公用,即要 考虑移植性问题。,Shell命令的集成,正则表达式(Regular expression) 管
5、道和命令表 命令组合 命令替换 输入输出重定向,正则表达式 (Regular expression), Linux元字符(通配符)的定义 * 匹配任何字符串,包括空字符串; ? 匹配任何单个字符; , - , ! 按照范围“-”、列表“.”或不匹配 “!”等形式匹配指定的字符; 转意符,使元字符失去其特殊的含义。 例:a-d,x,y 匹配字符a、b、c、d、x、y; z* 匹配以字符z开始的任何字符串; x?y 匹配以x开始、以y结束、中间为任何单个字 符的字符串; !Z 匹配不为Z的单个字符。, 元字符作为文件扩展名的使用 例: a-f* 匹配字符a到字符f开头的文件名; abc d2 e3
6、.c f.dat *z 匹配以字符z结尾的任何字符串; win.z core.zz a-c_5z rc?.d匹配以rc开始、以.d结束、中间为任 何单个字符的文件名; rc0.d rc2.d rcS.d *!o 匹配不以o结尾的文件名;,正则表达式 (Regular expression),使用句点匹配单字符 在行首以匹配字符串或字符序列 d 在行尾以$匹配字符串或字符 t r o u b l e $ 使用屏蔽一个特殊字符的含义 * . p a s 使用匹配模式结果出现的次数 patternn 匹配模式出现n次。 匹配字母A出现两次,并以B结尾 A2B patternn, 匹配模式出现最少n次
7、。 patternn,m 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。 A出现2次到4次之间 A 2 , 4 B,正则表达式 (Regular expression),管道和命令表, 管道的概念 管道:是一个命令的标准输出与另一个命令 的标准输入之间的连接,不经过任何中间文件; 管道线:是由管道操作符分隔的一个命令序 列,最简单的管道线是一个简单命令; 管道操作符:用符号“|”表示。 例: who | wc -l ps -ef | grep ftp ls -l,管道和命令表, 命令表的概念 命令表:一串管道线(命令)构成了一个命令表,最简 单的命令表是一个管道线(即一个
8、简单命令)。 管道线(命令)分隔符:分隔命令表元素,确定管道线 执行的条件,含义如下: ;或换行符 :表示按顺序执行管道线; # A=$B B=abc C=OK # echo $A $B $C abc abc OK 当引用一个未设置的变量时,其隐含值为空; # echo $mail is path of mailbox” is path of mailbox,用户自定义变量, 如果用双引号“”将值括起来,则括起来的 字符串允许出现空格、制表符和换行符的特殊字 符,而且允许有变量替换。 例1:# MAIL=/var/mail/fk # var=$MAIL is a path of mailbox
9、 # echo $var /var/mail/fk is a path of mailbox 例2:# str=This is n a book # echo $str This is a book,用户自定义变量, 如果用单引号将值括起来,则括起来的 字符串允许出现空格、制表符和换行符的特殊字 符,但不允许有变量替换。 例1 # BOOK=English book # MSG=$BOOK # echo $MSG $BOOK 例2 # msg= Today is t Sunday # echo $msg Today is Sunday,用户自定义变量, 引用变量的值时,可以用花括号将变量名 称
10、括起来,使变量名称与它的后续字符分隔开, 如果紧跟在变量名称后面的字符是字母、数字或 下划线时,必须要使用花括号。 例: # str=This is a string # echo $strent test of variables This is a stringent test of variables # echo $strent test of variables test of variables,位置变量,位置变量顾名思义是与位置有关的变量,这 是一种特殊的变量。命令行的Shell过程名本身 被指定为位置变量$0,依次参数为$1 . $9 。 例:ls / /bin /etc /u
11、sr/bin /dev $0 $1 $2 $3 $4 $5 例:# cat finduser who | grep $1 # finduser fke,环境变量,Shell执行环境由一系列环境变量组成,这些变 量是由Shell维护和管理的。所有这些变量都可被 用户重新设置,变量名由大写字母或数字组成。 CDPATH :执行cd命令时使用的搜索路径; HOME :用户的home目录; IFS :内部的域分隔符,一般为空格符、制表 符或换行符; MAIL : 指定特定文件(信箱)的路径,供邮件系 统用; PATH :寻找命令或可执行文件的搜索路径; PS1 : 主命令提示符,默认为“$”; PS2
12、 : 从命令提示符,默认为“”; TERM :使用的终端类型。,预定义的特殊变量,在Shell中有一组特殊的变量,其变量名和变量 值只有Shell本身才可以设置。 $# 记录传递给Shell的自变量个数; 例1: # myprog a b c 则 $#的值为3 例2: if test $# -lt 2 then echo “two or more args required” exit fi,预定义的特殊变量, $? 取最近一次命令执行后的退出状态(返回码) :执行成功返回码为0, 执行失 败返回码为1; 例:# test -r my_file (假设my_file文件不可读) # echo
13、$? 1 $ 当前Shell的进程号 ; $! 取最后一个在后台运行的(使用“ exit 1; find . -name $1 -print,条件与 test 命令,例2:带有空格的字符串比较 # month=January # test $month = January # echo $? 1 # test $month = January # echo $? 0 区别:Shell在处理变量时,遇到有双引号将保留其内容,而省略双引号时,将滤去空格。,条件与 test 命令,例3:带有空格的字符串比较 # a=testing string # test $a = testing string
14、# echo $? 0 # test $a = testing string test: unknown operator string Shell处理变量 $a 时,将其进行变量替换,然 后将结果(testing string)传递给test,而test将string作为操作符来处理,因此出错。,条件与 test 命令,例4:带有空串(或未设置的字符串比较) # name= # test $name = smith # echo $? 1 # test $name = smith test: argument expected Shell处理变量$name时,双引号将其括起 的内容作为一个“
15、位置持有者”来保留,并把该 值传递给test,保证处理的正常执行。,条件与 test 命令,例4:带有空串的字符串比较 # blanks= # test $blanks # echo $? 1 # test $blanks # echo $? 0 Shell处理变量$blanks时,将空格滤去,使其 变为空串传递给test;而双引号保留 “位置持有 者”的位置,其值为一个空格(空白符),传递 给test。,条件与 test 命令,例4:带有算符的字符串比较 # symvar= # test -z $symvar test: argument expected 出错的原因是“=”运算符比“-z”
16、运算符的优先级 要高,因此,test 命令期望在等号之后要有一个自变量。 为避免上述问题的发生,可用下面命令形式替换: # test x$symvar = x # echo $? 1,条件与 test 命令, test命令可用于整数比较 首先要搞清楚整数比较的两个概念: Shell并不区分放在Shell变量中的值的类型,就变量本身而言,它存放的仅仅是一组字符串,既Shell只有一种类型的变量串变量。 当使用整数比较操作符时,是test命令来解 释存放在变量中的整数值,而不是Shell。,条件与 test 命令, test 整数测试表达式,条件与 test 命令,例: # x1= 005 # x
17、2= 10 # test $x1 = 5 按串方式比较 # echo $? 1 # test $x1 -eq 5 按数值方式比较 # echo $? 0 # test $x2 -eq 10 # echo $? 0,条件与 test 命令, test 中常用的文件测试表达式,条件与 test 命令,例1:检查指定的文件是否存在并且可读 test -f /usr/fk/message 例2:检查指定的文件是否为目录 test -d /usr/src/local/sendmail 例3:检查指定的出错文件是否为空,如不空 则列出该文件的内容。 test -s $errfile egrep; fgre
18、p) awk sed,GREP家族(grep;egrep;fgrep),文档:Man grep 一般option采用双引号引用:一是以防被误解为 Shell命令,二是可以用来查找多个单词组成的字符串;三是可以调用变量 调用模式匹配时,应使用单引号,GREP 家族(grep ;egrep;fgrep),常用的g r e p选项有: -c 只输出匹配行的计数。 -i 不区分大小写(只适用于单字符)。 -h 查询多文件时不显示文件名。 -l 查询多文件时只输出包含匹配字符的文件名。 -n 显示匹配行及行号。 -s 不显示不存在或无匹配文本的错误信息。 -v 显示不包含匹配文本的所有行。 技巧: 使用
19、g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加 g r e p允许使用国际字符模式匹配或匹配模式的类名形式。 :upper:lower: egrep f workfile,AWK,a w k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。a w k抽取信息后,才能进行其他文本操作。完整的a w k脚本通常用来格式化文本文件中的信息。,AWK,调用awk awk -F field-separator commands input-files - F域分隔符是可选的 awk -f awk-script-file input-files,AWK,任何a w k语句都由模式
20、和动作组成。在一个 a w k脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。 模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段 B E G I N和E N D。 实际动作在大括号 内指明,AWK,在碰到a w k错误时,可相应查找: 确保整个a w k命令用单引号括起来。 确保命令内所有引号成对出现。 确保用花括号括起动作语句,用圆括号括起条件语句。 可能忘记使用花括号,也许你认为没有必要,但 a w k不这样认为,将按之解释语法。,AWK,它们只适用于a w k而不适用于g r e p或s e
21、 d。它们是: + 使用+匹配一个或多个字符。 ? 匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y Z。,条件操作符 1.匹配( ) awk if ($4 /Brown/) print $2 file 2.精确匹配(=) awk if ($4=“Brown”) print $2 file 3.不匹配 (!=) awk if ($4!=“Brown”) print $2 file 4.小于() awk if ($6$7) print $2 file .,AWK,AWK,awk内置变量 A R G C 命令行参数个数 A R G V 命令行参数排列 E N V I R O N 支持队列
22、中系统环境变量的使用 FILENAME a w k浏览的文件名 F N R 浏览文件的记录数 F S 设置输入域分隔符,等价于命令行- F选项 N F 浏览记录的域个数 N R 已读的记录数 O F S 输出域分隔符 O R S 输出记录分隔符 R S 控制记录分隔符,AWK,输入域到域变量名 awk name=$1; belt=$4;if(belt /Brown/) print name file awk if($1=“M.Tansley”) $6=$6-1;print $1,$6,$7 file 创建新的输出域 awk if($1=“M.Tansley”) $8=$7+$6;print $
23、7,$6,$8 file,AWK,awk内置字符串函数 g s u b ( r, s ) 在整个$ 0中用s替代r g s u b ( r, s , t ) 在整个t中用s替代r i n d e x ( s , t ) 返回s中字符串t的第一位置 l e n g t h ( s ) 返回s长度 m a t c h ( s , r ) 测试s是否包含匹配r的字符串 s p l i t ( s , a , f s ) 在f s上将s分成序列a s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p s u b ( r, s ) 用$ 0中最左边最长的子串代
24、替s s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分 s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分,AWK,Awk脚本(*.awk) #!/usr/bin/awk-f # #this is the demo for awk script ususages!# # BEGIN print # print This is the awk script example! print # if($1/Tansley/) $8=$6+$7; $5=$5+1; print $1,$2,$3,$4,$5,$6,$8 END pri
25、nt # print this is end of awk script print #,Sed,s e d是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。 标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。 使用s e d需要记住的一个重要事实是,无论命令是什么, s e d并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。,Sed,使用s e d命令行格式为: sed 选项 s e d命令 输入文件。 使用s e d脚本文件,格式为: sed 选项 -f sed脚本文件 输入文件,Sed,sed编辑命令
26、 p 打印匹配行 = 显示文件行号 a 在定位行号后附加新文本信息 i 在定位行号后插入新文本信息 d 删除定位行 c 用新文本替换定位文本 s 使用替换模式替换相应模式 r 从另一个文件中读文本 w 写文本到一个文件 q 第一个模式匹配完成后推出或立即推出 l 显示与八进制A S C I I代码等价的控制字符 在定位行执行的命令组 n 从另一个文件中读文本下一行,并附加在下一行 g 将模式2粘贴到/pattern n/ y 传送字符 n 延续到下一输入行;允许跨行的模式匹配语句,Sed,基本sed编程 sed n 2p input-file sed n /abc/p input-file (
27、匹配),if 结构, if 的简单结构 格式 if command1 then command2 command3 fi,if 结构, if 的完整结构 格式 if command1 then command2 command3 else command4 command5 fi,if 结构, if 的连用结构 格式1 if command1 then commands else if command2 then commands : : fi fi,if 结构, if 的连用结构 格式2 if command1 then commands elif command2 then command
28、s : : commands else commands fi,case 结构,格式 case value in pattern1) command11 command1n; pattern2) command21 command2n; patternn) commandn1 commandnn; esac,for 结构,格式 for variable in arg1 arg2 argn do command command done,while 结构,格式 while command do command command done,until 结构,格式 until command do c
29、ommand command done,循环体中其它命令, break 命令 break是Shell的内部命令,用于在循环体中根据命令运行的返回条件,直接终止循环体内命令的执行。 当执行break命令时,控制流从循环体中转移 到done之后的第一条命令上。,循环体中其它命令, continue 命令 continue是Shell的内部命令,用于在循环体中 根据命令运行的返回条件,直接进入下一次循环 命令的执行。 当执行continue命令时,控制流直接转到本循 环体中第一条命令上。,函数的定义和使用,函数格式 FunctionName( ) command : : command ,函数的定义
30、和使用,例: # The test codes for function definition GetYesOrNo() while echo “$*(Y/N)? c” esac done 执行 # GetYesOrNo “Do you wish to continue” | exit 显示 Do you wish to continue(Y/ N)?,Shell的运行环境,局部变量 全局变量 局部变量和全局变量作用域 程序调试 Shell程序的应用,局部变量,在某一局部特定环境下使用的变量 。 注册Shell在接受到用户输入的命令(非内部 命令)后,通常派生出一个子Shell,由此子Shel
31、l 负责解释执行该命令。 子Shell有自己的运行环境和变量,这些变量 仅在子Shell的范围内的特定环境下才能使用。 子Shell不能存取由父Shell设置的局部变量,也不能改变父Shell的变量值。,局部变量,例1: # cat vartest1 echo :$x: # x=100 # vartest1 : 例2: # cat vartest2 x=60 echo :$x: # x=10 # vartest2 :60: # echo $x 10,全局变量,全局变量是一种特殊的变量,可以被任何运行 的子Shell来引用。全局变量通过export命令来定 义,格式如下: export vari
32、ables 其中 variables 是要变成全局变量的变量表名。 一旦变量被定义为全局变量,则对于以后的 所有子Shell来说这些都是全局变量; 子Shell中无法改变全局变量的值; 若在子Shell中改变全局变量的值,实际是对 全局变量的副本进行更改,不影响全局变量值; 子Shell中局部变量的使用优先于全局变量。,全局变量,例: # export g_var # g _var=GLOBAL # cat test_var export g_var l_var g_var=sub_shell:g_var l_var=sub_shell:l_var echo $g_var $l_var # t
33、est_var sub_shell:g_var sub_shell:l_var # echo $g_var :$l_var: GLOBAL : #,局部变量和全局变量作用域, 任何没有用export命令定义过的变量是局部变 量,子Shell不能存取父Shell的局部变量; 子Shell中可以存取和修改父Shell的全局变量, 但这种修改对于父Shell全局变量没有任何影响; 在子Shell中用export命令定义的全局变量和对 此变量的修改对父Shell变量没有影响; 全局变量保持它的全局性,不仅能直接传递给 它的子Shell,而且子Shell还能将它传递给子Shell 的子Shell; 在对
34、变量赋值之前和之后的任何时候可以将该 变量转换成全局变量。,程序调试,Shell提供了多种工具以便在调试Shell程序时 使用,这些工具允许观察一个Shell程序的执行。 常用的测试方式有: Shell程序的详细跟踪; Shell程序的跟踪执行;,程序调试, Shell程序的详细跟踪 Shell提供的详细跟踪特性允许用户观察一个 Shell程序的读入和执行,如果在读入命令行时发 现语法错误,则终止程序的执行。命令行被读入 后,Shell按读入时的形式在标准错误输出中显示 该命令行,然后执行命令行。详细跟踪Shell程序 的执行有两种方式: 整个程序的详细跟踪和局部程序的详细跟踪。,程序调试, 整个程序的跟踪执行 格式 sh -v shprog 用来实现对整个文件的脚本进行跟踪。 局部程序的跟踪执行 格式 set -v 设置跟踪标志 set +v 关闭跟踪标志 用来实现对文件中的部分脚本进行跟踪。,程序调试,例: # cat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能场地规划技术创新-洞察与解读
- 公共服务精准化-洞察与解读
- 国际市场中品牌认知度提升策略-洞察与解读
- 信号传输抗干扰-洞察与解读
- CLV预测模型优化-第1篇-洞察与解读
- 2026年云南水利水电职业学院单招职业倾向性测试题库带答案详解(b卷)
- 计算机技术支持中心实习生实习报告
- 电子工程互联网企业硬件工程师实习报告
- 电子工程科技公司研发助理实习报告
- 人力资源管理人才咨询公司人才顾问实习报告
- 现在完成时复习课课件+2025-2026学年外研版八年级英语下册
- 2025至2030中国智能语音助手用户接受度与隐私保护研究报告
- 齐成控股集团招聘笔试题库2026
- 菏泽医专综评试题及答案
- 2026年交管12123驾照学法减分题库(考试直接用)
- 国企投融资课件
- 全国项目管理标准体系建设指南(2025版)
- 三级安全培训再教育课件
- 电子物料基础知识培训课件
- 全屋家具定制合同范本
- 2025年年度社区工作总结
评论
0/150
提交评论