有没有可能做类似以下的事情:
echo ${$(ls)/foo/bar}
我相信在某处看到过类似的工作示例,但这会导致“错误的替换”。
我知道有其他方法可以做到这一点,但这样一个简短的一行代码会很有用。我是否遗漏了什么或者这是不可能的呢?
有没有可能做类似以下的事情:
echo ${$(ls)/foo/bar}
我相信在某处看到过类似的工作示例,但这会导致“错误的替换”。
我知道有其他方法可以做到这一点,但这样一个简短的一行代码会很有用。我是否遗漏了什么或者这是不可能的呢?
Syntax ${...}
仅允许引用变量(或位置参数),可选择与参数扩展结合使用。
Syntax $(...)
(或旧式语法的`...`
)执行命令替换,它允许将任意命令嵌入到其标准输出中,然后将表达式展开为stdout的输出结果。
因此,您可以通过以下方式组合这两个特性:
echo "$(lsOutput=$(ls); echo "${lsOutput//foo/bar}")"
请注意,$(...)
的嵌套使用非常简单,这是与 `...`
相比的主要优势之一,因为在此处使用后者需要进行转义。
话虽如此,你在命令替换中定义的任何变量都被限制在该命令运行的子shell中,所以只要输出stdout就可以了,你可以仅使用生成所需输出的命令。
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