这在语法上是错误的:
#!/usr/bin/env bash
dimension="4x5"
if [[ "$dimension" !=~ '[0-9]x[0-9]' ]]; then
echo 'wtf meng, the dimension needs an "x" in it.'
return 1;
fi
上面的语法不好......所以我的问题是 - 有办法吗!=~
...我猜它是!~
?如果这是真的,那么对于否定规则 lulz 来说就这么多了。好的。。我试了一下还是!~
不行。。
关键字没有
!=~
or!~
运算符。[[
相反,否定比较的结果:关于引用
regex
论点,手册指出:regex
因此,不应引用正则表达式部分——除非compat31
设置了 shell 选项:对于给定的示例,请尝试:
regex
应该用 锚定^...$
,否则foo1x1fubar
将被视为有效维度。还要记住不要使用
0-9
输入验证之类的范围,特别是如果它用于在安全敏感的上下文中进行清理,就像在许多语言环境中一样,这些范围包含比历史上更多的字符(或可能由多个字符组成的整理元素)(并且仍然在 C/POSIX 语言环境中执行)。对于
=~
,bash
'sglobasciiranges
在这里没有帮助。在 Ubuntu 19.10 和en_GB.UTF-8
语言环境中,我发现除了 0123456789 之外,还有 1040 个不同的字符匹配,有或bash
没有. 至少在我的情况下,它们都与十进制数字 0 到 8 有某种关系,但一般情况下甚至不能保证。[0-9]
globasciiranges
另一方面,仅在这 10 个上匹配,
[[:digit:]]
并且[0123456789]
应该在任何符合 POSIX 的系统上。您也可以使用标准
sh
语法和通配符模式来执行此操作,例如:或者使用 ksh glob(即使没有也支持
bash -O extglob
andbash
):[[
extglob
好吧,这似乎可行:
但我想知道为什么用单引号包裹它不起作用:
这是我的解决方案:
现在您可以使用单引号来引用正则表达式,但在 [[ ]] 中引用 $regex 时必须避免使用双引号。但是我仍然很好奇是否有
[0-9]+
..