Bash:嵌套变量扩展

时间:2018-10-29 12:53:51

标签: bash

如何在bash中嵌套操作?例如,我知道

$(basename $var)

只会给我路径的最后一部分,

${name%.*}

在扩展之前将所有内容都给了我。

我如何结合这两个电话,我想做些类似的事情:

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

4 个答案:

答案 0 :(得分:2)

作为@ sid-m的回答状态,您需要更改两个扩展的顺序,因为其中一个(%东西)只能应用于变量(通过给出其名称): / p>

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

其他要提及的内容:

  • 对于每个扩展,都应使用双引号,否则如果变量值中有空格,则会遇到麻烦。我已经在回答中做到了。
  • 如果您知道或期望使用特定的文件扩展名,basename也可以为您删除该文件扩展名:basename "$var" .txt(这将为foo中的foo.txt打印$var {1}}。)

答案 1 :(得分:1)

您可以这样做

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

这只是需要更改的顺序。

答案 2 :(得分:0)

假设您要分割文件名,这是一个简单的模式:

$ var=/some/folder/with/file.ext
$ echo $(basename $var) | cut -d "." -f1
file

答案 3 :(得分:0)

如果您事先知道文件扩展名,则可以告诉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}"