我目前得到了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测试中运行了所有内容)