当前位置:   article > 正文

Ubuntu Linux操作系统——项目7 Shell编程基础

Ubuntu Linux操作系统——项目7 Shell编程基础

【学习目标】

• 理解Shell Script的建立与执行。

• 理解Shell变量的种类和作用。

• 理解Shell运算符关系。

• 掌握Shell Script的运行方式以及程序设计的流程控制。

7.1 项目陈述

在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编写。

7.2 必备知识

7.2.1 Shell Script简介

shell Script就是针对Shell所写的脚本。

其实,shell Script是利用Shell的功能所写的一个程序。这个程序使用了纯文本文件,将一些shell的语法与命令和正则表达式、管道命令与数据流重定向等功能搭配起来,以达到所想要的处理目的。

7.2.2 Shell Script的建立和执行

1.Shell Script编写注意事项
  1. 命令的运行是从上而下。从左至右进行的。

  2. 命令、参数与选项间的多个空格都会被忽略

  3. 空白行会被忽略,按“Tab”键所生成的空白行被视为空格键

  4. 如果读取到一个换行(CR)符号,则尝试开始运行改行命令。

  5. 如果一行的内容太多,则可以使用“\[Enter]”来延伸至下一行

  6. “#”可以作为注释,任何加在“#”后面的数据都会全部被视为注释文字而被忽略。

2.运行Shell Script

现在假设程序文件是/home/script/shell01.sh,那么如何运行这个文件呢?执行Shell Script 时可以采用以下3种方式。

(1)输入脚本绝对路径或者相对路径

  1. root@linux01:/home/admin# mkdir /home/script -p
  2. root@linux01:/home/admin# cd /home/script/
  3. root@linux01:/home/script# vim shell01.sh #编写shell01.sh文件,内容如下
  4. #!/bin/bash
  5. echo hello everyone welcome to here!
  6. root@linux01:/home/script# chmod a+x shell01.sh #修改用户执行权限
  7. root@linux01:/home/script# /home/script/shell01.sh #以绝对路径方式执行
  8. hello everyone welcome to here!
  9. root@linux01:/home/script# . /home/script/shell01.sh #“.”后面需要有空格
  10. hello everyone welcome to here!
  11. root@linux01:/home/script# ./shell01.sh #以相对路径方式执行“.”后无空格
  12. hello everyone welcome to here!
  13. root@linux01:/home/script#

(2)执行bash或SH脚本

  1. root@linux01:/home/script# bash /home/script/shell01.sh
  2. hello everyone welcome to here!
  3. root@linux01:/home/script# sh /home/script/shell01.sh
  4. hello everyone welcome to here!

(3)在脚本路径前加 “." 或source

  1. root@linux01:/home/script# . shell01.sh
  2. hello everyone welcome to here!
  3. root@linux01:/home/script# source shell01.sh
  4. hello everyone welcome to here!
  5. root@linux01:/home/script# source /home/script/shell01.sh
  6. hello everyone welcome to here!
  7. root@linux01:/home/script#

注意:将shell文件修改为可执行文件

  1. chmod 777 shell01.sh
  2. #或者
  3. chmod a+x shell01.sh
3.编写Shell Script

一个shell Script脚本通常包含如下部分

(1)首行:表示脚本将要调用shell解释器

#!/bin/bash

”#!“ 符号能够被内核识别为一个脚本的开始,其必须位于脚本首行

“/bin/bash”是bash程序的绝对路径,表示后续的内容通过bash程序解释执行

(2)注释:注释符号”#“需放在要注释的内容前面,用于备注shell script的功能以防日后忘记

(3)可执行内容:经常使用的Linux命令或程序语言组成。

【例】编写shell script,实现Firefox软件包的自动安装

  1. root@linux01:/home/script# vim firefox.sh 编写sh文件,内容如下
  2. #!bin/bash
  3. #FireFox软件包安装
  4. #version:1.0
  5. #制作人:zhy
  6. #版权声明:free
  7. apt update
  8. apt install firefox
  9. echo "firefox已安装成功"
  10. echo "welcome to Ubuntu"
  11. root@linux01:/home/script# . firefox.sh #执行shell脚本文件

命令执行结果如下:

4.养成编写Shell Script的良好习惯

