没有扩展名的文件:在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

谢谢你的回答!问题是,如果没有扩展名,我希望它返回一个空字符串。在这一点上,我可以检查扩展名和文件名是否相同,我猜,这不是你问的:-)。谢谢你的回答!问题是,如果没有扩展名,我希望它返回一个空字符串。此时,我可以检查扩展名和文件名是否相同,我猜,这不是您所要求的:-)。如果您只想处理包含点的文件名,请将第一个通配符更改为
*.
。如果您只想处理包含点的文件名,请将第一个通配符更改为
*.