作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们前面学习了那么多命令,以及涉及到部分逻辑判断的问题。从简单来说,他就是Shell编程,只有由于命令比较单一,只能实现比较简单的功能。如果我们把多个操作都放到一起去,并添加更复杂的逻辑在里面,他就是Shell编程。所以我们主要从以下几个方面讲解Shell编程:
Shell编程-什么是shell
Shell编程-变量
Shell编程-数据类型
Shell编程-逻辑判断
Shell编程-if判断
Shell编程-if和else
Shell编程-while循环
Shell编程-for循环
Shell编程-case(本章节)
Shell编程-break
Shell编程-continue
Shell编程--函数
Shell编程-案例(一)
Shell编程-案例(二)
Shell编程-小结
前面我们学了判断和循环两种类型的的编程方式,今天我们来学一种选择类型的编程方式。
case 是Shell脚本中用于多分支条件判断的关键字,它允许根据一个值(通常是变量的值)的不同情况执行不同的命令或代码块。case 结构与多个 if-elif-else 语句相比,更加简洁和易于阅读,尤其适合处理多个相互排斥的条件分支。
基本语法
case value in
pattern1)
# 如果 value 匹配 pattern1 执行的命令
;;
pattern2)
# 如果 value 匹配 pattern2 执行的命令
;;
pattern3|pattern4)
# 如果 value 匹配 pattern3 或 pattern4 执行的命令
;;
*)
# 如果 value 不匹配上述任何 pattern 执行的命令(可选)
;;
esac
-
value是要进行匹配的值,通常是一个变量的值。 -
pattern1,pattern2,pattern3, 等是用来匹配value的模式。模式可以使用通配符(例如*、?)、正则表达式(在bash的extglob扩展中),或者是具体的字符串。 -
;;表示一个分支结束,类似于case语句中的break,用于结束当前匹配分支的执行。
示例
使用字符串进行匹配
#!/bin/bash
# 使用 case 匹配不同的汽车品牌
car="Honda"
case $car in
"Toyota")
echo "Your car is Toyota."
;;
"Honda"|"Acura")
echo "Your car is either Honda or Acura."
;;
"Ford")
echo "Your car is Ford."
;;
*)
echo "Unknown car brand."
;;
esac
在这个示例中,case 根据变量 $car 的值匹配不同的汽车品牌,并输出相应的信息。注意,"Honda"|"Acura" 中使用了 | 符号表示匹配多个模式。
使用正则表达式进行匹配
#!/bin/bash
# 使用 case 判断输入的内容是数字、字母还是其他
read -p "Enter a character: " char
case $char in
[0-9])
echo "You entered a digit."
;;
[a-zA-Z])
echo "You entered an alphabet character."
;;
*)
echo "You entered something else."
;;
esac
在这个例子中,case 使用了字符类 [0-9] 和 [a-zA-Z] 来匹配输入的内容,并根据输入的字符是数字、字母还是其他类型的字符输出不同的信息,但是这里有一个问题就是,如果输入的数字或者字母是多个的情况则会识别为其他。
真实的脚本
当然下面的内容也可以换成真实的逻辑,比如lanp,可以通过这个方式进行选择安装软件。也可以直接替换我们前面学过的脚本,就不用把代码写在这里,而是
#!/bin/bash
echo "请选择:1.执行 for 循环;2.执行 while 循环;3.执行调用脚本;其他数字退出"
read choice
case $choice in
1)
echo "执行 for 循环"
for ((i = 0; i < 5; i++)); do
echo "当前循环次数:$i"
done
;;
2)
echo "执行 while 循环"
j=0
while [ $j -lt 5 ]; do
echo "当前循环次数:$j"
j=$((j + 1))
done
;;
3)
echo "执行指定的脚本。"
bash for.sh
;;
*)
echo "输入错误,退出程序。"
exit 0
;;
esac
总结
-
case可用于复杂程序的入口,通过不同的选择执行不同的程序
-
case选择的执行的可以放置具体的逻辑,也可以放置其他程序,这样case脚本不用写得很复杂,具有更好的可读性。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。