养成编写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有额外的语法检测机制,能够在编写时发现语法方面的问题。

7.2.3 Shell变量

在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.变量使用

习惯上使用大写字母来命名变量,变量名以字母或下划线开头,不能以数字开头。在使用变量时,要在变量名前加 “$”

(1)变量赋值

  1. root@linux01:/home/script# A=5;B=10 #变量赋值,等号两侧不能有空格
  2. root@linux01:/home/script# echo $A $B #打印变量的值时,前面要加$符号
  3. 5 10
  4. root@linux01:/home/script# STR="hello everyone" #赋值字符串
  5. root@linux01:/home/script# echo $STR
  6. hello everyone
  7. root@linux01:/home/script#

(2)使用单引号和双引号的区别

  1. root@linux01:/home/script# NUM=8
  2. root@linux01:/home/script# SUM="$NUM hello"
  3. root@linux01:/home/script# echo $SUM
  4. 8 hello
  5. root@linux01:/home/script# SUM2='$NUM hello'
  6. root@linux01:/home/script# echo $SUM2
  7. $NUM hello
  8. root@linux01:/home/script#

单引号中的内容会全部输出,双引号中的内容会有所变化,因为双引号会对所有特殊字符进行转义。

(3)列出所有变量

set	#列出所有变量

(4)删除变量

  1. root@linux01:/home/script# unset A #撤销变量A
  2. root@linux01:/home/script# echo $A
  3. root@linux01:/home/script#
  4. #若声明的是静态变量,则不能使用unset命令进行撤销操作
  5. root@linux01:/home/script# readonly B
  6. root@linux01:/home/script# echo $B
  7. 10
  8. root@linux01:/home/script# unset B
  9. bash: unset: B:无法取消设定: 只读 variable
  10. root@linux01:/home/script# echo $B
  11. 10
  12. root@linux01:/home/script#
2.环境变量

用户自定义变量只在当前的shell中有效,而环境变量则会在当前shell及其所有子shell中生效。

如果将环境变量写入相应的配置文件,则这个环境变量将会在所有的shell中生效。

3.位置参数变量
  • $n:$0代表命令本身,$1-9代表接收的第1-9个参数,10及以上需要用{}括起来。${10}

  • $*:代表接收所有参数,将所有参数看作一个整体。

  • $@:代表接收所有参数,将每个参数区别对待

  • $#:代表接收的参数个数

4.预定义变量

在shell中已经定义的变量,和默认环境变量有一些类似。预定义变量不能重新定义,用户只能根据shell的定义来使用这些变量。

预定义变量及其功能:

预定义变量功能说明
$?最后一次执行的命令的返回状态。如果这个变量的值为0,则证明上一条命令执行正确;如果这个变量的值为非0(具体数字自己决定),则证明上一条命令执行错误。
$$当前进程的进程号
$!后台运行的最后一个进程的进程号

严格来说,位置参数变量是预定义变量的一种,只是位置参数变量的作用比较统一,所以这里将位置参数变量单独划分为一类变量。

5.read命令

命令格式如下:

read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]

使用read命令执行如下操作:

  1. root@linux01:/home/script# read -p "请输入你的名字:" NAME
  2. 请输入你的名字:zhy
  3. root@linux01:/home/script# echo $NAME
  4. zhy
  5. root@linux01:/home/script# read -n 1 -p "请输入你的性别(m/f):" SEX
  6. 请输入你的性别(m/f):mroot@linux01:/home/script#
  7. root@linux01:/home/script# echo $SEX
  8. m
  9. root@linux01:/home/script# read -n 1 -p "按任意键退出:"
  10. 按任意键退出:
  11. root@linux01:/home/script#

7.2.4 Shell运算符

Shell支持很多运算符,包括算术运算符、关系运算符、布尔运算符、字符串运算符、逻辑运算符和文件测试运算符等。

1.算术运算符

原生的bash并不支持简单的数学运算,但可以通过其他命令来完成。如awk和expr。expr是一个表达式计算命令,使用它能完成表达式的求值操作。

