《linux基础及应用》第08章 shell编程.docx
- 文档编号:12263529
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:35
- 大小:32.05KB
《linux基础及应用》第08章 shell编程.docx
《《linux基础及应用》第08章 shell编程.docx》由会员分享,可在线阅读,更多相关《《linux基础及应用》第08章 shell编程.docx(35页珍藏版)》请在冰豆网上搜索。
《linux基础及应用》第08章shell编程
幻灯片1
第八章shell编程
作为系统管理员经常需要编写一些配置文件和shell脚本文件以提高系统管理的效率,例如,成批地添加、删除用户,对系统中的文本文件进行简单处理等;作为嵌入式系统软件开发者或C程序员为了编译与调试原程序也需要编写shell脚本程序。
幻灯片2
8Shell程序设计
●Shell程序设计就是根据程序设计的三种基本结构和shell程序的语法规则来编写shell脚本程序。
8.1Shell程序的基本结构
●Shell程序是由语句构成的,语句可以是Shell命令,如echo命令显示字符串或变量的内容、clear命令清除屏幕等;
●也可以是各种流程控制语句,如test测试语句、if条件分支语句、while或until或for循环语句等;
●还可以是注释语句。
幻灯片3
●除了系统提供的一些变量外,用户在Shell程序中可以根据需要自己定义变量或函数,以提高程序的复用性和可读性;
●与其他程序设计语言类似,shell程序也有顺序、分支、循环三种典型的基本结构;但shell程序是解释执行的。
幻灯片4
●注释方法:
从“#”字符后到行尾的内容均为注释内容,Shell程序在执行过程中将忽略所有注释内容。
●“#”字符出现在引号之类或别的有特殊意义的地方,它就不是注释内容的标记符。
建议将注释内容单独占一行或若干行Tab)为“#”字符。
●由于Shell和CShell在许多方面有差异,为使你的Shell程序既适合于标准Shell又适合于CShell用户,你的Shell程序的第一行最好为:
●#!
/bin/sh–
幻灯片5
Shell程序示例:
#!
/bin/sh–
iftest$1–gt12
then
echo“Argumenttoobig!
”
exit
else
i=$1
j=1
whiletest$i–ne0
do
j=`expr$j\*$i`
i=`expr$i–1`
done
echo$j
fi
幻灯片6
8.2Shell程序的编辑与运行
●编辑
●编辑Shell源程序可使用Linux下任意一种文本编辑器
●字符界面下常用vi编辑程序,图形界面下常用gedit编辑程序
●在Linux系统中还有许多种其他种类的编辑软件,你可以根据自己的喜好来选择使用。
幻灯片7
●运行:
设文件prog是Shell程序,并存在当前目录下。
●第一种方法
采用启动Shell的sh命令。
●#shprog
●第二种方法
修改文件的可执行权限。
在当前目录下键入./prog回车即可执行。
●第三种方法
修改文件的可执行权限。
把当前目录(即prog所在的目录)添加到搜索路径中(.bash_profile文件)。
●在任意目录下键入prog回车即可执行。
幻灯片8
8.3Shell命令的构成
●shell程序语句可以是Shell命令,而命令可以分为简单命令、命令和命令清单。
它们既可在命令行方式下从键盘输入又可在shell程序中。
●1.简单命令
●单个可执行文件的名称和参数,在这种命令中可以使用输入、输出的重定向功能。
幻灯片9
8.3Shell命令的构成
●2.命令
●由简单命令和shell控制命令组合而成。
●命令实际上是将简单命令用某种方式将输入、输出连接起来,大多数情况是使用管道。
●这种命令的返回码是管道中最后一个被执行的简单命令的返回码。
●参考示例:
●[root@localhostroot]#ls|wc–l
幻灯片10
3.命令清单
由分号(;)、与号(&)、and-if(&&)号、or-if(||)号分隔的一个或多个命令列表。
(1)分号分隔的各个命令
shell将按先后顺序执行。
这种有先后顺序的执行方式称为异步执行方式。
幻灯片11
(2)shell将与号(&)前面的那条命令在后台执行。
由于与号前后的命令是同时被执行的,这种执行方式也称为同步执行方式。
参考示例:
#find/-name“test”>findout
则可以:
[root@localhostroot]#Ctrl-z
[root@localhostroot]#bg
上述作业控制等价于:
#find/-name“test”>findout&
幻灯片12
●(3)&&号的语法格式
●命令1&&命令2&&…&&命令n
●首先执行第一个命令,如果该命令成功执行,返回值为0,转而执行第二条命令,依此类推。
●如果某条命令执行失败,则后面命令就不执行了。
最后的状态由最后一条被执行命令的退出状态决定。
可用if语句条件为“真”的嵌套来实现。
幻灯片13
●||号的语法格式
命令1||命令2||…||命令n
●首先执行第一个命令。
如果该命令执行不成功,那么转而执行第二条命令,依此类推。
●如果某条命令执行成功,则后面的命令也就不执行了。
最后的状态也是最后一条被执行命令的退出状态。
可用if语句条件为“假”的嵌套来实现。
幻灯片14
8.4变量
对于任何程序设计语言来说,变量都是非常重要的。
例如、程序设计语言必须提供流程控制语句,而流程控制语句不但需要对变量的值进行判断,而且还需要对变量进行操作。
幻灯片15
8.4.1用户变量与赋值
●shell程序,可将任何无空格字符串作为用户变量,而不必预先声明就可用等号对用户变量赋值。
●使用格式:
变量名=value
●注意两点(bash下)
●在等号前后均不能有空格。
●当需要将一个包含空格的字符串赋给用户变量时,应用单引号将该字符串括起来。
幻灯片16
●参考示例:
OS=Linux
Programmer=‘zhangxiaojin’
Number=15
●shell用户变量不需要预先声明(类型定义),对用户变量既可以赋字符、字符串也可以赋数值。
●赋值后,如果想改变用户变量的值,则只要再赋值一次即可;
●把变量变成只读变量,用readonly命令修改。
●例如:
readonlyOS
●则OS用户变量变成只读了。
幻灯片17
●一些用户变量的值可能与运行该程序的环境相关,程序设计者不可能预先给它赋值。
●为解决这类问题,shell提供了另外两种赋值方式
●第一种方法:
从标准输入设备读入用户变量的值。
由read命令来实现的。
具体用法为:
●read用户变量名
●当shell程序执行到该行时,将等待用户从键盘输入,当用户按下回车键时shell把你输入的内容赋给用户变量。
幻灯片18
●第二种方法,将一个命令执行后输出的内容赋给指定的变量。
●具体用法为:
用户变量=`命令`
●该语句将首先执行反向单引号之间的命令,然后将其执行后输出的内容赋给该用户变量,在这种赋值方式中,等号前后同样不能有空格,而且必须用反向单引号(即重音号)把命令括起来。
幻灯片19
8.4.2引用变量与echo命令
●变量引用方法
●变量前加“$”符号就意味着是引用变量
●echo命令
●用法:
echo[–ne][“显示的信息”或$变量]
●作用:
在屏幕上显示字符、字符串或变量内容
幻灯片20
命令选项
选项含义
-n
显示后并不自动换行。
-e
若字符串中出现以下字符,则特别处理,不将它当一般文字输出。
\a发出警告声。
\b删除前一个字符。
\c最后不加上换行符号。
\f换行但光标仍停留在原来的位置。
\n换行且光标移至行首。
\r光标移至行首,但不换行。
\t插入tab。
\\插入\字符。
\nnn插入nnn(八进制)所代表的ASCII字符
幻灯片21
8.4.3环境变量与设置
●系统安装完成后,/etc目录下系统会自动创建一个profile文件,该文件说明了系统环境变量配置情况
●创建新用户账户时,系统也会在该用户的起始目录中自动创建一个.bash_profile隐含文件(默认采用bash时),该文件说明了用户个人的环境变量配置情况。
●在login进程完成登录检查、启动shell时,从这两个文件中读取系统环境变量和用户个人环境变量的配置信息。
幻灯片22
●在bash下,环境变量的赋值设置也是用等号,且规则同用户变量。
●但是有些环境变量的赋值是需要技巧的。
例如,要把/root/xj目录临时添加到搜索路径中(若不修改配置文件),应该怎么做?
●PATH=/root/xj
●PATH=“$PATH:
/root/xj”
幻灯片23
8.4.4位置变量与相关命令
●位置变量:
用于存放那些传递给命令行上shell程序或shell脚本函数的参数。
●位置变量是数字0到9,shell将命令行中参数依次赋给变量1、2、…、9,命令(程序)名赋给变量0。
●用户不能简单地用等号给它们赋值,但可以用set命令来赋值。
●设某个shell程序名为test,执行带3个参数,则shell解释执行时位置变量0的内容为test,位置变量1的内容为参数1,依此类推。
幻灯片24
●shift命令
●功能:
移动命令参数的位置,但不改变位置变量0的值。
●命令用法
●shift[n]
●注意:
n为非负整数且小等于命令行参数个数,它表示移动的位数。
如果不指定n的值,则系统默认n为1。
幻灯片25
●设编写的程序名为testshift,程序内容为:
echo$1$2$3
shift
echo$1$2$3
shift
echo$1$2$3
●[root@localhostroot]#testshiftXYZ
●显示结果为:
XYZ
YZ
Z
幻灯片26
●set命令
●功能:
显示变量及其值、设置或还原shell的属性、设置位置变量的值。
●命令用法
set[-option][arg…]
●option为命令选项、arg…为参数列表。
●如果不带任何选项或参数,则显示目前系统中所有变量名称和变量值;
●如果指定命令选项,则可以设置或还原shell的属性。
●此处仅介绍位置变量的值。
幻灯片27
●设编写的程序名为testset,程序内容为:
echo$1$2$3
setXYZ
echo$1$2$3
●root@localhostroot]#testsetxyz
●显示结果为:
xyz
XYZ
幻灯片28
8.4.5其他shell变量
●#变量
●作用:
存放传递给shell程序命令行参数的个数
●设编写程序名为testpar_num,程序内容为:
echo$#
●[root@localhostroot]#testpar_numxyz
●显示结果为:
3
表示输入的命令行参数是3个。
幻灯片29
●?
变量
●作用:
存放shell程序中最后一条命令的返回码。
●Linux系统中,每条命令执行完后都会返回一个值,这个值称为返回码。
执行成功时返回0,执行不成功返回非0的值。
●程序testset修改为:
echo$1$2$3
echo$?
显示结果为:
xyz
0
幻灯片30
●*(或@)变量
●作用:
存放所有输入的命令行参数,并且每个参数之间用空格分隔。
●程序testpar_num修改为:
echo$#
echo$*
●执行testpar_numxyz后显示:
3
xyz
幻灯片31
8.5shell特殊字符屏蔽
●特殊字符屏蔽:
Shell中有些特殊字符具有特殊的含义,当这些字符要作为一般字符使用时,要让shell知道以便不再解释成特殊字符使用。
●常用屏蔽形式:
‘’、“”、和\
●单引号:
一对单引号中的所有内容被原样输出
●c_path=’Thecurrentpathis$PATH’
●#echo$c_path
●显示为:
Thecurrentpathis$PATH
幻灯片32
●“”(双引号)
●c_path=”Thecurrentpathis$PATH”
●echo$c_path
●Thecurrentpathis/usr/local/sbin:
/usr/local/bin:
/sbin:
/bin:
/usr/sbin:
/usr/bin:
/usr/X11R6/bin
幻灯片33
●\(反斜杠)
●参考示例1:
设有三个变量A、B和C,分别对A、B变量赋值后再做乘法运算,结果保存在变量C中并显示。
●实现的程序语句为:
A=4
B=5
C=`expr$A\*$B`
echo$C
幻灯片34
8.6流程控制语句
Shell的流程控制语句与C语言的流程控制语句非常类似,熟悉C语言的读者只要注意它们的具体语法区别就可以了。
由于shell的种类很多,如果选择不同的shell,则语法的格式是不同的,即在某种shell下编写的程序即使没有任何语法错误也可能在另一种shell环境下是无法执行的。
在具体介绍语法时,用粗体字表示关键字,斜体字表示具体的语句实体。
幻灯片35
8.6.1逻辑表达式与test语句
●逻辑表达式就是由逻辑运算符连接简单表达式组成的运算式。
●在shell中,-a、-o和!
分别表示逻辑的与、或、非运算。
●系统默优先级为:
非运算最高、与运算次之,或运算最低。
●可用圆括号改变运算的顺序,但圆括号属于特殊字符,使用中要在其前面加转义字符“\”。
幻灯片36
1.test语句
●shell命令或程序执行后都会有一个返回码,果执行成功返回码为0;不成功则返回码为非0零。
test语句是shell程序设计中测试表达式或逻辑表达式最常用的语句。
●命令用法
●testexpression或
●[expression]
●方法一必须显式指定test语句关键字;方法二采用对方括号对代替test语句,但表达式前后与方括号之间必须要有空格。
●测试结果为真,返回码为0;否则为非0。
●test语句也常用于程序调试过程中检查运行结果。
幻灯片37
2.运算符组成的表达式及说明
●字符串比较运算符:
用于判定字符串长度是否为0或两个字符串是否相等。
运算符用法
说明
String1=String2
String1与String2相等,表达式为真,否则为假
String1!
=String2
String1与String2不等,表达式为真,否则为假
String
String为空,表达式为真,否则为假。
-nString
String长度为非0,表达式为真,否则为假。
-zString
String长度为0,表达式为真,否则为假。
幻灯片38
2.运算符组成的表达式及说明
●整数比较运算符:
比较两个整数的大小。
运算符用法
说明
Num1–eqNum2
Num1与Num2相等,表达式为真,否则为假。
Num1–neNum2
Num1与Num2不等,表达式为真,否则为假。
Num1–gtNum2
Num1大于Num2,表达式为真,否则为假。
Num1–geNum2
Num1大等于Num2,表达式为真,否则为假。
Num1–ltNum2
Num1小于Num2,表达式为真,否则为假。
Num1–leNum2
Num1小等于Num2,表达式为真,否则为假。
幻灯片39
2.运算符组成的表达式及说明
●文件属性判定运算符:
用于判定文件是否存在或文件的类型。
运算符用法
说明
-bfname
如果文件fname存在且为块设备,表达式为真,否则为假。
-cfname
如果文件fname存在且为字符设备,表达式为真,否则为假。
-dfname
如果文件fname是一个目录,表达式为真,否则为假。
-efname
如果文件fname存在,表达式为真,否则为假。
-ffname
如果文件fname存在且为普通文件,表达式为真,否则为假。
-hfname或
-Lfname
如果文件fname存在且为一个符号链接文件,表达式为真,否则为假。
-pfname
如果文件fname存在且为命名的管道文件,表达式为真,否则为假。
-sfname
如果文件fname存在且长度不为0,表达式为真,否则为假。
-rfname
如果文件fname存在且为可读的,表达式为真,否则为假。
-wfname
如果文件fname存在且为可写的,表达式为真,否则为假。
-xfname
如果文件fname存在且为可执行的,表达式为真,否则为假。
幻灯片40
2.运算符组成的表达式及说明
●逻辑运算符
运算符用法
说明
!
Expr
Expr为假,逻辑表达式为真,否则为假。
Expr1–aExpr2
Expr1和Expr2同时为真,逻辑表达式为真,否则为假。
Expr1–oExpr2
Expr1或Expr2有一个为真,逻辑表达式为真,否则为假。
幻灯片41
3.运算符用法的注意点
●运算符前后必须要有一个空格。
●shell变量值作为字符串String的值,当变量的值中包含有空格字符时,需要给$变量加上双引号,因为shell在处理变量时,遇有双引号将保留其内容,而省略双引号时将过滤掉空格。
一般使用shell变量值时建议对$变量都加上双引号。
幻灯片42
8.6.2if分支语句
●if分支语句执行时,先用test语句测试表达式或逻辑表达式的值并根据测试的结果决定下一步要执行的命令。
●1.语法格式
if分支语句有三种格式,每种格式又有多种等价的写法。
幻灯片43
●第一种是简单格式:
if(testexpression)then
commands
fi
或写为:
if[expression];then
commands
fi
或写为:
if[expression]
then
commands
fi
幻灯片44
●说明:
●expression一般是表达式或逻辑表达式,如果是命令或命令组合的返回码不必用test语句。
●圆括号可以省略,但在expression后要加上分号。
●如果then不换行,则方括号后的分号“;”不能省略也不能用空格代替,否则then必须换行。
●commands是要执行的命令列表。
●if语句的结束一定要有结束标志fi,它是if的倒写。
幻灯片45
第二种是完整格式:
if(testexpression)then
commands_true
else
commands_false
fi
或写为:
if[expression];then
commands_true
else
commands_false
fi
或写为:
if[expression]
then
commands_true
else
commands_false
fi
幻灯片46
第三种是连用(嵌套)格式:
if(testexpression1)then
commands1
elif(testexpression2)then
commands2
else
commands3
fi
或写为:
if[expression1];then
commands1
elif[expression2];then
commands2
else
commands3
fi
幻灯片47
或写为:
if[expression1]
then
commands1
elif[expression2]
then
commands2
else
commands3
fi
幻灯片48
●参考示例1
编写一个名为iffile程序,它执行时判断/bin目录下date文件是否存在?
程序代码:
#!
/bin/sh-
fname=/bin/date
if(test–f“$fname”)then
echo“exist”
fi
幻灯片49
●参考示例2
编写一个名为greet的问候程序,它执行时能根据系统当前的时间向用户输出问候信息。
设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。
●程序代码:
#!
/bin/sh-
hour=`date|cut–c10-11`
iftest“$hour”–ge0–a“$hour”–le11;then
echo“Goodmorning!
”
eliftest“$hour”–ge12–a“$hour”–le17;then
echo“Goodafternoon!
”
else
echo“Goodevening!
”
fi
幻灯片50
●参考示例3:
编写一个名为ifuser的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系统中登录,并给出相关信息。
#!
/bin/sh-
iftest$#-ne1then
echo"Incorrectnumberofarguments"
echo"Usage:
ifuserusername"
else
user=$1
ifwho|grep–q$user;then
echo$1"userisloggedon."
exit0
else
echo$1"userisnotloggedon."
exit1
fi
fi
幻灯片51
8.5.6.3case语句
用case语句可以方便地实现多分支;虽然用if语句完整格式的嵌套形式也可以实现多分支,但那样做程序的可读性比较差、执行的效率也低,另外还容易人为地引入错误。
1.语法格式
casestringin
pattern_1)commands1;;
pattern_2)commands2;;
…
pattern_N)commandsN;;
*)commands;;
esac
幻灯片52
该语句与C语言的多分支语句的形式类似,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux基础及应用 linux基础及应用第08章 shell编程 linux 基础 应用 08 shell 编程