shell 脚本奇数正则表达式

shell script odd regex

我有一些正则表达式在我的 shell 脚本中表现得很奇怪我有变量,我已经尝试了各种方法让它们表现出来,但它们似乎不做任何正则表达式,我知道多亏了 regex101,我的正则表达式非常好,下面是一个示例

fname="direcheck"
FIND="*"
if [[ $fname =~ $FIND ]]; then
echo "no quotes"
fi

if [[ "$fname" =~ "$FIND" ]]; then
echo "with quotes"
fi

现在什么都不显示 如果我将 find 更改为

FIND="[9]*"

然后它不打印引号 如果我说

FIND="[a-z]*"

然后它不打印引号

如果我说

FIND="dircheck"

然后什么都不打印

如果我说

FIND="*ck"

然后什么都不打印

我不明白这个正则表达式是如何工作的

我如何使用这些变量,正确的语法是什么

  • **ck 是无效的正则表达式。如果您与 == 而不是 =~ 进行比较,它会起作用(没有引号)。如果您想为它们使用在 == 中获得的相同功能,则等效的正则表达式是 .*.*ck.

  • [9]*9 的任意数量(包括零)字符。您的 direcheck 中有零个字符 9,因此匹配。 (由 brainfart 编辑,感谢 chepner)

  • dircheck 未在 direcheck 中找到,因此不打印任何内容不足为奇。

  • [a-z]* 是介于 az 之间的任意数量的字符(即任意数量的小写字母)。这将匹配,假设它没有被引用。

我终于弄明白了,为什么它工作起来这么奇怪

[a-z]* 和 [9]* 以及 [anythinghere]* 它们都匹配,因为它匹配零次或多次。所以 "direcheck" 有 [9] 零次或多次。

所以

 if [[ "$fname" =~ $FIND ]]; then

 if [[ $fname =~ $FIND ]]; then

都正确,

if [[ "$fname" =~ "$FIND" ]]; then

仅在字符串完全匹配时才匹配,因为 $FIND 作为文字字符串而不是正则表达式匹配