数组内的单引号扩展

时间:2017-01-12 20:18:27

标签: bash quoting

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中保留值(如上所述)?

1 个答案:

答案 0 :(得分:4)

至少在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