不带扩展名的文件:如何在 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)时,它说扩展名是文件名本身(例如 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

相关内容

  • 没有找到相关文章

最新更新