用字符串替换命令替换

Łuk*_*asz 6 bash command-substitution

是否可以按照以下方式做一些事情:

echo ${$(ls)/foo/bar}
Run Code Online (Sandbox Code Playgroud)

我很确定我在某个地方看到了类似的示例,但这会导致“替换错误”错误。

我知道还有其他方法可以做到这一点,但如此短的oneliner会很有用。我错过了什么吗?

mkl*_*nt0 5

语法${...}仅允许引用变量(或位置参数),可以选择与参数扩展组合

语法$(...)(或更可取的是,它的旧式等效项`...`)执行命令替换,该命令替换允许将表达式expand扩展到其标准输出任意命令

因此,您可以以下两个功能组合在一起

echo "$(lsOutput=$(ls); echo "${lsOutput//foo/bar}")"
Run Code Online (Sandbox Code Playgroud)

请注意,的简单嵌套使用$(...)是的主要优势之一,而的嵌套使用`...`需要在此处进行转义。

就是说,您在命令替换中定义的任何变量都限于该命令无论如何都可以运行的子外壳,因此您可以仅使用一个产生所需输出的命令来进行处理,因为只有标准输出才重要。

echo "$(ls | sed 's/foo/bar/')"
Run Code Online (Sandbox Code Playgroud)