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)-release
和4.3.46(1)-release
中按预期工作。
这是旧版bash shell中的错误吗?如何解决这个问题,以便单个引用在bash 3.00.15(1)-release
中保留值(如上所述)?
答案 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