使用默认值IFS
,考虑
unset var
set -- ${var:-"hello"}
echo "$#"
1
当参数扩展扩展为单个字符串时,将打印此内容hello
。
unset var
set -- "${var:-"hello"}"
echo "$#"
这也1
出于同样的原因输出。
但是,如果使用ksh93
,则以下输出3
while dash
、bash
、pdksh
和zsh
输出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
,在执行字段拆分之前,引号似乎已从空字符串中删除。
ksh93
POSIX 表示应该执行扩展等的方式是否可以解释和支持该行为?
对于 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 的当前开发版本。