以下是我尝试实现的简化模型:
#!bin/ksh
string=AUS00
case $string in
[[:alnum:]] ) echo "alphanumeric" ;;
*) echo "nope" ;;
esac
我无法验证字母数字代码。
约束:
非常感谢
答案 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