ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:29.90KB ,
资源ID:7665904      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7665904.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Linux入门引导第21章.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Linux入门引导第21章.docx

1、Linux入门引导第21章第21章 bash编程入门bash shell能够作为命令解释器提供给用户与计算机交互的平台,同样能够作为一种编程语言为用户完成各种批处理工作。bash是所有shell中最适用于shell脚本开发的解释性语言,如果详细展开,其篇幅可能要像这么一本书一样多,本章所展现给读者的,是最常用的shell编程基础与技巧。21.1 创建一个简单的脚本首先,选择一个合适的编辑器,创建一个脚本文件::/test/bash$ vim helloworld.sh 这里假设使用vim编辑器来创建,通常来说,脚本文件最好以sh为后缀名命名,接着,输入简单的脚本内容:#!/bin/bashec

2、ho helloworld # 我的第一个脚本!exit 0现在来分析一下这个简单的脚本中有些什么:Sha-Bangbash脚本以一个名为“Sha-Bang”的“#!”符号开头,后跟bash shell的绝对路径。它告诉系统调用什么shell环境来解释该脚本。“Sha-Bang”只能放在脚本文件的第一行。从第二行开始,任何一行中以井号(#)开头后的字符都属于程序注释,是不会被shell所解释运行的。echo “hellowolrld”在这个脚本文件的第二行,有一个echo命令以及一段注释。bash脚本的注释是从一行中第一个非引用井号开始到行为的部分。在任何时候,给程序加上一段注释都是没错的。合

3、理的注释有助于他人或者是自己更好地完成日后的维护工作。exit 0一个程序结构在结束后,都应当返回一个值,来让调用脚本的程序判断其返回状态,从而更好地处理程序的执行。在这个脚本中,末尾返回了0表示程序执行成功。还有一种常见的返回值就是1,它表示程序执行失败。创建完这样一个简单的脚本后,就可以执行它了::/test/bash$ bash helloworld.sh helloworld:/test/bash$ 通过命令bash,为脚本创建一个执行环境,使脚本能够运行起来。同样的,可以将脚本加上执行权限,直接执行脚本::/test/bash$ ls -l总计 4-rw-r-r- 1 ghostm5

4、5 users 63 04-22 08:36 helloworld.sh:/test/bash$ chmod a+x helloworld.sh :/test/bash$ ls -l总计 4-rwxr-xr-x 1 ghostm55 users 63 04-22 08:36 helloworld.sh:/test/bash$ ./helloworld.sh helloworld:/test/bash$ 可以看到,在将脚本加上执行权限后,用户就可以直接执行脚本了。在学习本章的bash编程基础时,这个脚本文件将逐步被拓展,最后成为一个可供学习参考的语法示范脚本。21.2 变量在使用bash进行脚本

5、编程时,用户可以通过创建变量来动态地存储数据。变量在许多编程语言中都是必不可少的要素,在shell脚本编程中同样如此。21.2.1 创建一个变量创建变量的基本语法如下:变量名=值等于号(=)是赋值符号,它能够将右边的值赋给变量。在使用一个变量时,需要注意它是大小写敏感的,变量名不能以数字开头,并且不能同时设置两个相同名称的变量。现在试着创建一个变量dir::/test/bash$ dir=/etc:/test/bash$ echo $dir/etc:/test/bash$ echo dirdir在命令行下用户就能直接创建变量了。在对一个命令进行赋值后,如果像要读取变量,那么需要在变量名前加上美

6、元符号($),表示这是一个变量。如果不加,那么变量名将只是一个普通的字符串罢了。现在继续创建一个名为whereisdir的变量,简单地在该变量中调用dir变量,显示dir变量的值::/test/bash$ whereisdir=dir is $dir # 1bash: is: command not found:/test/bash$ whereisdir=dir is $dir # 2:/test/bash$ echo $whereisdir dir is /etc:/test/bash$ whereisdir=dir is $dir # 3:/test/bash$ echo $wherei

7、sdir dir is $dir:/test/bash$ whereisdir=echo dir is $dir # 4:/test/bash$ echo $whereisdir dir is /etc 注释1:在第1次对whereisdir这个变量进行赋值时,值没有加上引号。于是,bash在解释这条命令时,会将is作为命令看待,由于没有is这个命令,所以bash报了错。 注释2:在第2次对whereisdir这个变量进行赋值时,值加上了双引号。加上双引号后,它能保留变量值中的空格,如果连续输入多个空格,那么bash会将空格串压缩成单个空格符::/test/bash$ whereisdir=d

