在 bash 中识别文件名中的无效字符

问题描述 投票:0回答:2

我试图确定用户给出的文件名是否包含无效字符。我添加了这一部分:

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.

我做错了什么?

谢谢

regex bash character
2个回答
2
投票

反斜杠在 bash 正则表达式中不起作用。点不需要它,但需要移动破折号才能使组的开头或结尾消失。

if [[ ! $filename =~ ^[a-zA-Z0-9_.-]+$ ]]; then

另请注意,此正则表达式接受

.
..
等名称,这可能会导致问题。


0
投票

您没有指定“无效”的标准,但从您的尝试来看,我假设您想验证文件名仅由字母、数字、下划线字符、破折号和句点组成。

对于这样一个简单的测试,使用正则表达式就有点大材小用了。如果你颠倒测试的逻辑,你可以通过通配符到达那里:

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:]

© www.soinside.com 2019 - 2024. All rights reserved.