没有扩展名的文件:如何在bash脚本中注意到?

时间:2014-03-02 15:57:50

标签: bash makefile

我制作了一个非常简单的脚本,告诉我文件名和扩展名。 该脚本的工作原理如下:

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)。 我做错了吗?

2 个答案:

答案 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