不支持强制使用 [ ] 和 [[ ]] 时替代 Equal Tidle 运算符 (=~)

Alternative of Equal Tidle operator(=~) when forced to use [ ] and [[ ]] is not supported

我知道一种使用正则表达式和 =~ 运算符检查输入是否为数字的方法,但是,先决条件是使用 [[ ]]。在不支持 [[ ]] 并且必须使用没有 =~ 运算符的 [ ] 的情况下,有哪些替代方案?

我发现正在使用选项 [ -o ],但是在这个特殊的数字情况下它究竟如何工作?理想情况下,我想得到一个例子,说明这行 if ! [[ ${NUMBER} =~ ${RE} ]] 将使用 [ ] 而不是 [[ ]] 来编写。

这是一个例子:

RE=^[0-9]+$

read -p "Enter the number: " NUMBER



 if ! [[ ${NUMBER} =~ ${RE} ]];then

        echo 'Please enter a single positive number consisting of [0-9] digits' 1>&2

        exit 1

 fi

如果你的目标是 POSIX sh 你可以使用 grep-q 静默输出,-x 整行匹配,-E用于扩展正则表达式语法。

if ! printf '%s\n' "$number" | grep -qxE '[0-9]+'; then
    exit 1
fi

如果您需要 POSIX 之外的更多可移植性,请坚持使用基本的正则表达式语法并将 grep 的输出重定向到 /dev/null

if ! printf '%s\n' "$number" | grep '^[0-9]\+$' >/dev/null 2>&1; then
    exit 1
fi

两个版本都依赖 $number 作为 one-line 字符串。

您可以使用 POSIX 实用程序 expr 进行正则表达式匹配:

if expr "$number" : '[0-9][0-9]*$' > /dev/null; then
  echo "$number is a number"
fi

请注意,所有匹配项都定位到字符串的开头,因此不需要“^”定位点。 (如果您想忽略字符串的某些前缀,则需要将 .* 显式添加到正则表达式的开头。)

expr 输出匹配字符的数量或第一个捕获组的值。它还仅支持 POSIX BRE(基本正则表达式)。

有关详细信息,请参阅 -
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/expr.html#tag_20_42_13_01