【问题标题】:Command substitution with string substitution使用字符串替换的命令替换
【发布时间】:2023-04-11 00:12:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你到底想做什么?

标签: bash command-substitution


【解决方案1】:

语法${...} 只允许引用一个变量(或位置参数),可选择与parameter expansion结合使用。

语法$(...)(或者,不太理想的是,它的旧式等效物`...`)执行command substitution,它允许嵌入任意命令对其stdout输出表达式展开

因此,您可以组合这两个功能如下:

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

注意$(...) 的简单嵌套使用,这是与`...` 相比的主要优点之一,`...` 的使用需要在此处转义。

也就是说,您在命令替换中定义的任何变量都被限制在命令运行的 subshel​​l 中,因此 您可以只使用产生所需 输出,因为只有标准输出才是重要的。

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

【讨论】:

    【解决方案2】:

    您可以使用管道|sed,例如:

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

    或者变量替换,都解释了here,特别是在“变量扩展/子字符串替换”部分,下面是我的一个例子:

    $ var=ABC
    $ echo ${var//B/_}
    A_C
    

    【讨论】:

      【解决方案3】:

      为什么不直接

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-01
        • 2021-05-16
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多