我做了一个非常简单的脚本,它告诉我文件名和扩展名。该脚本的工作方式如下:
for file in * ; do
if [[ -f $file ]] ; then
filename=${file##*/}
basename=${filename%.*}
extension=${filename##*.}
if [[ -n $extension ]] ; then
echo "FILE: " $basename " ; ESTENSIONE " $extension
fi
fi
done
问题是,当我有一个没有扩展名的文件(例如 Makefile)时,它说扩展名是文件名本身(例如 extension= Makefile)。我做错了什么吗?
好吧,你得到的结果是预期的结果;我不知道这是否意味着你做错了什么。
模式替换的工作方式是,如果模式不匹配,则不会替换任何内容。 在这里,您有${filename##*.}
,它说删除所有字符,包括最后句点。 但是,如果名称中没有句点,则模式不匹配,并且不会删除任何内容,因此您只需获得与${filename}
相同的结果。
我应该指出,${filename%.*}
中的反斜杠是没有用的:这里的模式是 shell 通配而不是正则表达式,所以你不需要转义句点。 你可以写${filename%.*}
.
伊塔:
没有办法一步到位地做你想做的事。 你有两个选择;您可以测试扩展名是否与文件名相同,如果是,请将其设置为空:
extension=${filename##*.}
[ "$extension" = "$filename" ] && extension=
或者您可以去除已经计算的基本名称,然后删除任何前导句点:
extension=${filename#$basename}
extension=${extension##*.}
在Unix文件系统中没有任何特权地位;它们只是人们特别对待的文件名的一部分。您必须先检查文件是否包含.
。
basename=${filename%.*}
if [[ $filename = *.* ]]; then
extension=${filename##*.}
echo "FILE: " $basename " ; ESTENSIONE " $extension
else
extension=""
fi