如何从完整路径中提取没有扩展名的文件名?

use*_*822 15 linux script bash file-extension filenames

我正在尝试修正我的第一个 bash 脚本,并且有一次文件名作为 .bash 传递给脚本$1。我需要提取没有扩展名的文件名。
目前,我假设所有扩展名都是三个字母,因此我删除了最后 4 个字符以获取文件名:

a="${1:0:-4}"
Run Code Online (Sandbox Code Playgroud)

但我需要能够使用超过三个字符的扩展,就像%~n1在 Windows 中一样。
有没有办法从参数中提取没有扩展名的文件名?

gar*_*ohn 31

在 bash 中执行此操作的通常方法是使用参数扩展。(请参阅bash手册页并搜索“参数扩展”。)

a=${1%.*}
Run Code Online (Sandbox Code Playgroud)

%表示一切匹配以下的图案(.*从右边),使用最短的匹配可能的,要被从参数中删除$1。在这种情况下,表达式不需要双引号 (")。

  • 不。`${1%.*}` 将返回 `Something.eng`。如果你想去掉第一个 `.` 右边的所有东西,包括 `.`,使用 `${1%%.*}`,它会返回 `Something`。 (3认同)
  • 文件模式通常是这样的:“Something.eng.ext”。显然在这种情况下 ext 是扩展名,但使用 ${1%.*} 将只返回“Something”部分,对吧? (2认同)

Ste*_*nny 17

如果您知道扩展名,则可以使用basename

$ basename /home/jsmith/base.wiki .wiki
base
Run Code Online (Sandbox Code Playgroud)