玩转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" >

两个分号;;

注意每一个条件末尾都是两个分号。

这非常好理解。就像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" >

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:]


随意标点符号,如句点(.)和分号(;)


[-!"#$%&‘( )*+,./:;<=>[email protected][\\\]^_‘{|}~]


[: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

时间: 2024-10-14 13:11:15

玩转Bash脚本:选择结构之case的相关文章

玩转Bash脚本:循环结构之while循环

总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html 和其他语言一样Bash的循环结构中也有while语句. 基本结构 while 条件 do 循环体 done 和for语句一样,它的循环体同样是do-done结构.我们可以把while语句再折叠一下 while 条件;do 循环体 done 还能进一步折叠成一行体 while 条件;do 循环体;done Bash语句大都可以写作一行,只不过可读性

玩转Bash脚本:循环结构之while循环(转)

总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html 和其他语言一样Bash的循环结构中也有while语句. 基本结构 while 条件 do 循环体 done 和for语句一样,它的循环体同样是do-done结构.我们可以把while语句再折叠一下 while 条件;do 循环体 done 还能进一步折叠成一行体 while 条件;do 循环体;done Bash语句大都可以写作一行,只不过可读性

LinuxShell脚本——选择结构

LinuxShell脚本——选择结构 摘要:本文主要学习了Shell脚本中的选择结构. if-else语句 基本语法 最简单的用法就是只使用if语句,它的语法格式为: 1 if 条件 2 then 3 命令 4 fi 如果将if和then写在一行,则需要在then前面添加“;”: 1 if 条件; then 2 命令 3 fi 如果有两个分支,就可以使用if-else语句,它的格式为: 1 if 条件 2 then 3 命令1 4 else 5 命令2 6 fi Shell支持任意数目的分支,当

玩转Bash脚本:变量基本概念及其初始化

总第2篇 基本概念 命名 注意以下规则: 只能包含字母.数字和下划线,并且不能以数字开头 大小写敏感 不能和系统变量重名 除此以外,如果要导出为全局变量,名称最好要全部大写.这只是一种习惯的约定,并非严格的约束. 类型 几乎所有的编程语言都有变量的概念,Bash当然也不例外.说道变量就少不了说一说类型.但与其他语言不同的是Bash属于无类型语言,如果强要说一种类型,可以认为都是字符串.说到这里,你可能会说,Bash里面也有整数类型吧,好像有整数的运算.但其是通过一些运算符,表达式或者命令将字符串

Bash脚本之if、case、read和位置参数

在学会了基本的命令之后,我们就可以使用这些命令来进行编程了.在Linux中的编程称为shell脚本,是将命令进行结合形成的类似Windows中批处理的东西.在这个脚本中,可以有变量和结构体.每一个程序所拥有的程序执行过程,例如:顺序执行.选择执行和循环执行都可以在脚本中体现出来.下面就对shell脚本进行介绍. 首先,shell脚本编程是过程式编程语言,也就是说shell脚本强调接下来要执行的步骤,就好像是人在对shell说接下来要做什么,要明确的指出每一步的方法.然后shell还是脚本类语言,

bash中选择结构、循环结构与break、continue

if两种选择结构 if 测试条件; then 程序块 else 程序块 fi if 测试条件1; then 程序块 elif 测试条件2; then 程序块 ... elif 程序条件n; then 程序块 else 程序块 fi case选择结构 case 变量 in 情况1) 程序块 ;; 情况2) 程序块 ;; ... 情况n) 程序块 ;; *) 程序块 ;; esca for循环结构 for 变量 in 列表; do 程序块 done while循环结构 while 测试条件; do

玩转Bash脚本:循环结构之for循环

总第7篇 for循环 基本格式 for 变量 in 取值列表 do 各种操作 done 还有罕见的写法就是都写作一行里: for 变量 in 取值列表 ; do 各种操作 ;done 取值列表大致可以分成枚举和迭代两类 枚举 普通枚举 取值列表为空格或回车符分割的字符串 for i in 'apple' 'meat' 'sleep' 'woman' do echo I like $i done 在终端执行该脚本for.sh.运行结果 [email protected]:~$ bash for.s

玩转Bash脚本:特殊变量

总第4篇 在前面博文中我讲过了变量基础部分<变量基本概念及其初始化>.我们知道假如我们有初始化一个变量a=hello,那么如果我们想打印它的值,我们需要使用echo $a. 但是除此之外还有很多特殊的变量,可供 $ 使用.本文讲到了$0 # * @ _ ? ! -这几个特殊变量的含义. 脚本的参数 正如同C语言中有main(int argc,char **argv),Java中有main(String[]args)一样,Bash同样能对执行脚本时附加的参数做操作. 引用脚本的参数n 看一个简单

玩转Bash脚本:数值计算

总第6篇 Bash中的数学运算并不如其他语言般简便,因为Bash把所有变量都视作字符串,所以a=1+2,a并不等于3,而是等于字符串1+2. 为了解决这一问题,有如下几种方案. 运算符[ ] a=2 b=3 c=$[a+b] d=$[a-b] e=$[a*b] f=$[a/b] g=$[a%b] $符只是取变量值的意思.中括号和里面的表达式可以视作一个变量.在中括号中引用变量可以直接使用变量名,也可以使用$加变量名.比如: c=$[$a+$b] 当然,你可以直接使用字面值: c=$[2+3] d