Shell脚本中的case
语句是一种用于多分支选择的结构,它可以处理复杂的条件匹配和执行相应的命令列表。case
语句特别适用于根据用户输入、变量值或命令返回状态码进行多种不同操作的情况。以下是一些复杂用途的例子:
复杂用法示例1:处理多个选项与参数
#!/bin/bash
read -p "请输入一个数字(1-5)或字母(a-e): " input
case $input in
1|2|3|4|5)
echo "您选择了数字 $input"
# 根据数字执行不同的任务
case $input in
1) command1 ;;
2) command2 ;;
3) command3 ;;
4) command4 ;;
5) command5 ;;
esac
;;
a|b|c|d|e)
echo "您选择了字母 $input"
# 根据字母执行不同的任务
case $input in
a) taskA ;;
b) taskB ;;
c) taskC ;;
d) taskD ;;
e) taskE ;;
esac
;;
*)
echo "无效的选择!"
;;
esac
复杂用法示例2:使用正则表达式匹配
在某些shell中(如bash),case
语句可以支持扩展模式匹配,包括基本的正则表达式匹配(Bash 4.0及更高版本):
#!/bin/bash
file_type=$1
shopt -s extglob # 开启扩展模式匹配功能(如果尚未开启)
case $file_type in
@(jpg|jpeg|png|gif) )
echo "这是一个图像文件。"
process_image ;;
*.txt|*.doc* )
echo "这是一个文本或文档文件。"
process_text ;;
*)
echo "未知的文件类型。"
;;
esac
shopt -u extglob # 关闭扩展模式匹配功能(可选)
复杂用法示例3:结合其他命令的输出
还可以将case与其他命令结合起来,例如根据某个命令的输出结果做出决策:
#!/bin/bash
status=$(systemctl status some_service | grep 'Active')
case $status in
*"active (running)"*)
echo "服务正在运行。"
;;
*"inactive (dead)"*)
echo "服务未运行。"
start_service ;;
*)
echo "无法确定服务状态。"
;;
esac
通过上述例子可以看出,case
语句能够以灵活的方式处理各种条件分支,使其成为编写交互式脚本和流程控制的强大工具。