我想检查文件名是否匹配以字母数字字符([a-zA-Z0-9])开头的特定模式,并且仅包含字母数字字符以及“。”,“-”和“ _”字符。
fileNamePattern="^[a-zA-Z0-9]+[\.-_]*"
if [[ $i(file from input) == $fileNamePattern ]]
then
echo "success"
else
echo "fail"
fi
这是我尝试解决的方法,但是在“ [[”之后没有告诉我意外的运算符,请帮助我。
如果将扩展的正则表达式转换为球形模式,则可以使用case ... esac
indash
来检查变量的值是否与之匹配,而无需进行以下操作grep
:
case $name in
[a-zA-Z0-9]*[._-]*)
echo success
;;
*)
echo failure
esac
该模式将匹配一个以任何匹配的字符开头的值,[a-zA-Z0-9]
然后还包含点,下划线或破折号(即使您的表达式允许不存在最后一组字符,我也想检查该值)在字符串中)。请注意,我已经将破折号移到了括号表达式的末尾,因为在.
和_
(.-_
)之间使用范围几乎没有意义。我也假设你不希望匹配字面的反斜杠。如果您这样做,请添加\\
到第二个括号表达式中。
嗯,这看起来不错,但它并没有你想要的东西因为这样做*
仍然可以匹配一个非字母数字字符,是不是.
,_
或-
。
让我们尝试颠倒测试的意义,所以我们测试一下失败的名称:
case $name in
*[![:alnum:]_.-]*)
echo failure
;;
*)
echo success
esac
现在,我们检测到包含我们知道我们不需要的字符的值。但是,我们尚未正确测试该值是否以字母数字字符开头...
case $name in
*[![:alnum:]_.-]*)
echo 'failure (contains wrong characters)'
;;
*)
case $name in
[[:alnum:]]*)
echo success
;;
*)
echo 'failure (does not start with alnum)'
esac
esac
这最多可以进行两个测试,首先检查该值是否包含我们不想要的字符,然后(如果没有)检查它是否以正确的字符类型开头。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句