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

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

使用默认值IFS,考虑

unset var
set -- ${var:-"hello"}
echo "$#"

1当参数扩展扩展为单个字符串时,将打印此内容hello

unset var
set -- "${var:-"hello"}"
echo "$#"

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

但是,如果使用ksh93,则以下输出3while dashbashpdkshzsh输出1

unset var
set -- "${var:-" hello "}"
echo "$#"

在这种ksh93情况下,一个得到3"$@"是两个空字符串,而$1$3是没有侧翼空格的$2字符串。hello扩展的命令似乎set -- "" hello ""ksh93其他set -- " hello "shell 中。

一个相关的(我认为)问题是

unset var
set -- ${var:-""}
echo "$#"

1它在所有类似 shell 中输出sh,除了ksh93它输出 的地方0。在 中ksh93,在执行字段拆分之前,引号似乎已从空字符串中删除。

ksh93POSIX 表示应该执行扩展等的方式是否可以解释和支持该行为?

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


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

相关内容