手机
当前位置:查字典教程网 >脚本专栏 >linuxshell >shell脚本中case条件控制语句的一个bug分析
shell脚本中case条件控制语句的一个bug分析
摘要:在shell脚本中,发现case语句的一个问题。就是指定小写字母[a-z]和大写字母[A-Z]的这种方法不管用了。出现如下情况:复制代码代码...

在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去做点事。

【shell脚本中case条件控制语句的一个bug分析】相关文章:

shell脚本联合PHP脚本采集网站的pv和alexa排名

Shell脚本中通过正则表达式匹配IP地址

Shell脚本调快调慢系统时间(测试服务器时使用)

用shell脚本在mysql表中批量插入数据的方法

shell中删除文件中重复行的方法

Shell脚本实现的阳历转农历代码分享

使用Shell 脚本实现每隔100行插入一条记录且记录第一列包含行号其他列不变

Shell脚本中实现把输入的密码转换为*(星号)的方法

Shell脚本实现自动检测修改最快的Ubuntu软件源

Shell脚本中获取本机ip地址的3个方法

精品推荐
分类导航