配色: 字号:
第7章 shell程序设计
2022-06-17 | 阅:  转:  |  分享 
  
第7章shell程序设计本章的学习目标:了解Shell的地位和作用、Shell各主要版本熟练掌握shell脚本的建立与执行方法掌握she
ll的变量及特殊字符掌握shell的输入输出命令掌握常用shell程序逻辑结构语句7.1Shell概述7.1.1Shell
简介Shell的功能它接收用户键入的命令,进行分析,创建子进程,由子进程实现命令所规定的功能,等子进程终止后,发出提示符。另一个是
作为命令解释程序,是高级程序设计语言。Shell程序简介shell程序,是需要进行编写内容,来存放到文件中,由系统解释执行此文件
来得到需要的结果。此文件通常也称为shell脚本(script)。Shell程序可以简单地理解成DOS/Windows下的批处
理,shell编程有很多的C语言和其他编程语言的特性。7.1Shell概述7.1.1Shell简介Shell的主要版本Bo
urneShell是AT&TBell实验室的StephenBourne为AT&T的UNIX开发的,它是其他Shell的开发
基础,也是各种UNIX系统上最常用、最基本的shell。C-shell是加州伯克利大学的BillJoy为BSDUNIX开发的,
它与sh不同,主要模拟C语言。Kornshell是AT&T实验室的DavidKorn开发的,它与sh兼容,但功能更强大。Bas
h是Linux系统中使用的主流Shell,它是BourneAgainSHell的缩写,Bash是由Bourneshell发展
而来的。7.1Shell概述7.1.2Shell脚本的建立与执行创建一个shell程序#!这是一个规定的符号,指明使用
的是哪一种shell。echo向屏幕输出一串字符。#!/bin/bash和#!/bin/sh都比较常见。使用#进行单行注释
:<.2Shell脚本的建立与执行shell脚本的执行sh脚本名改执行权限后直接执行方式#chmoda+xt
est#./test当成Shell命令直接执行#cptest/usr/bin#test练习编写一个Shel
l程序,运行脚本输出以下信息:MynameisXXX.Rosewasnotbulitinaday.7.2Sh
ell的变量环境变量程序运行时根据需要设置参数判断和命令返回值判断时使用内部变量变量类型用户变量在用户编程过程中使用7.2Sh
ell的变量当Shell程序启动时,都自动设置一组变量,这组变量就是环境变量。全局环境变量在/etc/profile文件中设置;用
户环境变量在用户家目录下的.bash_profile或.bashrc文件中设置常用的环境变量:PATH,HOME,SHELL定义新
的环境变量:1)执行export命令(重启后失效)2)修改.bash_profile文件->export变量->sou
rce.bash_profile7.2.1shell环境变量7.2Shell的变量7.2.2shell内部变量2、内
部变量$所有命令行参数的值$#命令行参数的总数$$当前进程的进程ID(PID)$?最后执行的一条命令的退出状态,返回值为0则成功
,非0则失败$!在后台运行的最后一个进程的进程ID$0,$1,$2,…,$9十个位置参数7.2.2shell内部变量使用vim编
辑器编写如下脚本:7.2.2shell内部变量7.2.3Shell的用户自定义变量含义:用户自定义变量在shell脚本中使用
,它们拥有临时的存储空间,在shell编程语言中无须声明和初始化shell变量,一个未初始化的shell变量,其默认的初始化值为
空字符串。命名:用户定义的shell变量名是由字母或下线符打头的字母、数字和下线符序列,并且大小写字母意义不同。这与C语言中标识
符的定义相同。格式:变量名=值或字符串使用变量:在程序中使用变量值时,要在变量名前面加上一个符号“$”。这个符号告诉shell,要
取出其后变量的值。$变量名7.2.2Shell的用户自定义变量说明:(1)字符串赋值,这是最常见的形式。(2)如果在赋
给变量的值中要含有空格、制表符或换行符,那么就应该用双引号把这个字符串括起来。(3)在一个赋值语句中可以出现多个赋值,变量赋值
可以迭代进行。但必须注意,各赋值动作是从右向左实现的。(4)变量值可以作为某个长字符串中的一部分。如果它在长字符串的末尾,就可以
利用直接引用形式。例如:变量名出现一个长字符串开头或中间,应该用“{}”把变量名括起来。7.3shell中的特殊字符特殊字
符有着重要的作用。包括:通配符引号命令执行顺序操作符注释符、反斜线及后台操作符在使用时应注意它们表示的意义和作用范围。7.3.
1Shell的通配符星号():它匹配任意一个字符串。注意:文件名前面的圆点(.)和路径名中的斜线(/)不能匹配。问号(?
):它匹配任意一个字符。一对方括号([]):方括号中有一个字符组。其作用是匹配该字符组所限定的任何一个字符。例如:f[a-
d]与f[abed]作用相同。感叹号(!):表示不在一对方括号中所列出的字符。例如:f[!a-d].c通配符作用:在一个表
达式中,也可以同时使用上述符号,来提高工作效率。7.3.2Shell的引号双引号(“”):由双引号括起来的字符,除$、倒引
号和反斜线(\)仍保留其特殊功能外,其余字符通常作为普通字符对待。实例如下:$echo"Mycurrentdirecto
ryis`pwd`"Mycurrentdirectoryis/home/a$echo"Myhome
thedirectoryis$HOME"Myhomethedirectoryis/home/a单引号(‘’):
由单引号括起来的所有字符或字符串都作为普通字符出现。实例如下:$echo''Mydiris`pwd`andthef
ileis$HOME''Mydiris`pwd`andthefileis$HOME7.3.2Shell
的引号倒引号(``):倒引号括起来的字符串被shell解释为命令行。有以下几种方式:(1)shell解释执行,实例如下:$e
chocurrentdirectoryis`pwd`(2)利用倒引号的shell解释功能可以进行命令替换,即把倒引号中
的命令的结果赋给指定变量。实例如下:$mypath=`pwd`$echoMydirectoryis$mypat
hMydirectoryis/home/a(3)倒引号的嵌套应用:倒引号的嵌套时必须在内层的一组倒引号用反斜线(\)
进行转义。实例如下:$mypath=`echoMydirectoryis\`pwd\``$echo$myp
athMydirectoryis/home/a7.3.3Shell的命令执行顺序操作符顺序执行顺序分隔符(;):
多条命令可以在多行中键入,也可将这些命令在一行中输入,但各条命令应以分号(;)隔开,例如:$cd/home/a;ls–
l;cata.txt管道线(|):也是顺序执行,例如:$who|wc–l|writeusername17.
3.3Shell的命令执行顺序操作符逻辑与(&&)含义:可把两个或两个以上命令联系在一起,格式如下:#command1&
&command2功能:先运行command1,如果运行成功,才运行command2;否则,若command1运行不成功,则
不运行command2。实例:$cptest1/home/a&&cat/home/a/test1实例含义:如果成功拷
贝到要求路径,查看test1的内容。应该注意,命令执行成功,其返回值为0;若执行不成功,则返回非0值。7.3.3Shell的
命令执行顺序操作符逻辑或(||):含义:逻辑或操作符“||”可把两个或两个以上命令联系起来。格式:#command1||c
ommand2功能:先运行command1,如果运行不成功,则运行command2;否则,若commandl运行成功,则不运
行command2。实例:$cptest1/home/a||ls–l实例说明:如果没有成功拷贝到要求路径,则查看当
前路径内容。7.3.4Shell中的注释符、反斜线注释符(#)反斜线(\)转义符,它能把特殊字符变成普通字符。例如:ec
ho"FilenameisNo\$\n1"还作为续行符使用。如果把它放在一行的回车换行之前那么表示下一行接续此行,与下一
行被视为同一行,可用于表示长的输入行。后台操作符(&)7.4shell编程中的输入输出命令shell中输入输出的标准文件
每个进程运行时自动打开三个文件,这些文件称为命令的标准文件,分别用于命令读取输入、输出结果以及输出错误消息,即标准输入文件(st
din)标准输出文件(stdout)标准错误输出文件(stderr)shell的输入输出重定向命令<>>>2>7.4
shell编程中的输入输出命令输入重定向命令command>output-file输出附加定向命令command>>output-file标准错误重定向命令command
2>error-file7.4Shell编程中的输入输出命令read命令用read命令由标准输入读取数据,然后赋给指定
的变量。格式:read变量1[变量2]……echo命令echo命令是将其后的参数输出。最好用双引号把所有参数括起来,
这样不仅易读并且能使shell对它们进行正确的解释。练习2:编写一个可交互的小程序:提示用户输入姓名,然后显示用户的名字。7.5
数组运算符数组定义:BashShell只支持一维数组,初始化时不需要定义数组大小数组元素的下标由0开始Shell数组
用括号来表示,元素用"空格"符号分割7.5数组运算符读取数组中的元素:${数组名[下标]}读取整个数组:${数组名[]}
${数组名[@]}7.5数组运算符Shell默认将变量作为字符串类型进行处理需要进行数学计算的场景,怎么办?使用let
命令进行数学运算,计算时不用加$使用[]执行基本的算数运算,[]前需要加$7.5数组运算符7.5数组运
算符运算符解释()[]括号!~++--+-取反,按位取反,自增,自减,正负号+-/%加,
减,乘,除,取模<<>>左移,右移<<=>=>小于,小于等于,大于等于,大于==!=等于,不等于&^|与,异或
,或&&||逻辑与,逻辑或?:条件=+=-==/=&=^=|=<<=>>=赋值,逗号7
.6.1Shell选择结构命令格式:test表达式或[表达式]命令功能:用来判断表达式的结果。作用:进行数值、
字符和文件三种类型的测试用来判断表达式的返回值如果表达式为真,返回值为0(TRUE)如果表达式为假,返回值为1(FALSE)i
f语句格式3格式2格式1if[条件1]then命令elif[条件2]then命令else命令fiif[
条件]then命令else命令fiif[条件]then命令fi双分支多分支单分支if语句if语句进行数值、字
符和文件三种类型的测试[]中条件表达式两边与括号之间,if与括号间都要有空格if…then语句如果放在同一行,条件语句后必
须要有分号;不推荐if[$a–gt$b];thenif语句——数值比较参数说明-eq(equal
to)等于则为真-ne(notequalto)不等于则为真-gt(greaterthan)大于则为真-ge(gr
eaterorequal)大于等于则为真-lt(lessthan)小于则为真-le(lessorequal)小于等于
则为真示例:输入两个数比较大小if语句——字符比较参数说明=等于则为真!=不相等则为真-z字符串字符串的长度
为零则为真-n字符串字符串的长度不为零则为真示例:检查输入的字符串是否为空。if语句——文件测试参数说明-e文件
名如果文件存在则为真-r文件名如果文件存在且可读则为真-w文件名如果文件存在且可写则为真-x文件名如果文件存在且可执行则为真
-s文件名如果文件存在且至少有一个字符则为真-d文件名如果文件存在且为目录则为真-f文件名如果文件存在且为普通文件则为真-c
文件名如果文件存在且为字符型特殊文件则为真-b文件名如果文件存在且为块特殊文件则为真if语句——文件测试练习:请判断/tm
p/mylog.txt是否存在,如果存在,将用户输入的一串字符,写入到此文件中,如果不存在,则创建文件后写入。Shell流程控制
——逻辑连接操作Shell中的逻辑连接操作符:与(-a)、或(-o)、非(!)优先级:“!”>“-a”>
"-o"编写shell脚本,判断/etc目录下是否同时存在hostname与hosts文件,并输出结果。条件结构——case语
句说明:取值可以为变量或常量执行完匹配模式的命令后不再继续其他模式如无匹配模式,可以使用号捕获该值,进行处理格式case值i
n模式1) command1 …… commandN;;模式2) command1 …… commandN;;
) command1 …… commandN;;esac条件结构——case语句模式字符串中可以使用通配符:?[]
[!]当一个模式字符串中包含多个模式时,可以使用“|”隔开,表示“或”的关系case的各模式之间不应重复出现7.6.2Sh
ell循环结构格式循环in列表中的值执行命令in列表可以由命令生成正则表达式由命令生成脚本参数列表字符串文件名数组f
orvarinitem1item2...itemNdocommand1...commandNdonefo
r语句示例for语句示例3:输入一个数n,求从1到该数的和C语言风格格式for((初始化表达式;条件判断表达式;控制表达式
))docommand1...commandNdoneShell循环结构——whileuntil语句until格
式无限循环格式while格式untilconditiondocommandsdonewhile:docomma
ndsdonewhileconditiondocommandsdonewhile:当判断条件为真时执行循环until:当判断条件为真时停止循环Shell循环结构——whileuntil语句练习:输入n,编程求1+2+……+n的和Shell循环结构——breakcontinueexit跳出循环,不再执行循环语句breakcontinueexit直接退出程序区别跳出本次循环,开始下一次循环处理Shell循环结构——breakcontinueexitbreak命令可以从循环体中退出来。continue命令跳过循环体中它后面的语句,回到本层的开头,进行下一次循环。7.6.3Shell函数格式[function]funname[()]{action[returnint]}说明:[]中为可选项定义:functionfun()或fun()不带任何参数return可返回参数,如果没有return将以最后一条命令运行结果,作为返回值示例:循环输出函数的入参值函数定义函数调用
献花(0)
+1
(本文系太好学原创)