如何使用正则表达式检查 bash 中 0-5 之间的输入

pre*_*tam 1 bash shell-script regular-expression

用于检查某个范围内的单个数字的正则表达式模式是什么?我正在尝试以下模式,该模式在测试时似乎有效 https://regex101.com/

模式:\b([0-5])\b

预期结果:

输入:2 输出:好的

输入:5 输出:好的

输入:6 输出:无

输入:22 输出:无

test$ ch=2
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=6
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=62
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=0
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$
Run Code Online (Sandbox Code Playgroud)

我也尝试过双回:

test$ ch=2
test$ [[ $ch =~ \\b[0-5]\\b ]] && echo "ok" || echo "no"
no
test$ [[ $ch =~ \\b([0-5])\\b ]] && echo "ok" || echo "no"
no
Run Code Online (Sandbox Code Playgroud)

就我而言,bash总是给出“不”。为什么它会这样?

Sté*_*las 7

要验证它$ch是 ASCII 数字01234或 中的任意一个5,请使用:

\n\n

不要使用诸如[0-5]对于输入验证(取决于系统和区域设置),往往包括除 012345 之外恰好在 0 到 5 之间排序的许多其他字符,例如\xd9\xa0\xd9\xa1\xd9\xa2\xd9\xa3\xd9\xa4\xdb\xb0\xdb\xb1\xdb\xb2\xdb\xb3\xdb\xb4\xdf\x80\xdf\x81\xdf \x82\xdf\x83\xdf\x84\xe0\xa5\xa6\xe0\xa5\xa7\xe0\xa5\xa8\xe0\xa5\xa9\xe0\xa5\xaa\xe0\xa7\xa6\xe0\xa7 \xa7\xe0\xa7\xa8\xe0\xa7\xa9\xe0\xa7\xaa\xe0\xa9\xa6\xe0\xa9\xa7\xe0\xa9\xa8\xe0\xa9\xa9\xe0\xa9\xaa \xe0\xab\xa6\xe0\xab\xa7\xe0\xab\xa8\xe0\xab\xa9\xe0\xab\xaa\xe0\xad\xa6\xe0\xad\xa7\xe0\xad\xa8\xe0 \xad\xa9\xe0\xad\xaa\xe0\xaf\xa6\xe0\xaf\xa7\xe0\xaf\xa8\xe0\xaf\xa9\xe0\xaf\xaa\xe0\xb1\xa6\xe0\xb1 \xa7\xe0\xb1\xa8\xe0\xb1\xa9\xe0\xb1\xaa\xe0\xb1\xb8\xe0\xb1\xb9\xe0\xb1\xba\xe0\xb1\xbb\xe0\xb1\xbc \xe0\xb1\xbd\xe0\xb1\xbe\xe0\xb3\xa6\xe0\xb3\xa7\xe0\xb3\xa8\xe0\xb3\xa9\xe0\xb3\xaa\xe0\xb5\xa6\xe0 \xb5\xa7\xe0\xb5\xa8\xe0\xb5\xa9\xe0\xb5\xaa\xe0\xb7\xa6\xe0\xb7\xa7\xe0\xb7\xa8\xe0\xb7\xa9\xe0\xb7 \xaa\xe0\xb9\x90\xe0\xb9\x91\xe0\xb9\x92\xe0\xb9\x93\xe0\xb9\x94\xe0\xbb\x90\xe0\xbb\x91\xe0\xbb\x92 \xe0\xbb\x93\xe0\xbb\x94\xe0\xbc\xa0\xe0\xbc\xa1\xe0\xbc\xa2\xe0\xbc\xa3\xe0\xbc\xa4\xe0\xbc\xaa\xe0 \xbc\xab\xe0\xbc\xac\xe0\xbc\xad\xe0\xbc\xb3\xe1\x81\x80\xe1\x81\x81\xe1\x81\x82\xe1\x81\x83\xe1\x81 \x84\xe1\x82\x90\xe1\x82\x91\xe1\x82\x92\xe1\x82\x93\xe1\x82\x94\xe1\x8d\xa9\xe1\x8d\xaa\xe1\x8d\xab \xe1\x8d\xac\xe1\x9f\xa0\xe1\x9f\xa1\xe1\x9f\xa2\xe1\x9f\xa3\xe1\x9f\xa4\xe1\x9f\xb0\xe1\x9f\xb1\xe1 \x9f\xb2\xe1\x9f\xb3\xe1\x9f\xb4\xe1\xa0\x90\xe1\xa0\x91\xe1\xa0\x92\xe1\xa0\x93\xe1\xa0\x94\xe1\xa5 \x86\xe1\xa5\x87\xe1\xa5\x88\xe1\xa5\x89\xe1\xa5\x8a\xe1\xa7\x90\xe1\xa7\x91\xe1\xa7\x92\xe1\xa7\x93 \xe1\xa7\x94\xe1\xa7\x9a\xe1\xaa\x80\xe1\xaa\x81\xe1\xaa\x82\xe1\xaa\x83\xe1\xaa\x84\xe1\xaa\x90\xe1 \xaa\x91\xe1\xaa\x92\xe1\xaa\x93\xe1\xaa\x94\xe1\xad\x90\xe1\xad\x91\xe1\xad\x92\xe1\xad\x93\xe1\xad \x94\xe1\xae\xb0\xe1\xae\xb1\xe1\xae\xb2\xe1\xae\xb3\xe1\xae\xb4\xe1\xb1\x80\xe1\xb1\x81\xe1\xb1\x82 \xe1\xb1\x83\xe1\xb1\x84\xe1\xb1\x90\xe1\xb1\x91\xe1\xb1\x92\xe1\xb1\x93\xe1\xb1\x94\xe2\x81\xb0\xe2 \x81\xb4\xe2\x82\x80\xe2\x82\x81\xe2\x82\x82\xe2\x82\x83\xe2\x82\x84\xe2\x85\x90\xe2\x85\x91\xe2\x85 \x92\xe2\x85\x93\xe2\x85\x94\xe2\x85\x95\xe2\x85\x96\xe2\x85\x97\xe2\x85\x98\xe2\x85\x99\xe2\x85\x9b \xe2\x85\x9c\xe2\x85\x9f\xe2\x86\x89\xe2\x91\xa0\xe2\x91\xa1\xe2\x91\xa2\xe2\x91\xa3\xe2\x91\xa9\xe2 \x91\xaa\xe2\x91\xab\xe2\x91\xac\xe2\x91\xad\xe2\x91\xae\xe2\x91\xaf\xe2\x91\xb0\xe2\x91\xb1\xe2\x91 \xb2\xe2\x91\xb3\xe2\x91\xb4\xe2\x91\xb5\xe2\x91\xb6\xe2\x91\xb7\xe2\x91\xbd\xe2\x91\xbe\xe2\x91\xbf \xe2\x92\x80\xe2\x92\x81\xe2\x92\x82\xe2\x92\x83\xe2\x92\x84\xe2\x92\x85\xe2\x92\x86\xe2\x92\x87\xe2 \x92\x88\xe2\x92\x89\xe2\x92\x8a\xe2\x92\x8b\xe2\x92\x91\xe2\x92\x92\xe2\x92\x93\xe2\x92\x94\xe2\x92 \x95\xe2\x92\x96\xe2\x92\x97\xe2\x92\x98\xe2\x92\x99\xe2\x92\x9a\xe2\x92\x9b\xe2\x93\xaa\xe2\x93\xab \xe2\x93\xac\xe2\x93\xad\xe2\x93\xae\xe2\x93\xaf\xe2\x93\xb0\xe2\x93\xb1\xe2\x93\xb2\xe2\x93\xb3\xe2 \x93\xb4\xe2\x93\xb5\xe2\x93\xb6\xe2\x93\xb7\xe2\x93\xb8\xe2\x93\xbe\xe2\x93\xbf\xe2\x9d\xb6\xe2\x9d \xb7\xe2\x9d\xb8\xe2\x9d\xb9\xe2\x9d\xbf\xe2\x9e\x80\xe2\x9e\x81\xe2\x9e\x82\xe2\x9e\x83\xe2\x9e\x89\xe2\x9e\x8a\xe2\x9e\x8b\xe2\x9e\x8c\xe2\x9e\x8d\xe2\x9e\x93\xe3\x80\x87\xe3\x80\xa1\xe3\x80\xa2\xe3 \x80\xa3\xe3\x80\xa4\xe3\x89\x88\xe3\x89\x89\xe3\x89\x8a\xe3\x89\x8b\xe3\x89\x91\xe3\x89\x92\xe3\x89 \x93\xe3\x89\x94\xe3\x89\x95\xe3\x89\x96\xe3\x89\x97\xe3\x89\x98\xe3\x89\x99\xe3\x89\x9a\xe3\x89\x9b \xe3\x89\x9c\xe3\x89\x9d\xe3\x89\x9e\xe3\x89\x9f\xe3\x8a\xb1\xe3\x8a\xb2\xe3\x8a\xb3\xe3\x8a\xb4\xe3 \x8a\xb5\xe3\x8a\xb6\xe3\x8a\xb7\xe3\x8a\xb8\xe3\x8a\xb9\xe3\x8a\xba\xe3\x8a\xbb\xe3\x8a\xbc\xe3\x8a \xbd\xe3\x8a\xbe\xe3\x8b\x80\xe3\x8b\x81\xe3\x8b\x82\xe3\x8b\x83\xe3\x8b\x89\xe3\x8b\x8a\xe3\x8b\x8b \xe3\x8d\x98\xe3\x8d\x99\xe3\x8d\x9a\xe3\x8d\x9b\xe3\x8d\x9c\xe3\x8d\xa2\xe3\x8d\xa3\xe3\x8d\xa4\xe3 \x8d\xa5\xe3\x8d\xa6\xe3\x8d\xa7\xe3\x8d\xa8\xe3\x8d\xa9\xe3\x8d\xaa\xe3\x8d\xab\xe3\x8d\xac\xe3\x8d \xad\xe3\x8d\xae\xe3\x8d\xaf\xe3\x8d\xb0\xe3\x8f\xa0\xe3\x8f\xa1\xe3\x8f\xa2\xe3\x8f\xa3\xe3\x8f\xa9 \xe3\x8f\xaa\xe3\x8f\xab\xe3\x8f\xac\xe3\x8f\xad\xe3\x8f\xae\xe3\x8f\xaf\xe3\x8f\xb0\xe3\x8f\xb1\xe3 \x8f\xb2\xe3\x8f\xb3\xe3\x8f\xb4\xe3\x8f\xb5\xe3\x8f\xb6\xe3\x8f\xb7\xe3\x8f\xb8\xe3\x8f\xb9\xe3\x8f \xba\xe3\x8f\xbb\xe3\x8f\xbc\xe3\x8f\xbd\xe3\x8f\xbe\xea\x98\xa0\xea\x98\xa1\xea\x98\xa2\xea\x98\xa3 \xea\x98\xa4\xea\xa3\x90\xea\xa3\x91\xea\xa3\x92\xea\xa3\x93\xea\xa3\x94\xea\xa4\x80\xea\xa4\x81\xea \xa4\x82\xea\xa4\x83\xea\xa4\x84\xea\xa7\x90\xea\xa7\x91\xea\xa7\x92\xea\xa7\x93\xea\xa7\x94\xea\xa7 \xb0\xea\xa7\xb1\xea\xa7\xb2\xea\xa7\xb3\xea\xa7\xb4\xea\xa9\x90\xea\xa9\x91\xea\xa9\x92\xea\xa9\x93 \xea\xa9\x94\xea\xaf\xb0\xea\xaf\xb1\xea\xaf\xb2\xea\xaf\xb3\xea\xaf\xb4\xef\xbc\x90\xef\xbc\x91\xef \xbc\x92\xef\xbc\x93\xef\xbc\x94\xea\xa7\x93\xea\xa7\x94\xea\xa7\xb0\xea\xa7\xb1\xea\xa7\xb2\xea\xa7\xb3\xea\xa7\xb4\xea\xa9\x90\xea \xa9\x91\xea\xa9\x92\xea\xa9\x93\xea\xa9\x94\xea\xaf\xb0\xea\xaf\xb1\xea\xaf\xb2\xea\xaf\xb3\xea\xaf \xb4\xef\xbc\x90\xef\xbc\x91\xef\xbc\x92\xef\xbc\x93\xef\xbc\x94\xea\xa7\x93\xea\xa7\x94\xea\xa7\xb0\xea\xa7\xb1\xea\xa7\xb2\xea\xa7\xb3\xea\xa7\xb4\xea\xa9\x90\xea \xa9\x91\xea\xa9\x92\xea\xa9\x93\xea\xa9\x94\xea\xaf\xb0\xea\xaf\xb1\xea\xaf\xb2\xea\xaf\xb3\xea\xaf \xb4\xef\xbc\x90\xef\xbc\x91\xef\xbc\x92\xef\xbc\x93\xef\xbc\x94