8、ir is $dir:/test/bash$ echo $whereisdir dir is /etc可以看到,在whereisdir变量中包含了已经设定好的变量dir,在显示变量的值时,dir变量得到了拓展,所以显示出的结果时dir is /etc。 注释3:在第3次对whereisdir这个变量进行赋值时,值加上了单引号。可以看到的是,这次的执行结果没有将dir变量拓展开,而是将$dir视为一个字符串显示了出来。这也正是双引号与单引号在bash中最重要的区别之一。 注释4:在第4次对whereisdir这个变量进行赋值时,值加上的是反单引号。反单引号在esc键下的一个键位中。通过反单引号的

9、引用,whereisdir能够保存echo dir is $dir这个命令的显示结果。对于其它命令的调用,同样如此。事实上,$变量只是$变量的特殊形式,在遇到如下较为复杂的情况时,后者就变得有用起来::/test/bash$ country=China:/test/bash$ city=$countryShanghai:/test/bash$ echo $city:/test/bash$ 用户的本意是想在显示完变量名country后,紧跟字符串Shanghai。实际情况则是,第一次对city进行赋值时,是将一个名为cityShanghai的变量值赋给了它,由于该变量事先没有赋值,所以显示的是空

10、白行。如果想要实现用户的本意,那么可以加上花括号,将变量名括起来,实现区分::/test/bash$ city=$countryShanghai:/test/bash$ echo $cityChinaShanghai这时,变量就能被正确显示了。在设定变量后,如果想要删除变量,那么可以通过unset命令实现::/test/bash$ unset $dir bash: unset: /etc: not a valid identifier:/test/bash$ unset dir :/test/bash$ echo $dir:/test/bash$ unset工具后应该直接跟变量名。如果像示例中

11、一开始那样加上美元符号,那么变量将会被拓展,命令的实际情况是unset /etc,所以会报错。21.2.2 变量的属性通过bash的内置命令declare或typeset(它们是同一个命令,只是有两个名字),用户可以设定变量的属性。那么,设置变量的属性有哪些用处呢?这里先给出一个简单的例子::/test/bash$ sum=1+1:/test/bash$ echo $sum 1+1用户在这里时想用变量sum来保存1+1的结果,但是sum变量储存的却是字符串1+1。这是因为在bash中,变量在默认情况下都是以字符串的形式储存的。如果想要改变一个变量的类型,就需要使用declare或者typese

12、t。针对这个示例,我们需要将变量sum设置为整型来达到预先的要求::/test/bash$ declare -i sum=1+1:/test/bash$ echo $sum 2通过命令选项i,declare能够将sum设定为整型变量。declare还能通过以下命令选项设置变量的属性: -a:声明一个数组变量 -f:声明一个函数名变量 -i:声明一个整型变量 -r:声明一个只读变量 -x:声明一个全局变量关于数组变量与函数将会在稍后的小节中讲解,下面讲解什么是只读变量与全局变量。当用户创建了一个变量后,为了确保变量不会在意外情况下被二次赋值,那么可以通过事先将变量设置为只读属性来得到确保::/t

13、est/bash$ declare -r city=Shanghai:/test/bash$ echo $city Shanghai:/test/bash$ city=Beijingbash: city: readonly variable:/test/bash$ 在设置了city为只读变量后,如果想要再次对该变量进行赋值,将会得到city是只读变量的错误提示。并且,一旦变量被设置为了只读,它将无法被去除只读属性或者是删除。要将一个变量设置为只读属性,还能通过readonly命令实现::/test/bash$ readonly numreadonly与带有命令选项r的declare功能相同。到

14、目前为止,这里所有的变量都是局部变量,只能在当前bash环境中生效::/test/bash$ cat helloworld.sh#!/bin/bashecho helloworld # 我的第一个脚本!echo I come from $Countryexit 0:/test/bash$ declare Country=China:/test/bash$ echo $CountryChina:/test/bash$ ./helloworld.shhelloworldI come from:/test/bash$ 在脚本helloworld中,我们试着将变量Country的值显示出来,前提是在外

15、部先创建好一个Country变量,并已经对其赋值。可以看到,虽然在外部能够显示Country这个变量的值,它却无法在脚本中被正确引用。现在,试着将Country设定为全局变量::/test/bash$ declare -x Country:/test/bash$ ./helloworld.shhelloworldI come from China:/test/bash$在将Country设置为全局变量后,脚本中就能显示它的值了。需要注意的是,全局变量仅对当前bash环境及其子环境有效,而不能对外部环境有效,如果在脚本中设置一个全局变量,那么在执行脚本的环境里这个变量是无效的。要设置一个全局变量