【例】求两个数相加之和,编写add.sh文件

  1. root@linux01:/home/script# vim add.sh #写入shell脚本文件
  2. root@linux01:/home/script# cat add.sh #文件内容如下
  3. #!bin/bash
  4. #文件名:add.sh
  5. #版本:1.1
  6. #制作人:zhy
  7. #功能:求和
  8. VAR=`expr 3 + 6`
  9. echo "两个数相加为" $VAR
  10. root@linux01:/home/script# chmod a+x add.sh
  11. root@linux01:/home/script# . add.sh
  12. 两个数相加为 9
  13. root@linux01:/home/script#

表达式和运算符之间要有空格,例如”3+6“是不对的,必须写成”3 + 6“。且完整的表达式要加反引号('`)

反引号位置:“Esc”键的下方,“Tab”键的上方,数字“1”的 左侧,输入时要使用英文半角模式

算术运算符有以下几个:

  1. +(加法):

  2. -(减法):

  3. *(乘法):

  4. /(除法):

  5. %(取余):

  6. =(赋值):

  7. ==(相等):

  8. !=(不相等):

【例】运用算数运算符进行综合运算

vim zhys.sh    #新建zhys.sh文件,并写入以下内容
  1. #!/bin/bash
  2. #文件名:zhys.sh
  3. #版本:v1.1
  4. #功能:运用算术运算符进行综合运算
  5. X=100
  6. Y=5
  7. VAR=`expr $X + $Y`
  8. echo "X+Y=$VAR"
  9. VAR=`expr $X - $Y`
  10. echo "X-Y=$VAR"
  11. VAR=`expr $X \* $Y`
  12. echo "X*Y=$VAR"
  13. VAR=`expr $X / $Y`
  14. echo "X/Y=$VAR"
  15. VAR=`expr $X + $Y`
  16. if [ $X == $Y ];then
  17. echo "X等于Y"
  18. fi
  19. if [ $X != $Y ];then
  20. echo "X不等于Y"
  21. fi
 
  1. chmod a+x zhys.sh #修改文件执行权限
  2. root@linux01:/home/script# chmod a+x zhys.sh
  3. root@linux01:/home/script# . zhys.sh #运行文件

注意:乘号(*)前必须加反斜杠(\)才能实现乘法运算,条件表达式必须放在方括号之间,且必须要有空格。

2.关系运算符

关系运算符只支持数字、不支持字符串,除非字符串的值是数字。

常用的关系运算符,假定变量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	 #创建脚本文件,写入如下内容

文件内容如下:

  1. #!/bin/bash
  2. #文件名:gxys.sh
  3. #版本:v1.1
  4. #功能:运用关系运算符进行综合运算
  5. X=10
  6. Y=20
  7. if [ $X -eq $Y ];then
  8. echo "$X -eq $Y:X等于Y"
  9. else
  10. echo "$X -eq $Y:X不等于Y"
  11. fi
  12. if [ $X -ne $Y ]
  13. then
  14. echo "$X -nt $Y:X不等于Y"
  15. else
  16. echo "$X -nt $Y:X等于Y"
  17. fi
  18. if [ $X -gt $Y ]
  19. then
  20. echo "$X -gt $Y:X大于Y"
  21. else
  22. echo "$X -gt $Y:X不大于Y"
  23. fi
  24. if [ $X -lt $Y ]
  25. then
  26. echo "$X -lt $Y:X小于Y"
  27. else
  28. echo "$X -lt $Y:X不小于Y"
  29. fi
  30. if [ $X -ne $Y ]
  31. then
  32. echo "$X -ne $Y:X不等于Y"
  33. else
  34. echo "$X -ne $Y:X等于Y"
  35. fi
  36. if [ $X -ge $Y ]
  37. then
  38. echo "$X -ge $Y:X大于或等于Y"
  39. else
  40. echo "$X -ge $Y:X小于Y"
  41. fi
  42. if [ $X -le $Y ]
  43. then
  44. echo "$X -le $Y:X小于或等于Y"
  45. else
  46. echo "$X -le $Y:X大于Y"
  47. fi
 
root@linux01:/home/script#. gxys.sh 	#执行脚本
3.布尔运算符

常用的布尔运算符

运算符功能说明举例
-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
4.字符串运算符

常用的字符串运算符

运算符功能说明举例
=检测两个字符串是否相等,相等则返回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
5.逻辑运算符

常用的逻辑运算符

运算符功能说明举例
&&逻辑与[ $X -lt 100 && $Y -gt 100 ] 返回false
||逻辑或[ $X -lt 100 || $Y -gt 100 ] 返回true
6.文件测试运算符

常用的文件测试运算符

运算符功能说明举例
-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
7.$( )和``

在shell中,$()和``都可以用于命令替换。

  1. version=$(uname -r)
  2. echo $version
  3. version=`uname -r`
  4. echo $version

采用这两种方式都可以得到内核的版本号

各自优缺点:

(1)$()的优缺点

优点:输入直观,不容易输入错误或看错。

缺点:并不是所有的Shell都支持$()

(2)``的优缺点

优点:``基本可在全部的Linux Shell中使用,若写成Shell Script,则其移植性比较高。

缺点:``很容易输入错误或者看错。

8.${}

${}用于变量替换,一般情况下,$VAR与$(VAR)并没有什么不同,但是${}能比较精确地界定变量名称的范围。

例如

  1. X=Y
  2. echo $XY
  3. echo ${X}Y

这里原本是打算先将$X 的结果替换出来,再补字母 Y 于其后,但在命令行中真正的结果是替换了变量名为XY 的值。使用${}后就不会出现这个问题了。

9.$[ ]和$(( ))

作用类似,用于数学运算,支持+、-、*、/、%(加、减、乘、除、取余)运算,注意bash只能进行整数运算,浮点数是被当作字符串处理的。

  1. root@linux01:/home/script# X=10;Y=20;Z=30
  2. root@linux01:/home/script# echo $X
  3. 10
  4. root@linux01:/home/script# echo $Y
  5. 20
  6. root@linux01:/home/script# echo $Z
  7. 30
  8. root@linux01:/home/script# echo $((X+Y*Z))
  9. 610
  10. root@linux01:/home/script# echo $(((X+Y)/Z))
  11. 1
  12. root@linux01:/home/script# echo $(((X+Y)%Z))
  13. 0
  14. root@linux01:/home/script# echo $[X+Y*Z]
  15. 610
  16. root@linux01:/home/script# echo $[(X+Y)/Z]
  17. 1
  18. root@linux01:/home/script# echo $[(X+Y)%Z]
  19. 0
  20. root@linux01:/home/script#
10.[ ]

[ ]为test命令的另一种形式,但使用时要注意以下几点。

(1)必须在其左括号的右侧和右括号的左侧各加一个空格,否则会报错。

(2)test命令使用标准的数学比较符号来表示字符串的比较,而[]使用文体符号来表示数值的比较。

(3)大于符号或小于符号必须要进行转义,否则会被理解成重定向操作。

11.(( ))和[[ ]]

(( )) 和 [[ ]]分别是[]针对数学比较表达式和字符串表达式的加强版。

[[ ]]增加了模式匹配特效。

(( ))不需要再将表达式中的大于或小于符号转义,其除了可以使用标准的算术运算符外,还增加了以下运算符:

a++(后增)、a--(后减)、++a(先增)、--a(先减)、!(逻辑求反)、~(位求反)、**(幂运算)、<<(左位移)、>>(右位移)、&(位布尔与)、|(位布尔或)、&&(逻辑与)、||(逻辑或)。

7.3 项目实施

7.3.1 Shell流程分支控制语句

Shell流程控制语句是指改变Shell程序运行顺序的指令,可以是不同位置的指令,或者在两段或多段程序中选择一个。

Shell流程控制语句一般可以分为以下几种。

(1)无条件语句:继续运行位于不同位置的一段指令。

(2)条件语句:特定条件成立时,运行一段指令,如单分支if条件语句、多分支if条件语句、case语句。

(3)循环语句:运行一段指令若干次,直到特定条件成立为止,如for循环、while循环、until循环。

(4)跳转语句:运行位于不同位置的一段指令,但完成后仍会继续运行原来要运行的指令。

(5)停止程序语句:不运行任何指令(无条件终止)。Shell流程分支控制语句可以使用单分支if条件语句、多分支if条件语句和case语句,下面分别举例介绍一下。

1.单分支if条件语句

其语法格式如下。

  1. if [ 条件判断 ];then
  2. 程序
  3. fi
  4. 或者
  5. if [ 条件判断 ]
  6. then
  7. 程序
  8. fi

注意:

(1)if语句使用fi结尾,和一般程序设计语言使用花括号结尾不同。

(2)[ 条件判断 ]就是使用test命令进行判断,所以方括号和条件判断之间必须有空格,否则会报错。

(3)then 后接符合条件之后执行的程序,then可以放在[ 条件判断 ]之后,用“;”分隔,也可以换行写,此时不再需要“;”。

2.多分支if条件语句

其语法格式如下。

  1. if [条件判断1]
  2. then
  3. 当条件判断1成立时,执行程序1
  4. elif [条件判断2]
  5. then
  6. 当条件判断2成立时,执行程序2
  7. 省略更多条件
  8. else
  9. 当所有条件都不成立时,最后执行的程序
  10. fi

【例】成绩测验

运用多分支if条件语句,编写一段脚本,输入一个测验成绩,根据下面的标准,输出成绩的评分(A~E)。

A(优秀):90~100。

B(良好): 80~89。

C(中等):70~79。

D(合格):60~69。

E(不合格):0~59。

  1. root@linux01:/home/script# vim if-select.sh
  2. root@linux01:/home/script# cat if-select.sh
  1. #!/bin/bash
  2. #文件名:if-select.sh
  3. #版本:v1.1
  4. #功能:多分支if条件语句测试
  5. read -p "请输入您的成绩:" x
  6. if [[ "$x" -ge "90" && "$x" -le "100" ]];then
  7. echo "您的成绩为A(优秀)"
  8. elif [[ "$x" -ge "80" && "$x" -le "89" ]];then
  9. echo "您的成绩为B(良好)"
  10. elif [[ "$x" -ge "70" && "$x" -le "79" ]];then
  11. echo "您的成绩为C(中等)"
  12. elif [[ "$x" -ge "60" && "$x" -le "69" ]];then
  13. echo "您的成绩为D(合格)"
  14. elif [[ "$x" -lt "60" ]];then
  15. echo "您的成绩为E(不合格)"
  16. else
  17. echo "输入错误"
  18. fi
 
  1. root@linux01:/home/script# chmod a+x if-select.sh
  2. root@linux01:/home/script# . if-select.sh
  3. 请输入您的成绩:88
  4. 您的成绩为B(良好)
  5. root@linux01:/home/script#
3.case语句

相当于一个多分支的if条件语句,case变量的值用来匹配value1、value2、value3、value4等,匹配之后执行其后的命令,直到遇到双分号(;;)为止,case命令以esac作为终止符。

其语法格式如下。

  1. case 值 in
  2. value1)
  3. command1
  4. command2
  5. command3
  6. ……
  7. commandN
  8. ;;
  9. ……
  10. valueN)
  11. command1
  12. command2
  13. command3
  14. ……
  15. commandN
  16. ;;
  17. esac