\n

您也可以使用正则表达式[[ $ch =~ ^[012345]$ ]],但这比使用caseor [[...]]\'s没有什么优势=

\n

匹配 0 到 5 之间数字的任何整数十进制表示形式(包括-0, 0004)可能很有用+5,您可以使用以下方法:

\n
[[ $ch =~ ^(-0+|\\+?0*[012345])$ ]]\n
Run Code Online (Sandbox Code Playgroud)\n

比 Korn 风格稍短:

\n
[[ $ch = @(-+(0)|?(+)*(0)[012345]) ]]\n
Run Code Online (Sandbox Code Playgroud)\n

熟悉正则表达式的人可能更容易阅读。

\n

切勿使用[[...]]构造的算术运算符 (如[[ $ch -ge 0 && $ch -le 5 ]]) 或((...))(如(( ch >= 0 && ch <= 5 ))) 进行输入验证,因为它们会引入任意命令执行漏洞[ "$ch" -ge 0 ] && [ "$ch" -le 5 ]在 bash 中没有问题,但会在数字不正确时输出错误,并允许数字周围有空格。

\n

\\b([0-5])\\b是一个 perl 正则表达式( https://regex101.com的默认值),它匹配前面和后面有单词boundary的 012345 个字符中的任何一个,前提是它前面和后面都没有单词 character,单词字符是字母数字字符和下划线。例如,它会匹配 in 123.5,因为那里有一个5前面的.不是单词字符并且后面没有任何内容。

\n

bash\'s=~使用 POSIX 扩展正则表达式,而不是 perl 正则表达式,并且 POSIX ERE 中的行为\\b未指定。

\n

由于https://regex101.com目前不提供 POSIX ERE 作为正则表达式风格的选择,因此您不应该使用它来验证 bash[[ =~ ]]运算符中使用的正则表达式。

\n

在某些系统中,bash 使用的扩展正则表达式匹配器支持\\b作为标准的扩展,但在bash 中[[ $ch =~ \\b[0-5]\\b ]],bash 将其视为\\b带引号的b,就像您编写的一样,[[ $ch =~ \'b\'[0-5]\'b\' ]]并且不会将反斜杠传递给正则表达式引擎。

\n

您可以使用以下方法解决这个问题:

\n
regex=\'\\b[012345]\\b\' # with the [0-5] also fixed to [012345]\n[[ $ch =~ $regex ]]\n
Run Code Online (Sandbox Code Playgroud)\n

其中反斜杠将传递给正则表达式匹配器\xc2\xb9,但这仅适用于支持该\\b扩展的系统。

\n

使用标准 ERE 语法执行此操作将如下所示:

\n
[[ $ch =~ (^|[^[:alnum:]_])[012345]([^[:alnum:]_]|$) ]]\n
Run Code Online (Sandbox Code Playgroud)\n

要使用 perl 风格的正则表达式,您可以切换到zsh可以rematchpcre在其自己的运算符中使用 PCRE(现在为 PCRE2,下一版本为 PCRE3)的选项=~

\n
set -o rematchpcre\n[[ $ch =~ \'\\b[0-5]\\b\' ]]\n
Run Code Online (Sandbox Code Playgroud)\n

可以在那里工作(并且 zsh 没有 bash 的缺陷,即 shell 引用被视为正则表达式转义,这也允许它使用其他正则表达式引擎)。

\n

zsh 还有一个 glob 运算符来匹配十进制整数范围,因此[[ $ch = <0-5> ]]可以匹配000, 01, 3... 并且[[ $ch = (-<0-0>|(+|)<0-5>) ]]会执行相同的操作[[ $ch =~ \'^(-0+|\\+?0*[012345])$\' ]](请注意正则表达式周围的引号与 bash 3.2+ 的区别)。

\n
\n

\xc2\xb9 请参阅[[ ]] 中的 bash 正则表达式匹配失败以及如何将正则表达式存储在 shell 变量中避免引用 shell 特有字符的问题?了解详细信息以及类似 Korn 的 shell 中内置正则表达式匹配的历史

\n