参数扩展可以在另一个参数扩展中工作吗?

Tim*_*Tim 4 bash

$ 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)

是否可以仅使用参数扩展而不引入临时变量来实现相同的目标?

参数扩展可以以某种方式在另一个参数扩展中工作吗?

谢谢。

ilk*_*chu 5

不,是的。在 Bash 或标准 shell中,扩展的第一部分必须是参数(即变量或位置参数,或特殊参数之一),而不仅仅是任何单词。

重击

参数扩展的基本形式是${参数}。参数的值被替换。该参数是如上所述的 shell 参数或数组引用。

POSIX 中文本同样只提到了参数。

您可以在扩展的其他部分使用扩展,因为它们可以是任意单词。但这当然无助于对同一字符串的链接操作(例如在您的示例中${${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的值。