Bash:嵌套变量扩展

Bash:嵌套变量扩展,bash,Bash,如何在bash中嵌套操作?e、 我知道 $(basename $var) 会给我这条路的最后一部分 ${name%.*} 在延期前给了我一切 如何将这两个电话结合起来,我想做如下操作: ${$(basename $var)%.*} 假设要拆分文件名,下面是一个简单的模式: $ var=/some/folder/with/file.ext $ echo $(basename $var) | cut -d "." -f1 file 你可以这样做 echo $(basename ${var%

如何在bash中嵌套操作?e、 我知道

$(basename $var)
会给我这条路的最后一部分

${name%.*}
在延期前给了我一切

如何将这两个电话结合起来,我想做如下操作:

${$(basename $var)%.*}

假设要拆分文件名,下面是一个简单的模式:

$ var=/some/folder/with/file.ext
$ echo $(basename $var) | cut -d "." -f1
file
你可以这样做

 echo $(basename ${var%.*})

这只是需要更改的顺序。

正如@sid-m的回答所述,您需要更改两个扩展的顺序,因为其中一个(
%
东西)只能应用于变量(通过给出它们的名称):

其他需要提及的事项:

  • 应该在每个展开式周围使用双引号,否则如果变量值中有空格,就会遇到麻烦。我在回答中已经这样做了
  • 如果您知道或期望某个特定的文件扩展名,
    basename
    也可以为您去掉它:
    basename“$var.txt
    (这将在
    $var
    中为
    foo.txt
    打印
    foo

如果您事先知道文件扩展名,您可以告诉
basename
将其删除,作为第二个参数或通过
-s
选项。这两种方法产生的结果相同:

basename "${var}" .extension
basename -s .extension "${var}"
如果您事先不知道文件扩展名,可以尝试
grep
字符串的正确部分

### grep any non-slash followed by anything ending in dot and non-slash
grep -oP '[^/]*(?=\.[^/]*$)' <<< "${var}"
####grep任意非斜杠,后跟以点和非斜杠结尾的任何内容

grep-oP'[^/]*(?=\[^/]*$)'谢谢,这很有效。你能解释一下为什么要这样做吗?
echo
是不必要的
basename“${var%.*}”
做了同样的事情。似乎没有一个答案解决了“真实”问题,即嵌套变量扩展是否可行?不使用命令行工具,如
basename
。这里有一个答案(尽管不是公认的答案):
### grep any non-slash followed by anything ending in dot and non-slash
grep -oP '[^/]*(?=\.[^/]*$)' <<< "${var}"