【发布时间】: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)-release 和 4.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。