【问题标题】:KSH script checks for alphanumeric in case statementKSH 脚本检查 case 语句中的字母数字
【发布时间】:2017-11-21 13:11:19
【问题描述】:

下面是我想要实现的简化模型:

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

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

约束:

  1. 验证需要在 case 语句中进行
  2. 不支持alnum函数
  3. 仅限正检查。无法检查是否缺少字母数字。

非常感谢

【问题讨论】:

  • 也只是想引起您的注意。你在 hashbang 中漏掉了一个斜线:#!/bin/ksh

标签: unix case ksh


【解决方案1】:

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

【讨论】:

  • 谢谢。你能解释一下翻转支票的理由吗?我尝试了 [[:alnum:]] 并且它同时传递了字母数字和非字母数字字符串。
  • 由于* 是真正的通配符模式:它可以匹配任何东西。因此,*[[:alnum:]]* 模式意味着 any character 可以出现在字母数字字符之前和/或之后。据推测,您的“非字母数字字符串”至少包含一个 alnum 字符。这就是为什么更容易翻转逻辑:如果字符串包含至少一个非 alnum 字符,则该字符串不能完全是 alnum。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多