$ s=/the/path/foo.txt
Run Code Online (Sandbox Code Playgroud)
我们可以通过不同的标准分别提取
$ echo ${s##*/}
foo.txt
$ echo ${s%.txt}
/the/path/foo
Run Code Online (Sandbox Code Playgroud)
但是如果我们想同时根据这两个标准进行提取,
$ echo ${${s##*/}%.txt}
bash: ${${s##*/}%.txt}: bad substitution
Run Code Online (Sandbox Code Playgroud)
是否可以仅使用参数扩展而不引入临时变量来实现相同的目标?
参数扩展可以以某种方式在另一个参数扩展中工作吗?
谢谢。
不,是的。在 Bash 或标准 shell中,扩展的第一部分必须是参数(即变量或位置参数,或特殊参数之一),而不仅仅是任何单词。
重击:
参数扩展的基本形式是${参数}。参数的值被替换。该参数是如上所述的 shell 参数或数组引用。
您可以在扩展的其他部分使用扩展,因为它们可以是任意单词。但这当然无助于对同一字符串的链接操作(例如在您的示例中${${s##*/}%.txt})
$ bash -c 's=/the/path/foo.txt; ext=.tyt; echo "${s%${ext/y/x}}"'
/the/path/foo
Run Code Online (Sandbox Code Playgroud)
不过,Zsh 明确支持链接:
如果使用 ${...} 类型的参数表达式或 $(...) 类型的命令替换来代替上面的name,则首先将其扩展并将结果用作name的值。