我有一些在我的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"
然后没有打印
我不知道这个正则表达式是如何工作的
我如何使用这些变量,以及正确的语法?
答案 0 :(得分:1)
*
和*ck
是无效的正则表达式。如果您与==
进行比较,而不是=~
,则它会起作用(没有引号)。如果您希望使用==
中获得的相同功能,则等效的正则表达式为.*
和.*ck
。
[9]*
是9
个字符的任意数字(包括零)。 9
中的字符direcheck
为零,因此匹配。 (编辑来自brainfart,谢谢chepner)
dircheck
中找不到 direcheck
,因此不打印任何内容都不足为奇。
[a-z]*
是a
和z
之间的任意数量的字符(即任意数量的小写字母)。如果没有引用,这将匹配。
答案 1 :(得分:0)
我终于明白了,为什么它的工作如此奇怪
[a-z] *和[9] *和[任何地方] *它们都匹配,因为它匹配零次或多次。所以“direcheck”有[9]零次或多次。
所以
if [[ "$fname" =~ $FIND ]]; then
或
if [[ $fname =~ $FIND ]]; then
都是正确的,
if [[ "$fname" =~ "$FIND" ]]; then
仅在字符串完全匹配时匹配,因为$FIND
匹配为文字字符串而不是正则表达式