Bash:嵌套变量扩展
如何在bash中嵌套操作?e、 我知道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%
$(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}"