书史足自悦,安用勤与劬。这篇文章主要讲述Shell编程之case语句与循环语句相关的知识,希望能为你提供帮助。
?case 分支语句
case 语句可以使脚本程序的结构更加清晰、层次分明,本节就来学习 case 语句的语法
结构及应用。
?case 语句的结构
case 语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个不同的条件,而 case 语句只是判断一个变量的不同取值。
case 分支语句的语法结构如下
case 变量值 in
模式 1)
命令序列 1
;
;
模式 2)
命令序列 2
;
;
??
- )
esac
在上述语句结构中,关键字 case 后面跟的是“变量值”,即“$变量名”,这点需要与for 循环语句的结构加以区别。整个分支结构包括在 case?esac 之间,中间的模式 1、模式2、??、*对应为变量的不同取值(程序期望的取值),其中*作为通配符,可匹配任意值。
case 语句的执行流程:首先使用“变量值”与模式 1 进行比较,若取值相同则执行模式 1 后的命令序列,直到遇见双分号“; ; ”后跳转至 esac,表示结束分支;若与模式 1 不相匹配,则继续与模式 2 进行比较,若取值相同则执行模式 2 后的命令序列,直到遇见双分号“; ; ”后跳转至 esac,表示结束分支??依此类推,若找不到任何匹配的值,则执行默认模式“*)”后的命令序列,直到遇见 esac 后结束分支。
使用 case 分支语句时,有几个值得注意的特点如下所述。
? case 行尾必须为单词“in”,每一模式必须以右括号“)”结束。
? 双分号“; ; ”表示命令序列的结束。
? 模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示或,如“A|B”。
最后的“*)”表示默认模式,其中的*相当于通配符。
3.1.2 case 语句应用示例
为了进一步理解 case 语句的结构和流程,掌握 case 语句在脚本中的实际使用,下面依
次介绍两个脚本示例。
1)检查用户输入的字符类型
提示用户从键盘输入一个字符,通过 case 语句判断该字符是否为字母、数字或者其他
控制字符,并给出相应的提示信息。
?[root@localhost ~]# vim hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按 Enter 键确认:" KEY
case "$KEY" in
[a-z]|[A-Z]) //匹配任意字母
echo "您输入的是 字母."
; ;
[0-9]) //匹配任意数字
echo "您输入的是 数字."
; ;
*) //默认模式,匹配任意字符
echo "您输入的是 空格?功能键或其他控制字符."
esac
?[root@localhost ~]# chmod +x hitkey.sh
测试并确认 hitkey.sh 脚本的执行结果如下所示。
?[root@localhost ~]# ./hitkey.sh
请输入一个字符,并按 Enter 键确认:k //输入字母 k
您输入的是 字母.
?[root@localhost ~]# ./hitkey.sh
请输入一个字符,并按 Enter 键确认:8 //输入数字 8
您输入的是 数字.
?[root@localhost ~]# ./hitkey.sh
请输入一个字符,并按 Enter 键确认:^[[19~ //按 F8 键
您输入的是 空格、功能键或其他控制字符.
for语句的结构
读取不同的变量值,用来逐个执行同一组命令
for 变量名 in 取值列表
do
命令序列
done
for 语句的执行流程:首先将列表中的第一个取值赋给变量,并执行 do?done 循环体
中的命令序列;然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列??依此
类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环
?[root@localhost ~]# vim /root/users.txt ?//用做测试的列表文件
chenye
dengchao
?[root@localhost ~]# vim uaddfor.sh? //批量添加用户的脚本
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME & > /dev/null
done
while 循环语句的语法结构如下所示。
while 条件测试操作
do
命令序列
done
while 语句的执行流程:首先判断 while 后的条件测试操作结果,如果条件成立,则执
行 do?done 循环体中的命令序列;返回 while 后再次判断条件测试结果,如果条件仍然成
立,则继续执行循环体;再次返回到 while 后,判断条件测试结果??如此循环,直到 while
后的条件测试结果不再成立为止,最后跳转到 done 语句,表示结束循环
有两个特殊的条件测试操作,即 true(真)和 false(假)。
使用 true 作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强
制终止脚本(或通过 exit 语句退出脚本);反之,若使用 false 作为条件,则循环体将不会
被执行。这两个特殊条件也可以用在 if 语句的条件测试中。
?[root@localhost ~]# vim pricegame.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格范围为 0-999,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答对了,实际价格是 $PRICE"
echo "你总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
until 循环语句的语法结构如下所示。
until 条件测试操作
do
命令序列
done
until 语句的执行流程:首先判断 until 后的条件测试操作结果,如果条件不成立,则
执行 do?done 循环体中的命令序列;返回 until 后再次判断条件测试结果,如果条件仍然
不成立,则继续执行循环体;再次返回到 until 后,判断条件测试结果??如此循环,直到
until 后的条件测试结果成立为止,最后跳转到 done 语句,表示结束循环
计算 1~50 的和值
?[root@localhost ~]# vi sum1to50_until_v1.sh
#!/bin/bash
##filename:sum1to50_until_v1.sh
i=0; s=0
until [ $i -eq 50 ]
do
let "i=$i+1"; let "s=$s+$i"
done
echo sum(1..50)=$s
Shell 函数
在 Linux 系统中 Shell 函数类似于 Shell 脚本,可以存放一系列的指令。Shell 函数存
放在内存中,每次执行函数时不需要从硬盘读取,因此运行与调用速度比较快。在 Shell
中函数并非是必须的编程元素,但使用函数可以对程序进行更好的组织。将一些相对独立的
代码变成函数,可以提高程序可读性与重用性,避免重复编写大量相同代码。
Shell 函数定义的方法如下所示:
[function] 函数名()
命令序列
[return x]
? “function”关键字表示定义一个函数,可以省略;
? “”符号表示函数执行命令的入口,该符号可以与函数名同行与可以在函数名下一
行的句首;
? “”符号表示函数体结束,两个大括号之间 是函数体;
? “命令序列”部分可以是任意的 Shell 命令,也可以调用其他函数;
? “return”表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以
使用 exit 终止整个 Shell 脚本。
Shell 函数调用的方法为:函数名 [参数 1] [参数 2]。下面通过具体是示例学习函数
的定义与调用。
1)两个数求和
?[root@localhost ~]# vim sum.sh
#!/bin/bash
sum()
read -p "请输入第一个数:" NUM1
read -p "请输入第二个数:" NUM2
echo “你输入的两个数为: $NUM1 和$NUM2.”
SUM=$(( NUM1+$NUM2))
echo “两个数的和为: $SUM”
sum
??[root@localhost ~]# chmod +x sum.sh
?[root@localhost ~]# ./sum.sh?请输入第一个数:2
请输入第二个数:3
“你输入的两个数为: 2 和 3.”
“两个数的和为: 5”
Shell 数组
在日常的 Shell 脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数组
长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除等等。Shell 中的数组与
java、C、python 不同,只有一维数组,没有二维数组。数组元素的大小与限制,也不需要
事先定义数组中元素的格式。Shell 数组用括号()来表示,元素用空格分隔,元素的下标
与大部分编程语言类似由 0 开始。
数组常用定义方法包括以下几种。
方法一:
数组名=(value0 value1 value2 ...)
方法二:
数组名=([0]=value [1]=value [2]=value ...)
方法三:
列表名=”value0 value1 value2 ...”
数组名=($列表名)
方法四:
数组名[0]=”value”
数组名[1]=”value”
数组名[2]=”value”
......
下面通过具体的示例掌握数组的基本使用方法。
1)获取数组长度
?[root@localhost ~]# arr_number=(1 2 3 4 5);
?[root@localhost ~]# arr_length=$#arr_number[*]
?[root@localhost ~]# echo $arr_length5
2)读取某下标赋值
?[root@localhost ~]# arr_index2=$arr_number[2]
?[root@localhost ~]# echo $arr_index23
3)数组遍历
?[root@localhost ~]# for v in $arr_number[@]?
do【Shell编程之case语句与循环语句】1
echo $v
done
2
3
4
推荐阅读
- Nginx四层负载均衡详解 #yyds干货盘点#
- jenkins+kubernetes(k8s)+docker持续集成与部署(CI/CD) - k8s系列
- Nginx七层负载均衡 #yyds干货盘点#
- Linux磁盘和文件系统管理(磁盘配额的详细做法)
- 学Python运维,这知识点你肯定会遇到,必收藏之nginx 域名跳转相关配置
- Docker exec 的实现原理(35)
- LNMP平台拆分 #yyds干货盘点#
- 图解数据结构排序全面总结(上)
- LNMP平台搭建与应用 #yyds干货盘点#