case分支
case的语法结构:
case word in
[pattern [| pattern]...) commands ;;]...
esac
之前的菜单驱动程序用case可以简化为
#!/bin/bash
# case-menu: a menu driven system information program
clear
echo "
Please Select:
1.Display System Information
2.Display Disk Space
3.Display Home Space Utilization
0.Quit
"
read -p "Enter selection [0-3] > "
case $REPLY in
0) echo "Program terminated."
exit
;;
1) echo "Hostname: $HOSTNAME"
uptime
;;
2) df -h
;;
3) if [[ $(id -u) -eq 0 ]];then
echo "Home Space Utilization(All Users)"
du -sh /home/*
else
echo "Home Space Utilization($USER)"
du -sh $HOME
fi
;;
*) echo "Invalid entry" >&2
exit 1
;;
esac
模式
同路径名展开一样,case使用以“)”字符结尾的模式进行匹配。
case模式范例
模式 | 描述 |
a) | 若关键字为a则吻合 |
[[:alpha:]]) | 若关键字为单个字母则吻合 |
???) | 若关键字为3个字符则吻合 |
*.txt) | 若关键字以.txt结尾则吻合 |
*) | 与任何关键字吻合。在case命令的最后的一个模式应用此项是个不错的选择,可对应所有前模式不吻合的关键字,也就是对应任何可能的无效值 |
#!/bin/bash
read -p "enter word > "
case $REPLY in
[[:alpha:]]) echo "is a single alphabetic character." ;;
[ABC][0-9]) echo "is A, B, or C followed by a digit." ;;
???) echo "is three characters long." ;;
*.txt) echo "is a word ending in '.txt'" ;;
*) echo "is something else." ;;
esac
多个模式的组合
我们也可以用竖线作为分隔符来组合多个模式,模式之间是“或”的关系。
这对一些类似同时处理大写和小写字母的场景十分有用!!!
#!/bin/bash
# case-menu:a menu driven system information program
clear
echo "
Please Select:
A.Display System Information
B.Display Disk Space
C.Display Home Space Utilization
Q.Quit
"
read - p "Enter selection [A, B, C or Q] > "
case $REPLY in
q|Q) echo "Program terminated."
exit
;;
a|A) echo "Hostname: $HOSTNAME"
uptime
;;
b|B) df -h
;;
c|C) if [[ $(id -u) -eq 0 ]];then
echo "Home Space Utilization(All Users)"
du -sh /home/*
else
echo "Home Space Utilization($USER)"
du -sh $HOME
fi
;;
*) echo "Invalid entry" >&2
exit 1
;;
esac
以上脚本通过字母而不是数字进行菜单选择。通过|组合模式,用户可以使用大写字母或者小写字母进行菜单选择,即对用户来说,不需要考虑输入字母的大小写。
可以关注作者微信公众号,追踪更多有价值的内容!