不支持强制使用 [ ] 和 [[ ]] 时替代 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
我知道一种使用正则表达式和 =~ 运算符检查输入是否为数字的方法,但是,先决条件是使用 [[ ]]。在不支持 [[ ]] 并且必须使用没有 =~ 运算符的 [ ] 的情况下,有哪些替代方案?
我发现正在使用选项 [ -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