我正在尝试编写我的第一个 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