KSH脚本检查case语句中的字母数字

时间:2017-11-21 13:11:20

标签: unix case ksh

以下是我尝试实现的简化模型:

#!bin/ksh
string=AUS00
case $string in
[[:alnum:]] ) echo "alphanumeric" ;;
*) echo "nope" ;;
esac

我无法验证字母数字代码。

约束:

  1. 验证需要在案例陈述中进行
  2. 不支持alnum功能
  3. 仅限正面检查。无法检查是否缺少字母数字。
  4. 非常感谢

1 个答案:

答案 0 :(得分:2)

模式[[:alnum:]]将匹配单个字母数字字符。你的字符串长于一个字符,所以它不会匹配。

如果您想检查字符串是否包含 alnum字符,您需要*[[:alnum:]]*

如果你想检查你的字符串是否只包含 alnum字符,我会翻转检查以查看该字符串是否包含非alnum字符:

for string in alnumOnly 'not all alnum'; do
    case "$string" in
        *[^[:alnum:]]*) echo "$string -> nope" ;;
        *)              echo "$string -> alphanumeric" ;;
    esac
done
alnumOnly -> alphanumeric
not all alnum -> nope

我意识到ksh(甚至是ksh88)实现了bash所描述的"扩展模式":

  

模式列表是分隔的一个或多个模式的列表        彼此用|。可以形成复合图案        使用以下一项或多项:

     

?(模式列表)              可选地匹配给定模式中的任何一个。

     

*(模式列表)              匹配给定的零次或多次出现              图案。

     

+(模式列表)              匹配给定模式的一个或多个实例。

     

@(模式列表)              恰好匹配给定模式之一。

     

!(模式列表)              匹配任何东西,除了给定的模式之一。

所以我们可以这样做:

case "$string" in
    +([[:alnum:]]) ) echo "$string -> alphanumeric" ;;
    *              ) echo "string -> nope" ;;
esac