是否可以按照以下方式做一些事情:
echo ${$(ls)/foo/bar}
我很确定我在某个地方看到了类似的工作示例,但这会导致“错误替换”错误。
我知道还有其他方法可以做到这一点,但这么短的 oneliner 会很有用。我错过了什么还是这是不可能的?
是否可以按照以下方式做一些事情:
echo ${$(ls)/foo/bar}
我很确定我在某个地方看到了类似的工作示例,但这会导致“错误替换”错误。
我知道还有其他方法可以做到这一点,但这么短的 oneliner 会很有用。我错过了什么还是这是不可能的?
语法${...}
只允许引用变量(或位置参数),可选地与参数扩展结合使用。
语法$(...)
(或者,不太理想的是,它的旧式等价物`...`
)执行命令替换,这允许将任意命令嵌入到其标准输出的表达式中展开。
因此,您可以将这两个功能组合如下:
echo "$(lsOutput=$(ls); echo "${lsOutput//foo/bar}")"
请注意 的简单嵌套使用$(...)
,这是优于 的主要优点之一`...`
,其使用需要在此处转义。
也就是说,您在命令替换中定义的任何变量都被限制在命令运行的子shell中,因此您可以只使用产生所需输出的命令,因为它只是重要的标准输出输出。
echo "$(ls | sed 's/foo/bar/')"
您可以将管道|
与 一起使用sed
,例如:
$ echo ABC | sed 's/B/_/'
A_C
或变量替换,都在这里解释,特别是在“变量扩展/子字符串替换”部分,下面是我的一个例子:
$ var=ABC
$ echo ${var//B/_}
A_C
为什么不只是
root@localhost:~# echo `pwd`_whatever_suffix
/root_whatever_suffix