参数扩展中引号的正确处理

Kus*_*nda 5 ksh posix variable-substitution

使用 的默认值IFS,考虑

unset var
set -- ${var:-"hello"}
echo "$#"
Run Code Online (Sandbox Code Playgroud)

1当参数扩展扩展为单个 string 时会打印hello

unset var
set -- "${var:-"hello"}"
echo "$#"
Run Code Online (Sandbox Code Playgroud)

这也是1出于同样的原因输出。

然而,如果使用ksh93以下产出3dashbashpdksh,和zsh输出1

unset var
set -- "${var:-" hello "}"
echo "$#"
Run Code Online (Sandbox Code Playgroud)

在这种ksh93情况下, one get3"$@"是两个空字符串,$1$3while$2hello没有侧翼空格的字符串。扩展命令似乎是set -- "" hello ""ksh93set -- " hello "其他外壳。

一个相关的(我相信)问题是

unset var
set -- ${var:-""}
echo "$#"
Run Code Online (Sandbox Code Playgroud)

该输出1在所有sh样壳,除了在ksh93其中它输出0。在 中ksh93,在执行字段拆分之前,引号似乎已从空字符串中删除。

可以ksh93通过 POSIX 如何说明应该执行扩展等来解释和支持该行为吗?

对于 shell 之间的行为不同的两个示例中的最后一个,我个人认为这是一个错误(命令应该从set -- ${var:-""}to展开set -- "",而不是 to set --),但是对于第一个这样的例子(带有 的那个set -- "${var:-" hello "}"),我不太确定。


为了进行测试,ksh93我在 OpenBSD 6.4 上使用“AJM 93u+ 2012-08-01 版”,以及“A 版 2017.0.0-devel-2040-g36a76aca”,这是 shell 的当前开发版本。