今天在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去做点事。。。。
阅读(3893) | 评论(2) | 转发(2) |