【问题标题】:Quotes in Bash pattern substitution variable expansionBash 模式替换变量扩展中的引号
【发布时间】:2015-10-08 03:23:34
【问题描述】:

执行 Bash 参数扩展时是否应该引用变量?

例如在下面,"${E}" 应该用引号引起来吗?

(
E="-END"

X=(ABC 123 "ABC 123")
X=("${X[@]/%/"${E}"}")

IFS=$'\n'
echo "${X[*]}"
)

我注意到在 4.2 版本的 bash 中这将导致以下输出

ABC"-END"
123"-END"
ABC 123"-END"

但在 4.3 版本的 bash 上,这将导致以下输出

ABC-END
123-END
ABC 123-END

这是一个已修复的错误吗?

编辑。"$E"更改为"${E}"

【问题讨论】:

    标签: bash


    【解决方案1】:

    这不是错误,但记录在official change log

    本文档详细介绍了这个版本之间的变化,bash-4.3-alpha, 以及之前的版本 bash-4.2-release。

    ...

    zz。当使用模式替换词扩展时,bash 现在运行 通过引号删除替换字符串,因为它允许引号 字符串作为转义字符。这不向后兼容,所以 可以通过将 bash 兼容模式设置为 4.2 来禁用它。

    切换兼容模式(如果你想试验的话):

    shopt -s compat42
    

    您会看到 4.3 的行为类似于 4.2,然后取消设置:

    shopt -u compat42
    

    【讨论】:

    • 太棒了。往前走你会怎么做?使用引号?
    • @JamesAndrews 如果您不想在输出中使用引号,则不要引用 $E,如果您想要引号,则转义引号 \"$E\"。这应该是跨版本的可移植性。另一种可能性是使用compat42 shell 选项来保证跨版本的相同行为(但是您必须检查您的 Bash 版本是否≥4.2)。
    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2017-08-18
    • 2021-04-25
    相关资源
    最近更新 更多