删除除文件扩展名以外的所

myt*_*hic 5 linux bash

假设我有一个字符串:

x=file.tar.sh
Run Code Online (Sandbox Code Playgroud)

我知道除了最后的n个字符之外如何删除所有内容.像这样(除去最后3个字符的所有内容:

${x: -3}
Run Code Online (Sandbox Code Playgroud)

但这对于具有不同后缀长度的文件不起作用.(len .tar!= len .sh)

我会通过删除所有内容直到最后一个点来解决这个问题.我试过这个:

${x##.}
Run Code Online (Sandbox Code Playgroud)

这将删除最长的匹配,直到"." 但不知何故,它只是返回完整的字符串而不删除任何东西?

Jah*_*hid 2

尝试这个:

x=file.tar.sh
echo ${x##*.}
Run Code Online (Sandbox Code Playgroud)

这将打印sh

如果你想得到tar.sh,那么:

echo ${x#*.}
Run Code Online (Sandbox Code Playgroud)

这里*匹配出现之前的任何字符集.

  • Jahid 没有解释的是,他使用**参数扩展/子字符串提取**来解析该行以删除路径中不需要的部分。`##` 从左侧开始,然后匹配**所有出现的模式** `*.`(表示匹配直到最后一个 `.` 的所有内容)。“*”是**任何字符出现零次或多次**的通配符。单个“#”匹配**第一次出现的模式**。 (2认同)