• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    shell脚本中case条件控制语句的一个bug分析

    在shell脚本中,发现case语句的一个问题。
    就是指定小写字母[a-z]和大写字母[A-Z]的这种方法不管用了。

    出现如下情况:

    复制代码 代码如下:

    [root@station1 ~]# cat case.sh
    #!/bin/bash
    while :
    do
    echo -n "input a letter: "
    read var
    case "$var" in
      [a-z]) echo "Lowercase letter";;
      [A-Z]) echo "Uppercase letter";;
     [0-9]) echo "Digit";;
      *) echo "Punctuation, whitespace, or other";;
    esac
    done
    [root@station1 ~]# bash case.sh
    input a letter: a
    Lowercase letter
    input a letter: A
    Lowercase letter
    input a letter: 2
    Digit
    input a letter: 0
    Digit
    input a letter: B
    Lowercase letter
    input a letter: y
    Lowercase letter
    input a letter: ^C
    [root@station1 ~]#

    可以看到当输入大小写字母都会输出“Lowercase letter”

    就当我疑惑不解的时候,奇迹发生了。。。。

    复制代码 代码如下:

    [root@station1 ~]# bash case.sh
    input a letter: Z
    Uppercase letter
    input a letter:

    当输入大写Z的时候,终于出现了我们想要的结果:Uppercase letter
    后来在man bash文档中也没有关于"-"代表范围的说明,值说想匹配"-",就把"-"放到[]中最前面或者最后面。
    case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
    A case command first expands word, and tries to match it against each pattern in turn, using the same matching rules as for pathname
    expansion (see Pathname Expansion below). The word is expanded using tilde expansion, parameter and variable expansion, arithmetic sub-
    stitution, command substitution, process substitution and quote removal. Each pattern examined is expanded using tilde expansion, param-
    eter and variable expansion, arithmetic substitution, command substitution, and process substitution. If the shell option nocasematch is
    enabled, the match is performed without regard to the case of alphabetic characters. When a match is found, the corresponding list is
    executed. If the ;; operator is used, no subsequent matches are attempted after the first pattern match. Using ; in place of ;; causes
    execution to continue with the list associated with the next set of patterns. Using ;; in place of ;; causes the shell to test the next
    pattern list in the statement, if any, and execute any associated list on a successful match. The exit status is zero if no pattern
    matches. Otherwise, it is the exit status of the last command executed in list.

    再看下面这段代码:

    复制代码 代码如下:

    [root@station1 ~]# cat case.sh
    #!/bin/bash
    while :
    do
    echo -n "input a letter: "
    read var
    case "$var" in
    [a-c]) echo "Lowercase letter";;
    [A-Z]) echo "Uppercase letter";;
    [0-9]) echo "Digit";;
    *) echo "Punctuation, whitespace, or other";;
    esac
    done
    [root@station1 ~]# bash case.sh
    input a letter: a
    Lowercase letter
    input a letter: b
    Lowercase letter
    input a letter: c
    Lowercase letter
    input a letter: d
    Uppercase letter
    input a letter: e
    Uppercase letter
    input a letter: ^C
    [root@station1 ~]#

    可以看出来它的编码方式是:aAbBcCdDeE...yYzZ
    所以才会出现这种情况。这也算是一个小bug吧,如果想真的想达到我们想要的结果,可以用posix的[:upper:]。
    个人想法:有时候出现这种情况也不是个坏事,或许还可以利用这个bug去做点事。

    您可能感兴趣的文章:
    • 详解JavaScript中循环控制语句的用法
    • 详解JavaScript的流程控制语句
    • linux shell流程控制语句实例讲解(if、for、while、case语句实例)
    • Flash中常用到的ActionScript控制语句用法
    • JavaScript中的for循环与双重for循环详解
    • C语言控制语句之 循环
    上一篇:一个shell for循环与case结合的脚本(监控程序状态)
    下一篇:linux基础之Shell Script入门介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    shell脚本中case条件控制语句的一个bug分析 shell,脚本,中,case,条件,控制,