我目前得到了3个炮弹的2个意见:

$ bash -c 'set bar; set foo${1+ "$@"}; echo "$# $*"'
1 foobar

$ ash -c 'set bar; set foo${1+ "$@"}; echo "$# $*"'
2 foo bar

$ dash -c 'set bar; set foo${1+ "$@"}; echo "$# $*"'
2 foo bar

或者我忽略了一些POSIX定义,这些定义将我的示例呈现为实现定义的行为?
注意,似乎只有“$@”会触发差异以下操作适用于所有3个壳:
$ bash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar

$ ash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar

$ dash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar

不幸的是,如果参数应该包含空格,$*与“$@”不完全相同。
顺便说一下,我使用的是Bash 4.4.12(1)版本。

最佳答案

我倾向于不信任未引用的参数展开中的空格。我无法解释为什么它不起作用,但我可以给你一个解决办法:把空间移到参数展开之外。set命令不介意尾随空格。

$ bash -c 'set bar; set foo ${1+"$@"}; echo "$# $*"'   # 5.0.2(1)
2 foo bar

$ dash -c 'set bar; set foo ${1+"$@"}; echo "$# $*"'   # 0.5.10.2
2 foo bar

$ ash  -c 'set bar; set foo ${1+"$@"}; echo "$# $*"'   # /bin/sh on FreeBSD 7.3
2 foo bar

$ ksh  -c 'set bar; set foo ${1+"$@"}; echo "$# $*"'   # 93u+ 2012-08-01
2 foo bar

$ zsh  -c 'set bar; set foo ${1+"$@"}; echo "$# $*"'   # 5.7
2 foo bar

(除了ash,我在最新的Debian测试中运行了所有内容)

10-06 02:05