玩转Bash脚本:选择结构之case
总第5篇
之前,我们谈到了if。
这次我们来谈还有一种选择结构——case。
case与if
if用于选择的条件,不是非常多的情况,假设选择的条件太多。一系列的if。elif,。也是醉了。
没错,case在bash中的地位,和switch在C中的地位一样。
可是使用方法可大有不同。
代码块
不论什么语言都有代码块的概念,C语言中的花括号{ },python中的冒号和缩进。bash中的代码块风格不是非常统一。可是在选择结构中是同样的——反语。if结构使用if...fi标识一个代码块的作用域,而case也是用case...esac表示块作用域的。。
基本结构
看样例echo.sh:
#!/bin/bash
str="is good "
read -p "你喜欢什么颜色:" color
case $color in
red) echo -e "\e[1;31m$color $str \e[0m";;
green) echo -e "\e[1;32m$color $str \e[0m";;
yellow) echo -e "\e[1;33m$color $str \e[0m";;
blue) echo -e "\e[1;34m$color $str \e[0m";;
*) echo -e "\e[1;30m这是什么颜色?\e[0m";;
esac
这段代码,就是依据你的输入来显示不同颜色的文本。关于echo语句的写法。这里不细说。每句分别设置了不同的文本颜色。重点去看一下这个结构。
把变量color的值,依次和以下右括号中的值做比較。假设同样,就运行后面的语句。
来执行一下
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvZG9uZ3hpYXJlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
两个分号;;
注意每一个条件末尾都是两个分号。
这非常好理解。就像C语言的switch里面每一个case都常常会有一个break一样。由于每一个条件满足的时候,须要运行的语句可能不止一句。而在bash中多个语句在一行是用一个分号间隔的。这样两个分号就表示着语句结束。另外加一个空语句,也就是说要运行的语句都完毕了。
与c语言的switch不同的是,c语言中每一个条件(case语句)后面不一定都要有break。假设没有break,则继续运行以下的条件的语句。假设你想像c语言那样多个条件共用一套语句,怎么办呢?
请继续阅读。
分号扭号;&
所谓扭号,就是And符号——&,我认为叫扭号更简洁。。看一段C代码:
#include<stdio.h>
int main(){
char ans;
printf("你喜欢编程么:");
scanf("%c",&ans);
switch(ans){
case 'y':
case 'Y':printf("我也是\n");break;
case 'n':
case 'N':printf("sorry,跟你没什么好谈的\n");break;
}
}
也就是说。在C中,case后面假设不加break,那么在运行完匹配的语句后,将接着运行。而无论以下的条件匹配不匹配,直到遇到break为止。这种语法。十分灵活。那么bash中又怎样实现呢?难道在末尾加一个分号?错错错。答案是一个分号加一个扭号。
#!/bin/bash
read -p "你喜欢编程么:(y/n):" ans
case $ans in
y);&
Y) echo "我也是";;
n);&
N) echo "sorry,跟你没什么好谈的";;
esac
分号分号扭号;;&
除了 ;&结束语句以外。另一种是 ;;& 来结束语句的使用方法。
可是意义有所不同,;;&的使用方法是使得条件越来越精确。
#!/bin/bash
read -p "请输入一个区号:" num
case $num in
*)echo -n "中国";;&
03*)echo -n "河北省";;&
? ?10)echo "邯郸市";;
? ? 11)echo "石家庄";;
??17)echo "沧州市";;
07*)echo -n "江西省";;&
??91)echo "南昌市";;
??92)echo "九江市";;
? ?97)echo "赣州市";;
esac
关于通配符*和?,我们以下会讲到。这里,你仅仅须要知道。条件语句以 ;;& 结束的时候,程序运行到这里不会停止,会继续測试以下条件。假设满足继续运行,直到遇到 ;; 或esac
注意。以上这两种扭号的使用方法,是bash自己的 特性,对于其它shell,并不支持。
假设考虑移植性,就不要这样写了。
只用正规的两个分号就能够了。
右括号里的模式
基本正则
)右括号。类似c语言中switch中的case。然而与之不同的是。Bash中的右括号中面,不仅支持完整的字符串(c语言中仅仅支持整型数据。包含int和char
,不支持字符串)还支持“模式”匹配。模式的概念,假设了解正則表達式。那么就非常easy理解了。只是case语句中与正則表達式略有不同。貌似支持的并不完整。
- *是匹配0个或多个不论什么字符。
- ?是匹配一个字符。
能够看做一个占位符。
- [ ]表示一个范围。
- ( )枚举字符串。可是须要转义
#!/bin/bash
read -p "请输入一个数字:" num
case $num in
2*)echo "匹配2*";;&
2? )echo "匹配2?";;&
[0-9])echo "匹配[0-9]";;
esac
方括号表示范围,你能够使用[123]来匹配1或2或3。而不是123。也能够使用[0-9]、[a-zA-Z]这种写法。熟悉正则的同学。这些都不是问题。
注意我上面用到了 ;;& 也就是说在匹配了一个模式之后,不会停止,还会继续向下运行。
运行效果:
枚举字符串
一般的写法比方(123|456|789)匹配123,456,789这三个数。
可是由于case中右括号有特殊含义,所以进行了转义。
然后我的写法就是(123|456|789\)。可是这样有个问题就是789无法得到匹配。123和456倒是能够。我也是不明所以(见笑,知情者望告知)。
于是我又改了一版,最终匹配全然——(123|456|789|\)。
如今加上一句到刚才的脚本中——(123|456|789 \))echo "匹配(123|456|789|\)";;&
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvZG9uZ3hpYXJlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
POSIX字符类
一般的编程语言中的正則表達式。支持\w,\d这类的字符类(Character Classes)。而Unix-like系统上。支持的字符类是POSIX风格的。
见下表
|
类 |
描 述 |
扩 展 |
|
[:alnum:] |
字母和数字字符 |
[0-9a-zA-Z] |
|
[:alpha:] |
(letters)字母字符(字母) |
[a-zA-Z] |
|
[:ascii:] |
7位ASCII |
[\x01-\x7F] |
|
[:blank:] |
水平空白符(空格、制表符) |
[ \t] |
|
[:cntrl:] |
控制字符 |
[\x01-\x1F] |
|
[:digit:] |
数字 |
[0-9] |
|
[:graph:] |
用墨水打印的字符(非空格、非控制字符) |
[^\x01-\x20] |
|
[:lower:] |
小写字母 |
[a-z] |
|
[:print:] |
可打印字符(图形类加空格和制表符) |
[\t\x20-\xFF] |
|
[:punct:] |
随意标点符号,如句点(.)和分号(;) |
[-!"#$%&'( )*+,./:;<=>?@[\\\]^_'{|}~] |
|
[:space:] |
空白(换行、回车、制表符、空格、垂直制表符) |
[\n\r\t \x0B] |
|
[:upper:] |
大写字母 |
[A-Z] |
|
[:xdigit:] |
十六进制数字 |
[0-9a-fA-F] |
这个表是从网友那里复制的,原文《POSIX风格正則表達式》
实际使用的时候,还要在这些字符类的方括号外面。再套一层方括号才行。
#!/bin/bash
read -p "请随意输入,能够包括空格等空白符" ch
#echo $ch
case $ch in
*[[:lower:]]*)echo lower;;&
*[[:upper:]]*)echo upper;;&
*[[:digit:]]*)echo digit;;&
*[[:punct:]]*)echo punct;;&
*[[:ascii:]]*)echo ascii;;&
*[[:cntrl:]]*)echo cntrl;;&
*[[:print:]]*)echo print;;&
*[[:space:]]*)echo space;;&
*[[:xdigit:]]*)echo xdigit;;&
*[[:graph:]]*)echo graph;;&
*[[:blank:]]*)echo blank;;&
*[[:alnum:]]*)echo alnum;;&
*[[:alpha:]]*)echo alpha;;&
esac
这个脚本。大家自己去測试吧。当然了有些字符(比方控制字符)貌似不好输入。
这样不好測试[:cntrl:]这个字符类,这里我告诉您一下,ascii码中27相应的控制字符就是ESC。
測试脚本的时候,能够按一下ESC键。或者键入^[字符,也是一样的。
本系列(玩转Bash脚本)很多其它文章,请訪问:http://blog.csdn.net/column/details/wanbash.html
玩转Bash脚本:选择结构之case的更多相关文章
- 玩转Bash脚本:循环结构之while循环(转)
转自:http://blog.csdn.net/guodongxiaren/article/details/43341769 总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://b ...
- LinuxShell脚本——选择结构
LinuxShell脚本——选择结构 摘要:本文主要学习了Shell脚本中的选择结构. if-else语句 基本语法 最简单的用法就是只使用if语句,它的语法格式为: if 条件 then 命令 fi ...
- 玩转Bash脚本:test測试语句
总第1篇test就是測试的意思,经常使用在流程控制语句中作为条件.以下做一下介绍. 关于真值 与其它语言不同,Bash(包含其它Shell)中,是用0表示真,非0表示假的.之所以用0表示成功,而不是1 ...
- bash中选择结构、循环结构与break、continue
if两种选择结构 if 测试条件; then 程序块 else 程序块 fi if 测试条件1; then 程序块 elif 测试条件2; then 程序块 ... elif 程序条件n; then ...
- 写着玩的bash脚本
#!/bin/bash function strealingManu { pwdfolder=`pwd` for var in "$@" do man 1 $var > $p ...
- bash脚本编程学习笔记(一)
bash脚本语言,不同于C/C++是一种解释性语言.即在执行前不需要事先转变为可执行的二进制代码,而是每次执行时经解释器解释后执行.bash脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的 ...
- 【java从入门到精通】day10-Java流程控制2-switch多选择结构
1.switch多选择结构 switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. switch语句中的变量类型可以是: byte.short.int或者char 从j ...
- Java流程控制04——Switch选择结构
switch 多选择结构 switch case 语句判断一个变量与一系列值中某个值是否相等,每个支撑位一个分支. switch语句中的变量类型可以是: byte short int 或者 char ...
- shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法
shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...
随机推荐
- Win 7中开启Telnet功能
参看以下文章: http://winsystem.ctocio.com.cn/Longhorn/472/8756972.shtml
- EBS 第一个项目 学习总结 ---- 发运模块
EBS 组织架构: (一)业务组(BG) (二)法律实体(LE) (三)业务实体(OU) (四)库存组织(INV) (五)公司成本中心(Cost Center) (六)HR组织 (七)多组织接入控制 ...
- ubuntu12.04更新软件源时出现校验和不符
在运行update命令之后.出现系统校验和不符.网上找了一些方法,最后在大神的帮助下最终攻克了! ! 1.更改 /etc/apt/apt.conf.d/00aptitude 文件,在最后一行增加: A ...
- 从C10K到C10M高性能网络的探索与实践
在高性能网络的场景下,C10K是一个具有里程碑意义的场景,15年前它给互联网领域带来了非常大的挑战.发展至今,我们已经进入C10M的场景进行网络性能优化. 这期间有怎样的发展和趋势?环绕着各类指标分别 ...
- bzoj 1010 (单调决策优化)
能够非常好的证明单调决策性质.用 记sum[i]=sigma(C[1],C[2].....C[k]);f[i]=sum[i]+i; c=l-1; 有转移dp[i]=min( dp[j]+(f[i ...
- 在Linux终端使用W3M浏览器下载文件
在Linux终端使用W3M浏览器下载文件 W3M 是3个基于Linux系统命令行的WEB网站浏览工具(w3m/Links/Lynx) 对于需要验证cookie 和来源的页面,比如163的超大附件,直接 ...
- vue11 vue实例方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Centos/RHEL :How to add,delete and display LVM tags
1. 什么是LVM标签? 在你想开机启动时让逻辑卷被激活可用时,添加lvm标签是一个不错的选择.lvm标签允许那些被预先标记的实现这样的效果. 2. 配置文件 配置文件/etc/lvm/lvm.con ...
- CentOS下部署巡风步骤详解
本博客已经迁移到新的网站,www.je2se.com,请大家移步关注,互相交流,共同成长 巡风Centos 6.5部署指南 基础环境要求: Python2.7+ 安装Centos相关依赖 # Cent ...
- 从Java到C++——常量的使用规则
常量是一种标识符,它的值在执行期间恒定不变.C语言用 #define来定义常量(称为宏常量). C++ 语言除了 #define外还能够用const来定义常量(称为const常量). 一.为什么须要常 ...