【例】运用case语句,编写成绩评分脚本

输入数值1~5,根据提示信息,输出成绩的评分(A~E)。

  1. #!/bin/bash
  2. #文件名:case.sh
  3. #版本:v1.1
  4. #功能:case语句测试
  5. read -p "【1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):" x
  6. case $x in
  7. 1) echo "您的成绩为A(优秀)"
  8. ;;
  9. 2) echo "您的成绩为B(良好)"
  10. ;;
  11. 3) echo "您的成绩为C(中等)"
  12. ;;
  13. 4) echo "您的成绩为D(合格)"
  14. ;;
  15. 5) echo "您的成绩为E(不合格)"
  16. ;;
  17. esac
 
  1. root@linux01:/home/script# vim scse.sh
  2. admin@linux01:~$ chmod a+x case.sh
  3. admin@linux01:~$ . case.sh
  4. 1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):1
  5. 您的成绩为A(优秀)
  6. admin@linux01:~$ . case.sh
  7. 1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):2
  8. 您的成绩为B(良好)
  9. admin@linux01:~$ . case.sh
  10. 1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):3
  11. 您的成绩为C(中等)
  12. admin@linux01:~$ . case.sh
  13. 1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):4
  14. 您的成绩为D(合格)
  15. admin@linux01:~$ . case.sh
  16. 1:优秀,2:良好,3:中等,4:合格,5:不合格】 请输入数字(1~5):5
  17. 您的成绩为E(不合格)
  18. admin@linux01:~$

