没有扩展名的文件:在bash脚本中如何注意?
我制作了一个非常简单的脚本,告诉我文件名和扩展名。 该脚本的工作原理如下:没有扩展名的文件:在bash脚本中如何注意?,bash,makefile,Bash,Makefile,我制作了一个非常简单的脚本,告诉我文件名和扩展名。 该脚本的工作原理如下: for file in * ; do if [[ -f $file ]] ; then filename=${file##*/} basename=${filename%\.*} extension=${filename##*.} if [[ -n $extension ]] ; then echo "FILE: " $ba
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 globbing而不是正则表达式,因此不需要转义句点。您只需编写${filename%.*}
预计到达时间:
你不可能一步到位。你有两个选择;您可以测试扩展名是否与文件名相同,如果是,则将其设置为空:
extension=${filename##*.}
[ "$extension" = "$filename" ] && extension=
或者,您可以去掉已计算的basename,然后去掉任何前导句点:
extension=${filename#$basename}
extension=${extension##*.}
嗯,你得到的结果是预期的结果;我不知道这是否意味着你做错了什么 模式替换的工作方式是,如果模式不匹配,则不会替换任何内容。这里有
${filename###*.}
,表示删除最后一个句点之前的所有字符。但是如果名称中没有句点,则模式不匹配,并且没有任何内容被删除,因此您只需获得与${filename}
相同的结果
我应该指出,${filename%\.*}
中的反斜杠是无用的:这里的模式是shell globbing而不是正则表达式,因此不需要转义句点。您只需编写${filename%.*}
预计到达时间:
你不可能一步到位。你有两个选择;您可以测试扩展名是否与文件名相同,如果是,则将其设置为空:
extension=${filename##*.}
[ "$extension" = "$filename" ] && extension=
或者,您可以去掉已计算的basename,然后去掉任何前导句点:
extension=${filename#$basename}
extension=${extension##*.}
扩展在Unix文件系统中没有任何特权状态;它们只是人们特别对待的文件名的一部分。您必须首先检查文件是否包含
basename=${filename%\.*}
if [[ $filename = *.* ]]; then
extension=${filename##*.}
echo "FILE: " $basename " ; ESTENSIONE " $extension
else
extension=""
fi
扩展在Unix文件系统中没有任何特权状态;它们只是人们特别对待的文件名的一部分。您必须首先检查文件是否包含
basename=${filename%\.*}
if [[ $filename = *.* ]]; then
extension=${filename##*.}
echo "FILE: " $basename " ; ESTENSIONE " $extension
else
extension=""
fi
谢谢你的回答!问题是,如果没有扩展名,我希望它返回一个空字符串。在这一点上,我可以检查扩展名和文件名是否相同,我猜,这不是你问的:-)。谢谢你的回答!问题是,如果没有扩展名,我希望它返回一个空字符串。此时,我可以检查扩展名和文件名是否相同,我猜,这不是您所要求的:-)。如果您只想处理包含点的文件名,请将第一个通配符更改为
*.
。如果您只想处理包含点的文件名,请将第一个通配符更改为*.
。