我试图确定用户给出的文件名是否包含无效字符。我添加了这一部分:
filename=$(basename "$sourceFilePath")
if [[ ! $filename =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then
echo "Invalid characters in filename: $filename Please provide a valid filename."
exit 0
fi
不幸的是,当文件名有效时,它会进入查询。例如:
if [[ ! test.txt =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then echo "Invalid characters in filename: Please provide a valid filename."; fi
Invalid characters in filename: Please provide a valid filename.
if [[ ! "test.txt" =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then echo "Invalid characters in filename: Please provide a valid filename."; fi
Invalid characters in filename: Please provide a valid filename.
我做错了什么?
谢谢
反斜杠在 bash 正则表达式中不起作用。点不需要它,但需要移动破折号才能使组的开头或结尾消失。
if [[ ! $filename =~ ^[a-zA-Z0-9_.-]+$ ]]; then
另请注意,此正则表达式接受
.
或 ..
等名称,这可能会导致问题。
您没有指定“无效”的标准,但从您的尝试来看,我假设您想验证文件名仅由字母、数字、下划线字符、破折号和句点组成。
对于这样一个简单的测试,使用正则表达式就有点大材小用了。如果你颠倒测试的逻辑,你可以通过通配符到达那里:
if [[ $filename == *[^-_.[:alnum:]]* ]]
then
echo The name $filename contains an invalid character
else
echo The name $filename is valid
fi
这里的技巧不仅是否定有效字符的范围,而且还要将
-
放置在有效字符列表的start处,这样它就不会被理解为字符范围指示符。
根据您的要求,您也可以使用
a-zA-Z0-9
代替字符类 [:alnum:]
。