bash:你如何返回文件扩展名?

use*_*438 11 scripting bash

我想编写一个脚本来仅返回输入文件名的扩展名。例如,textfile.txt 应该返回txt.

我是 Linux 和 bash 的新手,我正在尝试学习如何编写基本脚本。谢谢!

ter*_*don 34

外壳程序,例如 bash,具有许多字符串操作功能。其中之一可让您删除指定模式的所有内容:

${VAR##GLOB}
Run Code Online (Sandbox Code Playgroud)

上面的语法从变量中删除所有内容,$VAR直到 glob 的第一个匹配项GLOB。因此,要打印没有名称的文件扩展名,您可以执行以下操作:

$ file="file.txt"
$ echo ${file##*.}
txt
Run Code Online (Sandbox Code Playgroud)

请注意,这也可以处理多个“扩展”:

$ file="file.new.txt"
$ echo ${file##*.}
txt
Run Code Online (Sandbox Code Playgroud)

如果您不希望那样,请改用一个#,这将删除最短的匹配项而不是最长的匹配项:

$ echo ${file#*.}
new.txt
Run Code Online (Sandbox Code Playgroud)

现在,要在目录中的所有文件上运行它,您可以执行以下操作:

$ ls 
file.avi  file.pdf  file.png  file.txt
$ for file in *; do echo "$file : ${file##*.}"; done
file.avi : avi
file.pdf : pdf
file.png : png
file.txt : txt
Run Code Online (Sandbox Code Playgroud)

而且,为了完整起见,您还可以使用以下命令获取不带扩展名的文件名${file%.*}

$ for file in *; do echo "$file : ${file##*.} : ${file%.*}"; done
file.avi : avi : file
file.pdf : pdf : file
file.png : png : file
file.txt : txt : file
Run Code Online (Sandbox Code Playgroud)


cha*_*aos 4

通过参数扩展

$ x="textfile.txt"
$ echo ${x##*.}
txt
Run Code Online (Sandbox Code Playgroud)

${parameter##word}模式删除匹配的最大前缀word(除了文件结尾之外的所有前缀)。