赞
踩
• 理解Shell Script的建立与执行。
• 理解Shell变量的种类和作用。
• 理解Shell运算符关系。
• 掌握Shell Script的运行方式以及程序设计的流程控制。
在Linux操作系统环境中,Shell不仅是常用的命令解释程序,还是高级编程语言。
用户可以通过编写Shell程序来完成大量自动化的任务。
Shell可以互动地解释和执行用户输入的命令,也可以用来进行程序设计,它提供了定义变量和参数的手段以及丰富的程序控制结构。
使用Shell编写的程序被称为Shell Script,即Shell程序或Shell脚本文件。
要想管理好主机,就一定要学好Shell Script。
Shell Script有些像早期的批处理,即将一些命令汇总起来一次运行,但是Shell Script拥有更强大的功能,即它可以进行类似程序编写的操作,且不需要经过编译就能够运行,使用非常方便。同时,用户可以通过Shell Script来简化日常的管理工作,在整个Linux操作系统的环境中,一些服务的启动是通过Shell Script来运行的,将与其相关的Linux命令有机组合在一起时,可大大提高编程的效率。充分利用Linux操作系统的开放性能,用户就能够设计出适合自己要求的环境。
本章主要讲解Shell Script及Shell Script编写。
shell Script就是针对Shell所写的脚本。
其实,shell Script是利用Shell的功能所写的一个程序。这个程序使用了纯文本文件,将一些shell的语法与命令和正则表达式、管道命令与数据流重定向等功能搭配起来,以达到所想要的处理目的。
命令的运行是从上而下。从左至右进行的。
命令、参数与选项间的多个空格都会被忽略
空白行会被忽略,按“Tab”键所生成的空白行被视为空格键
如果读取到一个换行(CR)符号,则尝试开始运行改行命令。
如果一行的内容太多,则可以使用“\[Enter]”来延伸至下一行
“#”可以作为注释,任何加在“#”后面的数据都会全部被视为注释文字而被忽略。
现在假设程序文件是/home/script/shell01.sh,那么如何运行这个文件呢?执行Shell Script 时可以采用以下3种方式。
(1)输入脚本绝对路径或者相对路径
- root@linux01:/home/admin# mkdir /home/script -p
- root@linux01:/home/admin# cd /home/script/
- root@linux01:/home/script# vim shell01.sh #编写shell01.sh文件,内容如下
- #!/bin/bash
- echo hello everyone welcome to here!
- root@linux01:/home/script# chmod a+x shell01.sh #修改用户执行权限
- root@linux01:/home/script# /home/script/shell01.sh #以绝对路径方式执行
- hello everyone welcome to here!
- root@linux01:/home/script# . /home/script/shell01.sh #“.”后面需要有空格
- hello everyone welcome to here!
- root@linux01:/home/script# ./shell01.sh #以相对路径方式执行“.”后无空格
- hello everyone welcome to here!
- root@linux01:/home/script#
(2)执行bash或SH脚本
- root@linux01:/home/script# bash /home/script/shell01.sh
- hello everyone welcome to here!
- root@linux01:/home/script# sh /home/script/shell01.sh
- hello everyone welcome to here!
(3)在脚本路径前加 “." 或source
- root@linux01:/home/script# . shell01.sh
- hello everyone welcome to here!
- root@linux01:/home/script# source shell01.sh
- hello everyone welcome to here!
- root@linux01:/home/script# source /home/script/shell01.sh
- hello everyone welcome to here!
- root@linux01:/home/script#
注意:将shell文件修改为可执行文件
- chmod 777 shell01.sh
- #或者
- chmod a+x shell01.sh
一个shell Script脚本通常包含如下部分
(1)首行:表示脚本将要调用shell解释器
#!/bin/bash
”#!“ 符号能够被内核识别为一个脚本的开始,其必须位于脚本首行;
“/bin/bash”是bash程序的绝对路径,表示后续的内容通过bash程序解释执行
(2)注释:注释符号”#“需放在要注释的内容前面,用于备注shell script的功能以防日后忘记
(3)可执行内容:经常使用的Linux命令或程序语言组成。
【例】编写shell script,实现Firefox软件包的自动安装
- root@linux01:/home/script# vim firefox.sh 编写sh文件,内容如下
-
- #!bin/bash
- #FireFox软件包安装
- #version:1.0
- #制作人:zhy
- #版权声明:free
-
- apt update
- apt install firefox
-
- echo "firefox已安装成功"
- echo "welcome to Ubuntu"
- root@linux01:/home/script# . firefox.sh #执行shell脚本文件
命令执行结果如下:
养成编写Shell Script的良好习惯是很重要的,但大家在刚开始编写程序的时候,最容易忽略良好习惯的培养,认为写出的程序能够运行即可。其实,程序的说明越清楚,日后维护越方便,对系统管理员的成长是有很大帮助的。
建议养成编写Shell Script的良好习惯,在每个Shell Script 的文件头包含 如下内容。
(1)Script的功能
(2)Script的版本信息
(3)Script的作者联系方式
(4)Script的版权声明方式
(5)Script的历史记录
(6)Script内较特殊的命令,使用绝对路径的方式进行操作
(7)预先声明与设置Script运行时需要的环境变量
除此之外,建议在较为特殊的程序部分加上注释进行说明。
程序编写建议使用嵌套方式,以“Tab”键进行缩排,程序显得整齐、有条理,便于阅读与调试。
建议使用“Vim”编辑器编写 Shell Script。因为Vim有额外的语法检测机制,能够在编写时发现语法方面的问题。
在Linux操作系统中,使用Shell Script来编写程序时,要掌握Shell变量、Shell运算符、Shell流程控制语句等相关变量、运算符、语法、语句。Shell变量是Shell传递数据的一种方式,用来代表每个取值的符号名,当Shell Script需要保存一些信息,如一个文件名或一个数字时,会将其存放在一个变量中。
shell变量的设置规则如下:
(1)变量名称可以由数字、字母和下划线组成,但不能以数字开头,环境变量名称建议采用大写字母,便于区分。
(2)在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
(3)变量用等号连接值,等号两侧不能有空格
(4)如果变量的值有空格,则需要使用单引号或者双引号将其括起来
变量类型:可以通过set命令查看系统中的所有变量
(1)环境变量:用于保存与系统操作环境相关的数据,如HOME、PWD、SHELL、USER等
(2)位置参数变量:主要用于向脚本中传递参数或数据,变量名不能自定义,变量的作用也是固定的。
(3)预定义变量:是shell中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。
(4)用户自定义变量:以字母或者下划线开头,由字母、数字或下划线组成,大小写字母的含义不同,变量名长度没有限定。
习惯上使用大写字母来命名变量,变量名以字母或下划线开头,不能以数字开头。在使用变量时,要在变量名前加 “$”
(1)变量赋值
- root@linux01:/home/script# A=5;B=10 #变量赋值,等号两侧不能有空格
- root@linux01:/home/script# echo $A $B #打印变量的值时,前面要加$符号
- 5 10
- root@linux01:/home/script# STR="hello everyone" #赋值字符串
- root@linux01:/home/script# echo $STR
- hello everyone
- root@linux01:/home/script#
(2)使用单引号和双引号的区别
- root@linux01:/home/script# NUM=8
- root@linux01:/home/script# SUM="$NUM hello"
- root@linux01:/home/script# echo $SUM
- 8 hello
- root@linux01:/home/script# SUM2='$NUM hello'
- root@linux01:/home/script# echo $SUM2
- $NUM hello
- root@linux01:/home/script#
单引号中的内容会全部输出,双引号中的内容会有所变化,因为双引号会对所有特殊字符进行转义。
(3)列出所有变量
set #列出所有变量
(4)删除变量
- root@linux01:/home/script# unset A #撤销变量A
- root@linux01:/home/script# echo $A
-
- root@linux01:/home/script#
-
- #若声明的是静态变量,则不能使用unset命令进行撤销操作
- root@linux01:/home/script# readonly B
- root@linux01:/home/script# echo $B
- 10
- root@linux01:/home/script# unset B
- bash: unset: B:无法取消设定: 只读 variable
- root@linux01:/home/script# echo $B
- 10
- root@linux01:/home/script#
用户自定义变量只在当前的shell中有效,而环境变量则会在当前shell及其所有子shell中生效。
如果将环境变量写入相应的配置文件,则这个环境变量将会在所有的shell中生效。
$n:$0代表命令本身,$1-9代表接收的第1-9个参数,10及以上需要用{}括起来。${10}
$*:代表接收所有参数,将所有参数看作一个整体。
$@:代表接收所有参数,将每个参数区别对待
$#:代表接收的参数个数
在shell中已经定义的变量,和默认环境变量有一些类似。预定义变量不能重新定义,用户只能根据shell的定义来使用这些变量。
预定义变量及其功能:
预定义变量 | 功能说明 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,则证明上一条命令执行正确;如果这个变量的值为非0(具体数字自己决定),则证明上一条命令执行错误。 |
$$ | 当前进程的进程号 |
$! | 后台运行的最后一个进程的进程号 |
严格来说,位置参数变量是预定义变量的一种,只是位置参数变量的作用比较统一,所以这里将位置参数变量单独划分为一类变量。
命令格式如下:
read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]
使用read命令执行如下操作:
- root@linux01:/home/script# read -p "请输入你的名字:" NAME
- 请输入你的名字:zhy
- root@linux01:/home/script# echo $NAME
- zhy
- root@linux01:/home/script# read -n 1 -p "请输入你的性别(m/f):" SEX
- 请输入你的性别(m/f):mroot@linux01:/home/script#
- root@linux01:/home/script# echo $SEX
- m
- root@linux01:/home/script# read -n 1 -p "按任意键退出:"
- 按任意键退出:
- root@linux01:/home/script#
Shell支持很多运算符,包括算术运算符、关系运算符、布尔运算符、字符串运算符、逻辑运算符和文件测试运算符等。
原生的bash并不支持简单的数学运算,但可以通过其他命令来完成。如awk和expr。expr是一个表达式计算命令,使用它能完成表达式的求值操作。
【例】求两个数相加之和,编写add.sh文件
- root@linux01:/home/script# vim add.sh #写入shell脚本文件
- root@linux01:/home/script# cat add.sh #文件内容如下
- #!bin/bash
- #文件名:add.sh
- #版本:1.1
- #制作人:zhy
- #功能:求和
-
- VAR=`expr 3 + 6`
- echo "两个数相加为" $VAR
- root@linux01:/home/script# chmod a+x add.sh
- root@linux01:/home/script# . add.sh
- 两个数相加为 9
- root@linux01:/home/script#
表达式和运算符之间要有空格,例如”3+6“是不对的,必须写成”3 + 6“。且完整的表达式要加反引号('`)。
反引号位置:“Esc”键的下方,“Tab”键的上方,数字“1”的 左侧,输入时要使用英文半角模式
算术运算符有以下几个:
+(加法):
-(减法):
*(乘法):
/(除法):
%(取余):
=(赋值):
==(相等):
!=(不相等):
【例】运用算数运算符进行综合运算
vim zhys.sh #新建zhys.sh文件,并写入以下内容
- #!/bin/bash
- #文件名:zhys.sh
- #版本:v1.1
- #功能:运用算术运算符进行综合运算
- X=100
- Y=5
- VAR=`expr $X + $Y`
- echo "X+Y=$VAR"
-
- VAR=`expr $X - $Y`
- echo "X-Y=$VAR"
-
- VAR=`expr $X \* $Y`
- echo "X*Y=$VAR"
-
- VAR=`expr $X / $Y`
- echo "X/Y=$VAR"
-
- VAR=`expr $X + $Y`
-
- if [ $X == $Y ];then
- echo "X等于Y"
- fi
- if [ $X != $Y ];then
- echo "X不等于Y"
- fi
- chmod a+x zhys.sh #修改文件执行权限
-
- root@linux01:/home/script# chmod a+x zhys.sh
- root@linux01:/home/script# . zhys.sh #运行文件
注意:乘号(*)前必须加反斜杠(\)才能实现乘法运算,条件表达式必须放在方括号之间,且必须要有空格。
关系运算符只支持数字、不支持字符串,除非字符串的值是数字。
常用的关系运算符,假定变量X为10,变量Y为20。
运算符 | 功能说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等则返回true == | [ $X -eq $Y ]返回false |
-ne | 检测两个数是否相等,不相等则返回true!= | [ $X -gt $Y ]返回true |
-gt | 检测运算符左边的数是否大于运算符右边的数,如果是,则返回true > | [ $X -gt $Y ]返回false |
-lt | 检测运算符左边的数是否小于运算符右边的数,如果是,则返回true < | [ $X -lt $Y ]返回true |
-ge | 检测运算符左边的数是否大于等于运算符右边的数,如果是,则返回true >= | [ $X -ge $Y ]返回false |
-le | 检测运算符左边的数是否小于等于运算符右边的数,如果是,则返回true <= | [ $X -le $Y ]返回true |
root@linux01:/home/script# vim gxys.sh #创建脚本文件,写入如下内容
文件内容如下:
- #!/bin/bash
- #文件名:gxys.sh
- #版本:v1.1
- #功能:运用关系运算符进行综合运算
- X=10
- Y=20
-
- if [ $X -eq $Y ];then
- echo "$X -eq $Y:X等于Y"
- else
- echo "$X -eq $Y:X不等于Y"
- fi
-
- if [ $X -ne $Y ]
- then
- echo "$X -nt $Y:X不等于Y"
- else
- echo "$X -nt $Y:X等于Y"
- fi
-
- if [ $X -gt $Y ]
- then
- echo "$X -gt $Y:X大于Y"
- else
- echo "$X -gt $Y:X不大于Y"
- fi
-
- if [ $X -lt $Y ]
- then
- echo "$X -lt $Y:X小于Y"
- else
- echo "$X -lt $Y:X不小于Y"
- fi
-
- if [ $X -ne $Y ]
- then
- echo "$X -ne $Y:X不等于Y"
- else
- echo "$X -ne $Y:X等于Y"
- fi
-
- if [ $X -ge $Y ]
- then
- echo "$X -ge $Y:X大于或等于Y"
- else
- echo "$X -ge $Y:X小于Y"
- fi
-
- if [ $X -le $Y ]
- then
- echo "$X -le $Y:X小于或等于Y"
- else
- echo "$X -le $Y:X大于Y"
- fi
root@linux01:/home/script#. gxys.sh #执行脚本
常用的布尔运算符
运算符 | 功能说明 | 举例 |
---|---|---|
-a | 与运算符,两个表达式都为true时才返回true | [ $X -lt 20 -a $Y -gt 10] 返回true |
-o | 或运算符,有一个表达式为true时,返回true | [ $X -lt 20 -o $Y -gt 10] 返回true |
! | 非运算符,表达式为true时返回false,否则返回true | [ !false ]返回true |
常用的字符串运算符
运算符 | 功能说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等则返回true | [ $X = $Y ]返回false |
!= | 检测两个字符串是否不相等,不相等则返回true | [ $X != $Y ]返回true |
-z | 检测字符串长度是否为0,为0则返回true | [ -z $X ]返回false |
-n | 检测字符串长度是否不为0,不为0则返回true | [ -n" $X" ]返回true |
$ | 检测字符串是否为空,不为空则返回true | [ $X ]返回true |
常用的逻辑运算符
运算符 | 功能说明 | 举例 |
---|---|---|
&& | 逻辑与 | [ $X -lt 100 && $Y -gt 100 ] 返回false |
|| | 逻辑或 | [ $X -lt 100 || $Y -gt 100 ] 返回true |
常用的文件测试运算符
运算符 | 功能说明 | 举例 |
---|---|---|
-b file | 检测文件是否为块设备文件,如果是,则返回true | [ -b $file ] 返回false |
-c file | 检测文件是否为字符设备文件,如果是,则返回true | [ -c $file ] 返回false |
-d file | 检测文件是否为目录设备文件,如果是,则返回true | [ -d $file ] 返回false |
-f file | 检测文件是否为普通文件(既不是目录文件,也不是设备文件),如果是,则返回true | [ -f $file ] 返回false |
-g file | 检测文件是否设置了SGID位,如果是,则返回true | [ -g $file ] 返回false |
-k file | 检测文件是否设置了粘滞位,如果是,则返回true | [ -k $file ] 返回false |
-p file | 检测文件是否为有名管道,如果是,则返回true | [ -p $file ] 返回false |
-u file | 检测文件是否设置了SUID位,如果是,则返回true | [ -u $file ] 返回false |
-r file | 检测文件是否可读,如果是,则返回true | [ -r $file ] 返回false |
-w file | 检测文件是否可写,如果是,则返回true | [ -w $file ] 返回false |
-x file | 检测文件是否可执行,如果是,则返回true | [ -x $file ] 返回false |
-s file | 检测文件是否为空(文件大小是否大于0),如果不为空,则返回true | [ -s $file ] 返回false |
-e file | 检测文件(包括目录)是否存在,如果是,则返回true | [ -e $file ] 返回false |
在shell中,$()和``都可以用于命令替换。
- version=$(uname -r)
- echo $version
-
- version=`uname -r`
- echo $version
采用这两种方式都可以得到内核的版本号
各自优缺点:
(1)$()的优缺点
优点:输入直观,不容易输入错误或看错。
缺点:并不是所有的Shell都支持$()
(2)``的优缺点
优点:``基本可在全部的Linux Shell中使用,若写成Shell Script,则其移植性比较高。
缺点:``很容易输入错误或者看错。
${}用于变量替换,一般情况下,$VAR与$(VAR)并没有什么不同,但是${}能比较精确地界定变量名称的范围。
例如
- X=Y
- echo $XY
- echo ${X}Y
这里原本是打算先将$X 的结果替换出来,再补字母 Y 于其后,但在命令行中真正的结果是替换了变量名为XY 的值。使用${}后就不会出现这个问题了。
作用类似,用于数学运算,支持+、-、*、/、%(加、减、乘、除、取余)运算,注意bash只能进行整数运算,浮点数是被当作字符串处理的。
- root@linux01:/home/script# X=10;Y=20;Z=30
- root@linux01:/home/script# echo $X
- 10
- root@linux01:/home/script# echo $Y
- 20
- root@linux01:/home/script# echo $Z
- 30
- root@linux01:/home/script# echo $((X+Y*Z))
- 610
- root@linux01:/home/script# echo $(((X+Y)/Z))
- 1
- root@linux01:/home/script# echo $(((X+Y)%Z))
- 0
- root@linux01:/home/script# echo $[X+Y*Z]
- 610
- root@linux01:/home/script# echo $[(X+Y)/Z]
- 1
- root@linux01:/home/script# echo $[(X+Y)%Z]
- 0
- root@linux01:/home/script#
[ ]为test命令的另一种形式,但使用时要注意以下几点。
(1)必须在其左括号的右侧和右括号的左侧各加一个空格,否则会报错。
(2)test命令使用标准的数学比较符号来表示字符串的比较,而[]使用文体符号来表示数值的比较。
(3)大于符号或小于符号必须要进行转义,否则会被理解成重定向操作。
(( )) 和 [[ ]]分别是[]针对数学比较表达式和字符串表达式的加强版。
[[ ]]增加了模式匹配特效。
(( ))不需要再将表达式中的大于或小于符号转义,其除了可以使用标准的算术运算符外,还增加了以下运算符:
a++(后增)、a--(后减)、++a(先增)、--a(先减)、!(逻辑求反)、~(位求反)、**(幂运算)、<<(左位移)、>>(右位移)、&(位布尔与)、|(位布尔或)、&&(逻辑与)、||(逻辑或)。
Shell流程控制语句是指改变Shell程序运行顺序的指令,可以是不同位置的指令,或者在两段或多段程序中选择一个。
Shell流程控制语句一般可以分为以下几种。
(1)无条件语句:继续运行位于不同位置的一段指令。
(2)条件语句:特定条件成立时,运行一段指令,如单分支if条件语句、多分支if条件语句、case语句。
(3)循环语句:运行一段指令若干次,直到特定条件成立为止,如for循环、while循环、until循环。
(4)跳转语句:运行位于不同位置的一段指令,但完成后仍会继续运行原来要运行的指令。
(5)停止程序语句:不运行任何指令(无条件终止)。Shell流程分支控制语句可以使用单分支if条件语句、多分支if条件语句和case语句,下面分别举例介绍一下。
其语法格式如下。
- if [ 条件判断 ];then
- 程序
- fi
- 或者
-
- if [ 条件判断 ]
- then
- 程序
- fi
注意:
(1)if语句使用fi结尾,和一般程序设计语言使用花括号结尾不同。
(2)[ 条件判断 ]就是使用test命令进行判断,所以方括号和条件判断之间必须有空格,否则会报错。
(3)then 后接符合条件之后执行的程序,then可以放在[ 条件判断 ]之后,用“;”分隔,也可以换行写,此时不再需要“;”。
其语法格式如下。
- if [条件判断1]
- then
- 当条件判断1成立时,执行程序1
- elif [条件判断2]
- then
- 当条件判断2成立时,执行程序2
- 省略更多条件
- else
- 当所有条件都不成立时,最后执行的程序
- fi
【例】成绩测验
运用多分支if条件语句,编写一段脚本,输入一个测验成绩,根据下面的标准,输出成绩的评分(A~E)。
A(优秀):90~100。
B(良好): 80~89。
C(中等):70~79。
D(合格):60~69。
E(不合格):0~59。
- root@linux01:/home/script# vim if-select.sh
- root@linux01:/home/script# cat if-select.sh
- #!/bin/bash
- #文件名:if-select.sh
- #版本:v1.1
- #功能:多分支if条件语句测试
- read -p "请输入您的成绩:" x
- if [[ "$x" -ge "90" && "$x" -le "100" ]];then
- echo "您的成绩为A(优秀)"
- elif [[ "$x" -ge "80" && "$x" -le "89" ]];then
- echo "您的成绩为B(良好)"
- elif [[ "$x" -ge "70" && "$x" -le "79" ]];then
- echo "您的成绩为C(中等)"
- elif [[ "$x" -ge "60" && "$x" -le "69" ]];then
- echo "您的成绩为D(合格)"
- elif [[ "$x" -lt "60" ]];then
- echo "您的成绩为E(不合格)"
- else
- echo "输入错误"
- fi
- root@linux01:/home/script# chmod a+x if-select.sh
- root@linux01:/home/script# . if-select.sh
- 请输入您的成绩:88
- 您的成绩为B(良好)
- root@linux01:/home/script#
相当于一个多分支的if条件语句,case变量的值用来匹配value1、value2、value3、value4等,匹配之后执行其后的命令,直到遇到双分号(;;)为止,case命令以esac作为终止符。
其语法格式如下。
- case 值 in
- value1)
- command1
- command2
- command3
- ……
- commandN
- ;;
- ……
- valueN)
- command1
- command2
- command3
- ……
- commandN
- ;;
- esac
【例】运用case语句,编写成绩评分脚本
输入数值1~5,根据提示信息,输出成绩的评分(A~E)。
- #!/bin/bash
- #文件名:case.sh
- #版本:v1.1
- #功能:case语句测试
-
- read -p "【1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):" x
- case $x in
- 1) echo "您的成绩为A(优秀)"
- ;;
- 2) echo "您的成绩为B(良好)"
- ;;
- 3) echo "您的成绩为C(中等)"
- ;;
- 4) echo "您的成绩为D(合格)"
- ;;
- 5) echo "您的成绩为E(不合格)"
- ;;
- esac
- root@linux01:/home/script# vim scse.sh
- admin@linux01:~$ chmod a+x case.sh
- admin@linux01:~$ . case.sh
- 【1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):1
- 您的成绩为A(优秀)
- admin@linux01:~$ . case.sh
- 【1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):2
- 您的成绩为B(良好)
- admin@linux01:~$ . case.sh
- 【1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):3
- 您的成绩为C(中等)
- admin@linux01:~$ . case.sh
- 【1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):4
- 您的成绩为D(合格)
- admin@linux01:~$ . case.sh
- 【1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):5
- 您的成绩为E(不合格)
- admin@linux01:~$
Shell流程循环控制语句可以使用for循环语句、while循环语句和until循环语句,下面分别举例介绍一下。
for循环语句用来在一个列表中执行有限次的命令。
for命令后跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量),第一次执行for循环语句时,字符串列表中的第一个字符会赋值给自定义变量,并执行循环体,直到遇到done语句;第二次执行for循环语句时,会将字符串列表中的第二个字符赋值给自定义变量,以此类推,直到字符串列表遍历完毕。
其语法格式如下。
- for NAME [in WORD…] ;do COMMANDS; done
- for((exp1;exp2;exp3 ));do COMMANDS; done
- NAME 变量
- [in WORDS … 执行列表
- do COMMANDS 执行操作
- done 结束符
【例】从键盘输入一个数字N,计算1+2+3+...+N的和。
- #!/bin/bash
- #文件名:for.sh
- #版本:v1.1
- #功能:运用for循环计算1+2+3+...+N的和
-
- read -p "请输入数字,将要计算1+2+3...+N之和:" N
- sum=0
- for((i=1;i<=$N;i=i+1))
- do
- sum=$(($sum + $i))
- done
- echo "结果为 '1+2+3+...+$N' ==>$sum"
- root@linux01:/home/script# chmod a+x for.sh
- root@linux01:/home/script# . for.sh
- 请输入数字,将要计算1+2+3+...+N之和:100
- 结果为‘1+2+3+...+100’ ==> 5050
- root@linux01:/home/script#
while循环语句用于重复同一组命令。其语法格式如下。
- while EXPRESSION; do COMMANDS; done
- while ((exp1;exp2;exp3 ));do COMMANDS;done
【例】while循环计算1+2+3+...+N的和
- #!/bin/bash
- #文件名:while.sh
- #版本:v1.1
- #功能:运用while循环计算1+2+3+...+N的和
-
- read -p "请输入数字,将要计算1+2+3...+N之和:" N
- sum=0
- i=0
- while (( $i != $N ))
- do
- i=$(($i+1))
- sum=$(($sum+$i))
- done
- echo "结果为'1+2+3+...+$N' ==>$sum"
- root@linux01:/home/script# chmod a+x while.sh
- root@linux01:/home/script# . while.sh
- 请输入数字,将要计算1+2+3+...+N之和:100
- 结果为‘1+2+3+...+100' ==>5050
- root@linux01:/home/script#
until循环语句和while循环语句类似,区别是until循环语句在条件为真时退出循环,在条件为假时继续执行循环;而while循环语句在条件为假时退出循环,在条件为真时继续执行循环。
其语法格式如下。
- until EXPRESSION; do COMMANDS; done
- until ((exp1;exp2;exp3 ));do COMMANDS; done
【例】运用until循环计算1+2+3+...+N的和
- #!/bin/bash
- #文件名:until.sh
- #版本:v1.1
- #功能:运用until循环计算1+2+3+...+N的和
-
- read -p "请输入数字,将要计算1+2+3...+N之和:" N
- sum=0
- i=0
- until (( $i == $N ))
- do
- i=$(($i+1))
- sum=$(($sum+$i))
- done
- echo "结果为'1+2+3+...+$N' ==>$sum"
- admin@linux01:~$ chmod a+x until.sh
- admin@linux01:~$ . until.sh
- 请输入数字,将要计算1+2+3...+N之和:100
- 结果为'1+2+3+...+100' ==>5050
- admin@linux01:~$
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。