【问题标题】:Single quote expansion within an array数组内的单引号展开
【发布时间】:2023-04-07 12:24:01
【问题描述】:

AFAICT,不应扩展单引号内的任何内容。 Bash 手册说:

用单引号括起来的字符保留字面值 引号内的每个字符。可能不会出现单引号 在单引号之间,即使前面有反斜杠。

但是,在旧的 bash 版本中,这在 Bash 3.00.15(1)-release 中似乎并不正确。

例如,考虑(这是一个更大脚本的人为示例):

#!/bin/bash

func() {
local -a cmds=('echo subshell echo hi')

    for cmd in "${cmds[@]}"; do
        echo "cmd: $cmd"
    done
}

func

打印:

cmd: echo
cmd: subshell
cmd: echo
cmd: hi

正如我所料:

cmd: echo subshell echo hi

这在较新的 bash 版本中不是问题。以上在 Bash 3.2.25(1)-release4.3.46(1)-release 中按预期工作。

这是旧 bash shell 中的错误吗?如何解决它,以便单引号在 bash 3.00.15(1)-release 中保留值(如我所料)?

【问题讨论】:

  • 为什么要支持这么旧的bash版本?即使是多年未更新 bash 的 OS X 也有 3.2.57。
  • 这绝对看起来像一个错误。 echo ${#cmds[@]} 显示什么?
  • 我不认为 SO 是一个 10 年前的错误报告的正确位置。解决方法是一一分配元素,如cmds[0]='foo bar' 等。顺便说一句,升级外壳......
  • @hek2mgl,我认为SO 问这样一个问题的完美场所。 (这个问题问得很好。)这不是一个 bash 错误报告,它是一个请求帮助,用一种可能不再那么常见的 shell 方言来编写一些东西。升级到最新版本并不总是可行的,甚至根本不可能。带有从 ROM 复制的软件、在轨卫星等的嵌入式系统很可能会陷入无法升级的状态。
  • @ghoti 我没有看到问题。派一些宇航员出去,用新的 bash 刷新 ROM,工作完成。当他们已经在那里时,他们可能也可以清空 /var/log。

标签: bash quoting


【解决方案1】:

至少在bash 3.00.16(我可以在不手动修补3.00 的情况下编译的最接近的版本)中,该错误似乎与local 命令中的分配有关。以下产生预期的输出:

func() {
    local -a cmds
    cmds=('echo subshell echo hi')

    for cmd in "${cmds[@]}"; do
        echo "cmd: $cmd"
    done
}

func

这不是特定于local;处理显示为参数的赋值似乎是一个问题。

bash-3.00$ declare -a foo=('echo bar')
bash-3.00$ printf '%s\n' "${foo[@]}"
echo
bar
bash-3.00$ foo=('echo bar')
bash-3.00$ printf '%s\n' "${foo[@]}"
echo bar

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2018-06-13
    • 1970-01-01
    • 2016-12-17
    • 2020-03-23
    • 2013-02-05
    相关资源
    最近更新 更多