我使用了以下这段代码
appcount_range="^[1-$APP_COUNT]$"
until [[ $APP_OPTION =~ $appcount_range ]]
do
echo "INVALID CHOICE! Please enter a valid option:"
read APP_OPTION
done
它检查是否正确输入了菜单选项。而且由于 APP_COUNT 是动态决定的,因此我无法对有效选项进行硬编码。这段代码在具有 ksh93 的基于 Linux 的服务器上完美运行,但相同的代码在具有 ksh88 的 Solaris 服务器上给出了语法错误:
syntax error at line ## : '=~' unexpected
为什么=~
ksh88 中没有公认的操作员,我应该使用什么作为比较正则表达式的替代方法?
这是 ksh88(
/bin/ksh
Solaris 10 和更早版本的,and/usr/xpg4/bin/sh
)会输出的错误。虽然
[[ ... ]]
语法确实来自 ksh,但=~
inside 是为数不多的实际 bashism 之一。bash
实际上是引入它的外壳(在 3.0 版中)。它后来被添加到
ksh93
(与/bin/sh
Solaris/bin/ksh
11 和更高版本的 and 一起使用)和zsh
,以及变体(=~
运算符也可以在 and 的/test
builin[
中使用)。ksh88 自 90 年代以来一直没有更新(除了错误修复或某些系统上的 POSIX 一致性修复)。zsh
yash
在这里,您不需要正则表达式,通配符模式也可以:
对于
=
运算符(来自 ksh),右手操作数是通配符模式。或者您可以使用标准方式进行模式匹配:请注意,它不适用于任何大于 9. 的值
[1-12]
,[21-1]
仅与 2 和 1 上的匹配(以及可能与某些区域设置相同的其他字符1
)匹配)。ksh 通配符模式在功能上等同于扩展正则表达式(除了
{x,y}
现代 ERE 变体中的区间运算符),但语法不同:.
->?
.*
->*
x*
->*(x)
x|y
->@(x|y)
x?
->?(x)
x+
->+(x)
[^x]
->[!x]
x{3,5}
->xxx?(x)?(x)
(ksh93 有{3,5}(x)
,ksh88 中没有)。如果您仍需要使用正则表达式,则需要使用单独的实用程序: