【问题标题】:Mix of regex and non-regex in bash if-statementbash if 语句中正则表达式和非正则表达式的混合
【发布时间】:2019-12-11 15:22:33
【问题描述】:

在我的$foo 变量中,我有这些数据(请密切注意.s 和,s):

,example.com,de.wikipedia.org,reddit,stackoverflow.com.,amazon.,

我正在尝试在bash 中编写一个if 语句,它的工作原理基本上是这样的:

if [[ "${foo}" =~ *','[a-z0-9]','* || "${foo}" =~ *','[a-z0-9]'.,'* ]]; then
    echo "Invalid input detected"
else
    echo "OK"
fi

它会回显Invalid input detected,因为redditamazon.$foo 中。

如果我将$foo 的内容更改为:

,example.com,de.wikipedia.org,www.reddit.com,stackoverflow.com.,amazon.com,

然后它会回显OK

我在 OS X 10.11.6 El Capitan 上使用 bash 3.2.57(1)-release。

【问题讨论】:

  • 假设你以后会在逗号上拆分,为什么不先这样做呢?

标签: regex bash macos if-statement command-line


【解决方案1】:

试试:

if [[ $foo =~ ,[a-z0-9]*, || $foo =~ ,[a-z0-9]*\., ]]; then
    echo "Invalid input detected"
else
    echo "OK"
fi

注意事项:

  1. =~ 是正则表达式运算符。右侧必须是正则表达式,而不是 glob。

  2. , 不是 shell 活动字符。因此,它不需要任何特殊的引用。

  3. [a-z0-9] 只匹配一个字母数字。由于我们希望允许更多任意数字,请使用[a-z0-9]*

  4. 在正则表达式中,','* 匹配零个或多个逗号。这不是你想要的。有人可能会写,.*,因为. 是一个通配符,它​​匹配一个逗号后跟零个或多个任何内容。由于正则表达式没有锚定到末尾,因此添加最后一个 .* 没有区别。

  5. [[...]] 内部没有分词。因此,shell 变量不需要在其他地方进行双引号。

  6. 请注意,在[a-z0-9] 中,与a-z0-9 匹配的确切字符取决于语言环境中的排序顺序。

【讨论】:

  • 刚刚注意到,第二个if语句怎么不是$foo =~ ,[a-z0-9]*\.,?这就是您所说的“添加最后的.* 没有区别。”?我直观地将 if 语句解释为仅匹配一个字母数字而不是(可能)多个。
  • @leetbacoon 哎呀,你是对的。那是一个错字。答案已更新。
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 2022-10-24
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2019-11-28
  • 2012-03-26
  • 2011-08-21
相关资源
最近更新 更多