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

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

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

a="${1:0:-4}"

但我需要能够处理包含三个以上字符的扩展名,例如%~n1在 Windows 中。
有没有办法从参数中提取不包含扩展名的文件名?

答案1

在 bash 中,通常使用参数扩展来实现这一点。(请参阅狂欢手册页并搜索“参数扩展”。)

a=${1%.*}

表示使用最短匹配从右侧%( ) 后面的模式匹配的所有内容都.*将从参数 中删除$1。在这种情况下,不需要在表达式周围使用双引号 (")。

答案2

如果你知道扩展名,你可以使用基名

$ basename /home/jsmith/base.wiki .wiki
base

答案3

单行猛击无需使用基名

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo

相关内容