我制作了一个非常简单的脚本,告诉我文件名和扩展名。 该脚本的工作原理如下:
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)。 我做错了吗?
答案 0 :(得分:3)
嗯,你得到的结果是预期的结果;我不知道这是否意味着你做错了什么。
模式替换的工作方式是,如果模式不匹配,则不会替换任何内容。在这里,您有${filename##*.}
表示删除所有字符,包括最后一段时间。但如果名称中没有句点,则模式不匹配且不删除任何内容,因此您只需获得与${filename}
相同的结果。
我应该指出${filename%\.*}
中的反斜杠是没用的:这里的模式是shell globbing而不是正则表达式,所以你不需要逃避一段时间。你可以写${filename%.*}
。
ETA:
没有办法一步到位。你有两个选择;您可以测试扩展名是否与文件名相同,如果是,则将其设置为空:
extension=${filename##*.}
[ "$extension" = "$filename" ] && extension=
或者你可以剥掉你已经计算过的基本名称,然后去掉任何领先的时期:
extension=${filename#$basename}
extension=${extension##*.}
答案 1 :(得分:2)
扩展在Unix文件系统中没有任何特权状态;它们只是人们特别对待的文件名的一部分。您必须先检查文件是否包含.
。
basename=${filename%\.*}
if [[ $filename = *.* ]]; then
extension=${filename##*.}
echo "FILE: " $basename " ; ESTENSIONE " $extension
else
extension=""
fi