我最近开始使用 Shell 脚本。因此,我面临一个问题,当我将文件名作为用户的输入时,如果我给出空格,那么我的代码不会处理它。任何相同的答案
我的代码如下所示:
echo "---------------- Please provide the filename -------------------------"
read filename
if [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
printf "some code "
else
printf "some code"
fi
任何人都可以帮助我,如何处理空格字符,以便如果输入参数中提供了空格,那么它应该给出一些错误。
谢谢
答案1
您可以使用正则表达式检查:
整个代码如下所示:
if [[ $filename =~ \ ]]; then
printf "error"
exit(1)
elif [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
printf "some code "
else
printf "some code"
fi
答案2
为什么要限制文件名?在大多数文件系统上,Unix 文件名可以包含除 NUL (\0) 和正斜杠 (/) 之外的任何字符。您现在最好学习如何处理不寻常的文件名,而不是像您一样养成只期待字母和数字的习惯,然后在遇到意外情况时被咬住。
我建议阅读一些有关如何处理带有空格和其他奇怪字符的文件名的文章。
第一个技巧是始终在变量周围使用双引号。在某些情况下,您不需要这样做,但对于初学者来说,总是这样做会更容易。仅此一项就可能解决您现在正在尝试解决的特定问题。
我建议的下一件事是阅读并学会喜欢这个find
命令,特别是它的-exec
操作符。这使得在操作整个文件目录树时可以轻松地执行正确的操作。例如,永远不要这样做:
for f in *; do
do-something-with-a-file "$f"
done
如果任何文件的名称中包含空格、制表符或换行符(是的,文件名可以包含换行符!),则此操作将无法正常工作。不仅如此,它还不允许您区分文件和目录。
相反,请执行以下操作:
find -maxdepth 1 -type f -exec do-something-with-a-file {} \;
该-maxdepth
运算符将结果限制为当前目录中的结果,-type f
告诉find
我们只需要文件,而不是目录,并对每个文件-exec somecommand {} \;
执行somecommand
一次,传递文件名(正确引用)来代替{}
.分号前面的反斜杠是为了 shell 的缘故,这样 shell 就不会处理分号,而是将其传递给命令find
。
这只是正确处理文件名的快速入门。请阅读一些有关该主题的内容,如果您遇到困难,可以在这里发布更多问题。