Line 4:
if [[ "$var" =~ '^[[:digit:]]+$' ]]; then
^-- SC2076 (warning): Remove quotes from right-hand side of =~ to match as a regex rather than literally.
这告诉我们应该改写:
#!/bin/bash
for var in 1 2 3 a b c; do
if [[ "$var" =~ ^[[:digit:]]+$ ]]; then
echo "$var is a number"
else
echo "$var is NOT a number"
fi
done
哪个产生:
1 is a number
2 is a number
3 is a number
a is NOT a number
b is NOT a number
c is NOT a number
事实并非如此,因为一个简单的测试将向我们展示:
运行以上产生:
如果您有一个
shellcheck
自动运行的编辑器,或者如果您将代码粘贴到https://shellcheck.net/,您将看到以下错误:这告诉我们应该改写:
哪个产生:
这记录在bash 手册页中:
取决于你所说的数字是什么意思。
0x12
,inf
,1.2
,-12
,¹²³
,⑱
,1e6
,1,000,000
,Ⅷ
,0x123p-5
,6,23
,0b100110
都是某些数字定义的数字,而08
,019
,9999999999999999999999999999999999
不是某些其他定义的有效数字。要测试一个字符串是否由一个或多个 ASCII 十进制数字组成,您可以使用:
标准地:
或者在 ksh、bash(
bash -O extglob
旧版本)或zsh -o kshglob
:或者在 bash / ksh93 / zsh / yash 中:
valid() [[ $1 =~ '^[0123456789]+$' ]]
也可以在 zsh¹ 和 bash 3.1 或bash -O compat31
. 在 中zsh
,如果rematchpcre
启用了该选项,则需要将其更改为[[ $1 =~ '^[0123456789]\z' ]]
PCRE$
匹配主题末尾的内容,但也需要在主题末尾的换行符之前进行匹配,例如匹配$'123\n'
。你也可以使用[[ $1 =~ '^\d+\z' ]]
then。在
zsh
:在任何情况下,避免
[[:digit:]]
which 在某些系统上匹配十进制数字而不是 ASCII 阿拉伯数字。并且除了在 zsh 中,尤其是在 bash 中,不要用于[0-9]
输入验证,因为它通常匹配恰好在 0 到 9 之间排序的随机字符。¹ 但是请注意,在 zsh 中,变量值可以包含 NUL 字节,而标准正则表达式 API(与 PCRE 相对)不支持匹配其中包含 NUL 的字符串。当该
rematchpcre
选项未启用时,[[ $1 =~ '^[0123456789]+$' ]]
将匹配$'123\0xyz'
例如。