2014-03-02 52 views
1

我做了一个非常简单的脚本,告诉我一个文件名和扩展名。 该脚本的工作原理如下:没有扩展名的文件:如何注意bash脚本?

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文件)的文件,它说的是,扩展文件名本身(例如延长= Makefile文件)。 我做错了什么?

+0

如果您只想处理包含点的文件名,请将第一个通配符更改为“*。*'。 – tripleee

回答

3

那么,你得到的结果是预期的结果;我不知道这是否意味着你做错了事。

模式替换工作的方式是,如果模式不匹配,则不会替换任何内容。在这里你有${filename##*.}它说删除所有字符,并包括最后期限。但是,如果名称中没有句号,则模式不匹配,也不会删除任何内容,因此您只需得到与${filename}相同的结果即可。

我应该指出${filename%\.*}中的反斜杠是无用的:这里的模式是shell通配但不是正则表达式,所以你不需要转义一段时间。你可以写${filename%.*}

ETA:

有没有办法做你一步到位想要的东西。你有两个选择;你可以测试一下,看是否扩展名的文件名相同,如果是将其设置为空:

extension=${filename##*.} 
[ "$extension" = "$filename" ] && extension= 

,或者你可以脱掉的基本部分,你已经计算,然后摆脱任何前导时期:

extension=${filename#$basename} 
extension=${extension##*.} 
+0

谢谢你的回答!问题是如果没有扩展名,我希望它返回一个空字符串。在这一点上,我可以检查扩展名和文件名是否相同,我想 –

+1

嗯,这不是你问的:-)。 – MadScientist

2

扩展在Unix文件系统中没有任何特权状态;它们只是人们特别对待的文件名称的一部分。您必须先检查文件是否包含.

basename=${filename%\.*} 
    if [[ $filename = *.* ]]; then 
     extension=${filename##*.} 
     echo "FILE: " $basename " ; ESTENSIONE " $extension 
    else 
     extension="" 
    fi 
相关问题