7.3.2 Shell流程循环控制语句

Shell流程循环控制语句可以使用for循环语句、while循环语句和until循环语句,下面分别举例介绍一下。

1.for循环语句

for循环语句用来在一个列表中执行有限次的命令。

for命令后跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量),第一次执行for循环语句时,字符串列表中的第一个字符会赋值给自定义变量,并执行循环体,直到遇到done语句;第二次执行for循环语句时,会将字符串列表中的第二个字符赋值给自定义变量,以此类推,直到字符串列表遍历完毕。

其语法格式如下。

  1. for NAME [in WORD…] ;do COMMANDS; done
  2. for((exp1;exp2;exp3 ));do COMMANDS; done
  3. NAME 变量
  4. [in WORDS … 执行列表
  5. do COMMANDS 执行操作
  6. done 结束符

【例】从键盘输入一个数字N,计算1+2+3+...+N的和。

  1. #!/bin/bash
  2. #文件名:for.sh
  3. #版本:v1.1
  4. #功能:运用for循环计算1+2+3+...+N的和
  5. read -p "请输入数字,将要计算1+2+3...+N之和:" N
  6. sum=0
  7. for((i=1;i<=$N;i=i+1))
  8. do
  9. sum=$(($sum + $i))
  10. done
  11. echo "结果为 '1+2+3+...+$N' ==>$sum"
 
  1. root@linux01:/home/script# chmod a+x for.sh
  2. root@linux01:/home/script# . for.sh
  3. 请输入数字,将要计算1+2+3+...+N之和:100
  4. 结果为‘1+2+3+...+100==> 5050
  5. root@linux01:/home/script#
2.while循环语句

while循环语句用于重复同一组命令。其语法格式如下。

  1. while EXPRESSION; do COMMANDS; done
  2. while ((exp1;exp2;exp3 ));do COMMANDS;done

【例】while循环计算1+2+3+...+N的和

  1. #!/bin/bash
  2. #文件名:while.sh
  3. #版本:v1.1
  4. #功能:运用while循环计算1+2+3+...+N的和
  5. read -p "请输入数字,将要计算1+2+3...+N之和:" N
  6. sum=0
  7. i=0
  8. while (( $i != $N ))
  9. do
  10. i=$(($i+1))
  11. sum=$(($sum+$i))
  12. done
  13. echo "结果为'1+2+3+...+$N' ==>$sum"
 
  1. root@linux01:/home/script# chmod a+x while.sh
  2. root@linux01:/home/script# . while.sh
  3. 请输入数字,将要计算1+2+3+...+N之和:100
  4. 结果为‘1+2+3+...+100' ==>5050
  5. root@linux01:/home/script#
3.until循环语句

until循环语句和while循环语句类似,区别是until循环语句在条件为真时退出循环,在条件为假时继续执行循环;而while循环语句在条件为假时退出循环,在条件为真时继续执行循环。

其语法格式如下。

  1. until EXPRESSION; do COMMANDS; done
  2. until ((exp1;exp2;exp3 ));do COMMANDS; done

【例】运用until循环计算1+2+3+...+N的和

  1. #!/bin/bash
  2. #文件名:until.sh
  3. #版本:v1.1
  4. #功能:运用until循环计算1+2+3+...+N的和
  5. read -p "请输入数字,将要计算1+2+3...+N之和:" N
  6. sum=0
  7. i=0
  8. until (( $i == $N ))
  9. do
  10. i=$(($i+1))
  11. sum=$(($sum+$i))
  12. done
  13. echo "结果为'1+2+3+...+$N' ==>$sum"
 
  1. admin@linux01:~$ chmod a+x until.sh
  2. admin@linux01:~$ . until.sh
  3. 请输入数字,将要计算1+2+3...+N之和:100
  4. 结果为'1+2+3+...+100' ==>5050
  5. admin@linux01:~$

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/777882
推荐阅读
相关标签
  

闽ICP备14008679号