16、,还能通过命令export实现::/test/bash$ export Countryexport与带有命令选项x的declare功能相同。21.2.3 关键字变量在bash下有着许多默认的关键字变量,这些变量可以通过继承或者是启动时初始化得到,通常它们都是全局变量。本小节会介绍几个最主要的关键字变量。PS1在登录bash后,我们首先可以看到类似这样的命令提示符:userlocalhost:$默认情况下,命令提示符都会由用户名,主机名,当前工作目录以及表示用户身份的提示符号组成。用户可以自行对命令提示符的显示信息进行定义,bash的命令提示符属性可以在/.bashrc文件中通过设定变量PS1改

17、变。这个例子中的PS1变量是:PS1=uh:w$ 在设定变量PS1时,u代表用户名,h代表主机名,w代表工作目录的绝对路径,$显示用户身份的提示符,普通用户登录时该提示符为$,而超级用户则为#。表21.1给出了最为常用的PS1提示符号:表21.1 主要的PS1提示符号提示符含义$只有在以root身份运行时显示为#,否则就是$w工作目录的绝对路径W工作目录名d按照“星期日/月/日期”格式显示的日期h计算机的主机名,不包括域名H计算机的主机名,包括域名u当前用户的用户名t以HH:MM:SS的格式,24小时制显示当前时间A以HH:MM的格式,24小时制显示当前时间用户可以随自己的需要自由地设置命令提

18、示符。HOMEHOME变量在默认情况下是用户的家目录::$ echo $HOME/home/user家目录是用户登录shell后的默认工作目录,HOME变量还能使用波浪符号()来指代::$ echo /home/ghostm55PATHPATH变量存放着用户查找程序的路径,通常,用户可以直接输入vim来启动编辑器vim,那是因为vim命令存放在PATH变量中包含的目录下::$ which vim/usr/bin/vim:$ echo $PATH/bin:/usr/bin:/sbin:/usr/sbin:/opt/kde/bin:/opt/qt/bin可以看到,vim命令是在/usr/bin目录

19、下,当查看PATH变量时,可以看到许多以冒号(:)隔开的路径,其中就包括了/usr/bin。用户可以在自己的bash配置文件中自行配置PATH变量:PATH=PATH:/bin这样就能添加/home/user/bin作为搜索路径了。如果要添加工作目录为搜索路径,那么在任何时候都不要将它放在PATH搜索路径列表的第一位。这样做会导致不可预测的安全问题。比如,在工作目录下有个恶意程序ls,这是个使用率极高的命令,一旦先被搜索到执行,那么后果不堪设想。21.2.4 数组变量bash支持一维数组的变量类型,数组的下标是以0开始的阿拉伯数字,这与C语言中的规则是一样的。bash中创建一个数组变量的语法如

20、下:变量名=(值1 值2 值3 . 值n)现在试着创建一个数组变量::/test/bash$ City=(Shanghai Beijing GuangZhou ChongQing):/test/bash$ echo $CityShanghai:/test/bash$ echo $City0Shanghai:/test/bash$ echo $City4:/test/bash$在这里,City是一个包括4个城市名的数组变量。当数组变量被赋值后,直接读取变量名将会取得数组中第1个值。要显示数组中指定的变量,需要将变量名用花括号括起来,并且在中括号中指定显示第几个变量。 数组变量中的维数0指代第一个

21、,维数n就是第n+1个变量。如果所指范围超过已经指定的数组范围,那么将会被视为不存在的变量,从而显示空行。数组变量同样能够被设置为整形变量::/test/bash$ nums=(1 2 3 4 a):/test/bash$ sum=$nums3+$nums2:/test/bash$ echo $sum4+3:/test/bash$ declare -i nums:/test/bash$ declare -i sum:/test/bash$ sum=$nums3+$nums2:/test/bash$ echo $sum7:/test/bash$ echo $nums4a可以看到,用户在将数组变量

22、nums的属性改变为整形变量后,数组中的数字就能相加得到结果然后赋值给变量sum,而变量nums4的值依然是a。21.2.5 特殊变量在bash中,有着其指定的特殊变量,它们分别访问一些极为有用的变量值。$变量$代表着当前程序的PID号::/test/bash$ echo $4127:/test/bash$ ps PID TTY TIME CMD 4127 pts/2 00:00:00 bash 4545 pts/2 00:00:00 ps可以看到,特殊变量$显示出的数字就是当前运行程序进程的PID号。$?变量$?记录的是上一个命令执行后的返回码::/test/bash$ dddbash: d

