字符串替换中的命令替换

16

有没有可能做类似以下的事情:

echo ${$(ls)/foo/bar}

我相信在某处看到过类似的工作示例,但这会导致“错误的替换”。

我知道有其他方法可以做到这一点,但这样一个简短的一行代码会很有用。我是否遗漏了什么或者这是不可能的呢?


2
你到底想做什么? - Zulu
3个回答

15

Syntax ${...} 仅允许引用变量(或位置参数),可选择与参数扩展结合使用。

Syntax $(...) (或旧式语法的`...`)执行命令替换,它允许将任意命令嵌入到标准输出中,然后将表达式展开为stdout的输出结果。

因此,您可以通过以下方式组合这两个特性:

echo "$(lsOutput=$(ls); echo "${lsOutput//foo/bar}")"

请注意,$(...) 的嵌套使用非常简单,这是与 `...` 相比的主要优势之一,因为在此处使用后者需要进行转义。

话虽如此,你在命令替换中定义的任何变量都被限制在该命令运行的子shell中,所以只要输出stdout就可以了,你可以仅使用生成所需输出的命令

echo "$(ls | sed 's/foo/bar/')"

2

你可以使用管道符|sed命令,例如:

$ echo ABC | sed 's/B/_/'
A_C

或者变量替换,所有内容都在这里解释,特别是在“变量扩展/子字符串替换”部分,下面是我的一个例子:
$ var=ABC
$ echo ${var//B/_}
A_C

0

为什么不直接

root@localhost:~# echo `pwd`_whatever_suffix
/root_whatever_suffix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接