Linux入门引导.doc_第1页
Linux入门引导.doc_第2页
Linux入门引导.doc_第3页
Linux入门引导.doc_第4页
Linux入门引导.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

235第18章 常用插件扩展点第21章 bash编程入门bash shell能够作为命令解释器提供给用户与计算机交互的平台,同样能够作为一种编程语言为用户完成各种批处理工作。bash是所有shell中最适用于shell脚本开发的解释性语言,如果详细展开,其篇幅可能要像这么一本书一样多,本章所展现给读者的,是最常用的shell编程基础与技巧。21.1 创建一个简单的脚本首先,选择一个合适的编辑器,创建一个脚本文件::/test/bash$ vim helloworld.sh 这里假设使用vim编辑器来创建,通常来说,脚本文件最好以sh为后缀名命名,接着,输入简单的脚本内容:#!/bin/bashecho helloworld # 我的第一个脚本!exit 0现在来分析一下这个简单的脚本中有些什么:Sha-Bangbash脚本以一个名为“Sha-Bang”的“#!”符号开头,后跟bash shell的绝对路径。它告诉系统调用什么shell环境来解释该脚本。“Sha-Bang”只能放在脚本文件的第一行。从第二行开始,任何一行中以井号(#)开头后的字符都属于程序注释,是不会被shell所解释运行的。echo “hellowolrld”在这个脚本文件的第二行,有一个echo命令以及一段注释。bash脚本的注释是从一行中第一个非引用井号开始到行为的部分。在任何时候,给程序加上一段注释都是没错的。合理的注释有助于他人或者是自己更好地完成日后的维护工作。exit 0一个程序结构在结束后,都应当返回一个值,来让调用脚本的程序判断其返回状态,从而更好地处理程序的执行。在这个脚本中,末尾返回了0表示程序执行成功。还有一种常见的返回值就是1,它表示程序执行失败。创建完这样一个简单的脚本后,就可以执行它了::/test/bash$ bash helloworld.sh helloworld:/test/bash$ 通过命令bash,为脚本创建一个执行环境,使脚本能够运行起来。同样的,可以将脚本加上执行权限,直接执行脚本::/test/bash$ ls -l总计 4-rw-r-r- 1 ghostm55 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进行脚本编程时,用户可以通过创建变量来动态地存储数据。变量在许多编程语言中都是必不可少的要素,在shell脚本编程中同样如此。21.2.1 创建一个变量创建变量的基本语法如下:变量名=值等于号(=)是赋值符号,它能够将右边的值赋给变量。在使用一个变量时,需要注意它是大小写敏感的,变量名不能以数字开头,并且不能同时设置两个相同名称的变量。现在试着创建一个变量dir::/test/bash$ dir=/etc:/test/bash$ echo $dir/etc:/test/bash$ echo dirdir在命令行下用户就能直接创建变量了。在对一个命令进行赋值后,如果像要读取变量,那么需要在变量名前加上美元符号($),表示这是一个变量。如果不加,那么变量名将只是一个普通的字符串罢了。现在继续创建一个名为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 $whereisdir dir is $dir:/test/bash$ whereisdir=echo dir is $dir# 4:/test/bash$ echo $whereisdir dir is /etcq 注释1:在第1次对whereisdir这个变量进行赋值时,值没有加上引号。于是,bash在解释这条命令时,会将is作为命令看待,由于没有is这个命令,所以bash报了错。q 注释2:在第2次对whereisdir这个变量进行赋值时,值加上了双引号。加上双引号后,它能保留变量值中的空格,如果连续输入多个空格,那么bash会将空格串压缩成单个空格符::/test/bash$ whereisdir=dir is $dir:/test/bash$ echo $whereisdir dir is /etc可以看到,在whereisdir变量中包含了已经设定好的变量dir,在显示变量的值时,dir变量得到了拓展,所以显示出的结果时dir is /etc。q 注释3:在第3次对whereisdir这个变量进行赋值时,值加上了单引号。可以看到的是,这次的执行结果没有将dir变量拓展开,而是将$dir视为一个字符串显示了出来。这也正是双引号与单引号在bash中最重要的区别之一。q 注释4:在第4次对whereisdir这个变量进行赋值时,值加上的是反单引号。反单引号在esc键下的一个键位中。通过反单引号的引用,whereisdir能够保存echo dir is $dir这个命令的显示结果。对于其它命令的调用,同样如此。事实上,$变量只是$变量的特殊形式,在遇到如下较为复杂的情况时,后者就变得有用起来::/test/bash$ country=China:/test/bash$ city=$countryShanghai:/test/bash$ echo $city:/test/bash$ 用户的本意是想在显示完变量名country后,紧跟字符串Shanghai。实际情况则是,第一次对city进行赋值时,是将一个名为cityShanghai的变量值赋给了它,由于该变量事先没有赋值,所以显示的是空白行。如果想要实现用户的本意,那么可以加上花括号,将变量名括起来,实现区分::/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工具后应该直接跟变量名。如果像示例中一开始那样加上美元符号,那么变量将会被拓展,命令的实际情况是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或者typeset。针对这个示例,我们需要将变量sum设置为整型来达到预先的要求::/test/bash$ declare -i sum=1+1:/test/bash$ echo $sum 2通过命令选项i,declare能够将sum设定为整型变量。declare还能通过以下命令选项设置变量的属性:q -a:声明一个数组变量q -f:声明一个函数名变量q -i:声明一个整型变量q -r:声明一个只读变量q -x:声明一个全局变量关于数组变量与函数将会在稍后的小节中讲解,下面讲解什么是只读变量与全局变量。当用户创建了一个变量后,为了确保变量不会在意外情况下被二次赋值,那么可以通过事先将变量设置为只读属性来得到确保::/test/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功能相同。到目前为止,这里所有的变量都是局部变量,只能在当前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的值显示出来,前提是在外部先创建好一个Country变量,并已经对其赋值。可以看到,虽然在外部能够显示Country这个变量的值,它却无法在脚本中被正确引用。现在,试着将Country设定为全局变量::/test/bash$ declare -x Country:/test/bash$ ./helloworld.shhelloworldI come from China:/test/bash$在将Country设置为全局变量后,脚本中就能显示它的值了。需要注意的是,全局变量仅对当前bash环境及其子环境有效,而不能对外部环境有效,如果在脚本中设置一个全局变量,那么在执行脚本的环境里这个变量是无效的。要设置一个全局变量,还能通过命令export实现::/test/bash$ export Countryexport与带有命令选项x的declare功能相同。21.2.3 关键字变量在bash下有着许多默认的关键字变量,这些变量可以通过继承或者是启动时初始化得到,通常它们都是全局变量。本小节会介绍几个最主要的关键字变量。PS1在登录bash后,我们首先可以看到类似这样的命令提示符:userlocalhost:$默认情况下,命令提示符都会由用户名,主机名,当前工作目录以及表示用户身份的提示符号组成。用户可以自行对命令提示符的显示信息进行定义,bash的命令提示符属性可以在/.bashrc文件中通过设定变量PS1改变。这个例子中的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小时制显示当前时间用户可以随自己的需要自由地设置命令提示符。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目录下,当查看PATH变量时,可以看到许多以冒号(:)隔开的路径,其中就包括了/usr/bin。用户可以在自己的bash配置文件中自行配置PATH变量:PATH=PATH:/bin这样就能添加/home/user/bin作为搜索路径了。如果要添加工作目录为搜索路径,那么在任何时候都不要将它放在PATH搜索路径列表的第一位。这样做会导致不可预测的安全问题。比如,在工作目录下有个恶意程序ls,这是个使用率极高的命令,一旦先被搜索到执行,那么后果不堪设想。21.2.4 数组变量bash支持一维数组的变量类型,数组的下标是以0开始的阿拉伯数字,这与C语言中的规则是一样的。bash中创建一个数组变量的语法如下:变量名=(值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个值。要显示数组中指定的变量,需要将变量名用花括号括起来,并且在中括号中指定显示第几个变量。q 数组变量中的维数0指代第一个,维数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可以看到,用户在将数组变量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: ddd: 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 $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学习脚本#变量的学习#变量的创建语法为: 变量名=值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) #数组的下标从0开始echo $nums3 #数组变量必须用中括号将变量名括起,这里显示结果时4#特殊变量echo $0 $1 $2 # 分别显示调用脚本名,第一个命令参数,第二个命令参数echo $# # 显示命令参数个数echo $ # 显示PID号在学习shell编程的过程中,写这样一份参考脚本是一个不错的习惯,它能够帮助日后的复习与参考使用。在完成每一节的学习后,读者都可以自行都会对helloworld进行扩展,以加深对学习过的内容的印象。21.3 控制结构引入正确的控制结构是编程中最重要的一个环节,bash编程语言也有许多控制结构语句供用户使用,它们分为循环、判断、选择三种。21.3.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是等待用户输入一个值赋给指定的变量,在这里,这个变量是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 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(0),还是false(1)。test的简写形式是一对中括号,由它将表达式括起来,由于中括号实际上就是一个命令,所以要注意表达式与中括号之间要有空格。表达式可以是一个,也可以是多个,当有多个表达式时,需要使用布尔操作符对它们进行分割。-a是布尔与操作符,只有当由-a连接的条件表达式都为真是,整个表达式的值才能为真。-o时布尔或操作符,只要当由-o连接的条件表达式中有一个为真,那么整个表达式的值就为真。表达式中的每个元素都必须通过空格来分割。下面列出的是test的最常用的判别式:表21.2 内置命令test的常用判别式判别式含义-n string如果字符串string长度大于0,那么返回值为真-z string如果字符串string长度等于0,那么返回值为真string1=string2如果字符串string1等于string2,那么返回值为真string1!=string2如果字符串string1不等于string2,那么返回值为真file1 -nt file2如果file1的修改时间比file2新,那么返回值为真file1 -ot file2如果file2的修改时间比file1新,那么返回值为真-e file如果文件file存在,那么返回值为真-f file如果文件file存在并且是一个普通文件,那么返回值为真-b file如果文件file存在并且是一个块设备,那么返回值为真-c file如果文件file存在并且是一个字符设备,那么返回值为真-d file如果文件file存在并且是一个目录文件,那么返回值为真-L file如果文件file存在并且是一个符号链接文件,那么返回值为真-O file如果文件file存在并且为用户所有,那么返回值为真-r file如果用户对文件file拥有读权限,那么返回值为真-w file如果用户对文件file拥有写权限,那么返回值为真-x file如果用户对文件file拥有执行权限,那么返回值为真下面列出的是test的关系操作符:表21.3 内置命令test的关系操作符关系操作符含义-eq等于-ge大于或等于-gt大于-le小于或等于-lt小于-ne不等于在理解了test的使用后,用户可以写出更为复杂的判断表达式。现在,假设工作目录下有一个名为foo的文件,编写一个if语句,进行文件的读权限进行判断:#!/bin/bashif -f foo -a -r foo then echo 文件foo存在,并且拥有读权限 exit 0else echo 文件foo不存在或没有读权限 1&2 exit 1fi可以看到,布尔操作符-a连接了两个表达式,用于判断是否存在文件foo以及是否拥有对该文件的读权限。当显示错误信息时,后面跟了重定向1&2。这么做的作用是将该消息输出到标准错误输出中去,否则错误信息就被保存在了标准正确输出中,这往往会导致一些问题。21.3.2 for . in循环语句for . in的语法如下:for 变量 in 参数列表do执行语句donefor . in 语句是将参数列表中的参数逐一赋值到变量中去,然后在执行语句中执行有关变量的操作。现在来看一个例子,帮助理解:#!/bin/bashfor city in Shanghai Beijing Guangzhoudo echo $city is a citydoneexit 0该语句的执行结果如下:/test/bash$ bash city.shShanghai is a cityBeijing is a cityGuangzhou is a city在脚本city.sh中,city作为for . in循环语句中的变量,每一次循环都将参数列表中的下一个值赋给它。#!/bin/bashnum=0for file in *do if -f $file then (num=num+1) fidoneecho 当前目录下共有$num个普通文件exit 0在这个例子中,参数列表变为了工作目录下的所有文件,将这些文件名赋值给变量file后,通过判断语句if来记录有多少个文件为普通文件。“()”是算术表达式,在稍后的小节中会进行介绍。完成记录后,显示结果::/test/bash$ bash file.sh当前目录下共有5个普通文件可见,多种程序控制语句的配合可以使程序的功能变得强大。21.3.3 for循环语句for的语法如下:for 变量do执行语句done不带参数列表的语句for将会用命令参数来赋值给指定变量,先来看一个简单的例子:#!/bin/bashfor argdo echo $argdone该脚本的执行结果如下::/test/bash$ bash arg.sh 1 2 3123:/test/bash$ bash arg.sh:/test/bash$可以看到,变量arg依次储存的是命令参数。q 如果没有命令参数,那么变量arg将不会被赋值。21.3.4 while循环语句while的语法如下:while 条件表达式do执行语句donewhile语句的意思是,每次循环只要条件表达式的值为真,那么就要执行语句。先来看个简单的例子帮助理解:#!/bin/bashecho 倒数3秒num=3while $num -gt 0 do echo $num (num=num-1) sleep 1doneexit 0while语句中再次使用到了test来判断条件表达式。在这里,只要变量num比0大,条件则为真,所以,while会循环3次,每次循环都会显示秒数并且通过sleep命令暂停1秒,从而实现倒数3秒的功能。21.3.5 until循环语句until的语法如下:until 条件表达式do执行语句doneuntil语句与while语句的语法几乎完全相同,唯一不同之处就在于条件语句的测试位置。while循环执行语句块直到条件表达式为假,结束循环。而until循环执行语句块直到条件表达式为真,结束循环。while语句先判断,后执行,until语句先执行,后判断。现在来看一个例子,对比它们的不同:#!/bin/bashnum=1until $num -lt 0 do (num=num-1)doneecho $numexit 0该脚本的执行结果如下::/test/bash$ bash untilandwhile.sh-1q 程序思想:直到变量num小于0,才停止循环,显示变量num的值现在将脚本中的until换成while:#!/bin/bashnum=1while $num -lt 0 do (num=num-1)doneecho $numexit 0该脚本的执行结果如下::/test/bash$ bash untilandwhile.sh1可以看出,脚本没有进入到while的循环语句中去。这是因为num变量的值比0大,所以条件不成立,就无法执行语句块。21.3.6 break与continuebash编程中引入了C语言中语句中断与跳出的概念。和C语言一样,这两个语句分别是break和continue。break语句的作用是跳出循环,直接开始执行循环结构后的语句,而continue则是进入下一个循环。下面的脚本给出了break与continue的用法:#!/bin/bashfor num in 1 2 3 4 5do if $num -le 3 then echo continue continue echo 不显示 fi if $num -eq 4 then echo break break echo 就是不显示 fidoneexit 0该脚本的执行结果如下::/test/bash$ bash breakandcontinue.shcontinuecontinuecontinuebreak根据for的语句,循环本来应该执行5次,但是由于到了第4次遇到了与break语句相符的条件,所以循环直接在执行break后跳出,并结束脚本的运行。同时可以看到,跟在continue与break语句下的echo命令从未得到执行。21.3.7 case选择语句case的语法如下:case 条件字符串 in匹配条件1)执行语句1;匹配条件2)执行语句2;.匹配条件n)执行语句n;esac先看一个例子,帮助理解:#!/bin/bashecho yes or no:read choicecase $choice in y) echo Your choice is yes. ; n) echo Your choice is no. ; *) echo What?esac该脚本的执行结果如下::/test/bash$ bash case.shyes or no:yYour choice is yes.:/test/bash$ bash case.shyes or no:nYour choice is no.:/test/bash$ bash case.shyes or no:aaaaaaWhat?q case语句对条件字符串进行判断,然后对应到相应的匹配条件中去执行语句块q case语句按照从上到下的顺序进行条件匹配的判断,所以一般在最后会加上通配符“*”为条件,来执行不符合之前条件的语句。除了通配符“*”,匹配条件同样能够使用其它的通配符:#!/bin/bashecho Enter a word:read wordcase $word in ?) echo Your word has only one letter. ; ?) echo Your word has two letters. ; ?|?|?) echo Your word has many letters. ; *) echo Too many or too few letters.esac在这个脚本中,通配符“?”发挥了它的作用,输入一个单词,判断其字母数。在第三个匹配条件中,还加入了条件分离符“|”,它的功能相当于布尔或操作符只要两个或多个中的任意一个条件成立,那么匹配条件便成立。21.3.8 学习记录至此,bash编程中最常用的几种结构控制语句已经全部呈现在读者的面前,是时候添加补充helloworld学习记录脚本了:#控制结构语句#if . elif . else#语法:#if 条件#then#执行语句#elif 条件#then#执行语句#.#else#执行语句#fi#测试文件fooif -f foo -a -r foo then echo 文件foo存在,并且拥有读权限 exit 0elif -f foo -a -w foo thenecho 文件foo存在,并且拥有写权限exit 0else echo 文件foo不存在或没有读或写权限 1&2# 重定向1&2将错误信息重定向至标准错误信息 exit 1fi#for#语法:#for 变量 in 参数列表 #do#执行语句#done#倒数for num in 5 4 3 2 1doecho $numsleep 1# 暂停1秒done#删除目录下的所有符号链接文件for file in ./*dorm -f $filedone#while & until#语法:#while/until条件表达式#do#执行语句#done#数值递减num=1while $num -lt 0 #until $num -lt 0 do(num=num-1)doneecho $num# while显示1,until显示-1exit 0#break & continue#循环中的break与continuefor num in 1 2 3 4 5do if $num -le 3 then echo continue continue# 直接进入下一个循环 echo 不显示# 不显示 fi if $num -eq 4 then echo break break# 跳出循环 echo 就是不显示 # 就是不显示 fidone#case#语法:#case 条件字符串 in#匹配条件1)#执行语句1#;#匹配条件2)#执行语句2#;#.#匹配条件n)#执行语句n#;#esac#回答问题echo yes or no:read choicecase $choice in y) echo Your choice is yes. ;# 注意每个执行语句都要以;结尾 n) echo Your choice is no. ; *) echo What?esac21.4 表达式表达式是bash脚本中极为有用的组成部分,本节将介绍算术表达式与逻辑表达式。21.4.1 算术表达式bash虽然将所有默认变量的值视为字符串,但它能够很好地支持算术运算与赋值。不过,bash中所有进行运算的数都要求为整数,而不能是浮点类型的。bash中有许多方法进行算术赋值,将变量类型改变为整形的方法已经在之前介绍过了,这里首先要介绍使用let命令进行算术赋值::/test/bash$ num=1:/test/bash$ let num=num+1:/test/bash$ echo $num2可以看到,let命令将num+1的结果赋给了变量num,所以num的值就成为了2。如果觉得let加上双引号进行赋值太麻烦,那么可以使用“(算术表达式)”的形式来代替let::/test/bash$ numA=1:/test/bash$ numB=2:/t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论