23、dd: command not found:/test/bash$ echo $?127:/test/bash$ echo $?0这个示例先试着运行了一个错误指令,然后查看返回码,是127,具体的错误返回码含义要查看相关的资料。再次查看返回码时,发现数值已经返回到了0,这是因为在上次查看返回码的命令成功返回,值为0。$#与$n这里,$n中的n是阿拉伯数字,从$1开始,每个变量都对应着调用脚本的命令参数,而$0代表的是调用脚本的名字::/test/bash$ echo $0/bin/bash而特殊变量$#则表示调用脚本的命令参数个数,现在来看一个例子:#!/bin/bashecho $0 $1

24、$2echo There is $# parameters hereexit 0接着,用户试着执行这个脚本::/test/bash$ bash parameter.sh p1 p2 p3parameter.sh p1 p2There is 3 parameters here可以看到,变量$0,$1,$2虽然没有被创建过,但是它们分别代表了调用脚本名、第一个命令参数以及第二个命令参数。而后面的特殊变量$#则是命令参数的个数21.2.6 学习记录本小节学习了变量的基本使用,现在,将学习心得写到脚本helloworld中去。#!/bin/bash#helloworld bash shell学习脚本#

25、变量的学习#变量的创建语法为: 变量名=值Country=China #首先创建一个变量Countryecho $Country # 显示Chinaecho $Country # 显示$Country#使用 $变量 的形式更为标准echo I come from $CountryShanghai#变量的删除使用unsetunset Countryecho $Country # 变量Country已经不存在,显示空行#整形变量的创建declare -i sum#只读变量的创建declare -r sum#数组变量的创建#语法:变量名=(值1 值2 值3 . 值n)nums=(1 2 3 4) #

26、数组的下标从0开始echo $nums3 #数组变量必须用中括号将变量名括起,这里显示结果时4#特殊变量echo $0 $1 $2 # 分别显示调用脚本名,第一个命令参数,第二个命令参数echo $# # 显示命令参数个数echo $ # 显示PID号在学习shell编程的过程中,写这样一份参考脚本是一个不错的习惯,它能够帮助日后的复习与参考使用。在完成每一节的学习后,读者都可以自行都会对helloworld进行扩展,以加深对学习过的内容的印象。21.3 控制结构引入正确的控制结构是编程中最重要的一个环节,bash编程语言也有许多控制结构语句供用户使用,它们分为循环、判断、选择三种。21.3.

27、1 if . elif . else判断语句if的语法如下:if 条件 then 执行语句 elif 条件 then 执行语句 . else 执行语句fi先看一个例子,有助于对语句的理解:#!/bin/bashecho make a choice(y/n):read choiceif $choice = y then echo Your choice is y exit 0elif $choice = n then echo Your choice is n exit 0else echo You should have a second thought exit 1fi指令read是等待用户

28、输入一个值赋给指定的变量,在这里,这个变量是NUM。接下来,程序开始执行判断语句,这里判断语句的思想是:根据户输入的字符,判断他的输入是y还是n,如果都不是,那么就报错。在if语句中,子语句elif还有else如果不需要使用,是可以省略的。如果这里我们只希望判断用户输入的是不是字符y,那么可以将elif与else的子语句块去掉,或者是注释掉:#!/bin/bashecho make a choice(y/n):read choiceif $choice = y then echo Your choice is y exit 0#elif $choice = n #then# echo Your

29、 choice is n# exit 0#else# echo You should have a second thought# exit 1fi这样,程序就等价于:#!/bin/bashecho make a choice(y/n):read choiceif $choice = y then echo Your choice is y exit 0fitest内置命令在前面if语句的示例中,运用到了内置命令test进行条件判断。事实上,该句中的中括号是test的简写形式。test的语法如下:test 表达式 表达式 test命令对表达式进行判断,并返回一个值,来表示这个表达式是true(

30、0),还是false(1)。test的简写形式是一对中括号,由它将表达式括起来,由于中括号实际上就是一个命令,所以要注意表达式与中括号之间要有空格。表达式可以是一个,也可以是多个,当有多个表达式时,需要使用布尔操作符对它们进行分割。-a是布尔与操作符,只有当由-a连接的条件表达式都为真是,整个表达式的值才能为真。-o时布尔或操作符,只要当由-o连接的条件表达式中有一个为真,那么整个表达式的值就为真。表达式中的每个元素都必须通过空格来分割。下面列出的是test的最常用的判别式:表21.2 内置命令test的常用判别式判别式含义-n string如果字符串string长度大于0,那么返回值为真-z str

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1