shell脚本奇怪的正则表达式

时间:2016-02-24 05:22:48

标签: regex bash shell centos6

我有一些在我的shell脚本中表现奇怪的正则表达式我有变量,我已经尝试了各种方式让他们表现,他们似乎没有做任何正则表达式,我知道我的正则表达式很好,谢谢regex101,这是样本的样子

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

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

现在它什么都不显示 如果我改变发现

FIND="[9]*"

然后它不打印任何报价 如果我说

FIND="[a-z]*"

然后它不打印任何引号

如果我说

FIND="dircheck"

然后没有打印

如果我说

FIND="*ck"

然后没有打印

我不知道这个正则表达式是如何工作的

我如何使用这些变量,以及正确的语法

2 个答案:

答案 0 :(得分:1)

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

  • [9]*9个字符的任意数字(包括零)。 9中的字符direcheck为零,因此匹配。 (编辑来自brainfart,谢谢chepner)

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

  • [a-z]*az之间的任意数量的字符(即任意数量的小写字母)。如果没有引用,这将匹配。

答案 1 :(得分:0)

我终于明白了,为什么它的工作如此奇怪

[a-z] *和[9] *和[任何地方] *它们都匹配,因为它匹配零次或多次。所以“direcheck”有[9]零次或多次。

所以

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

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

都是正确的,

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

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