我目前得到 3 个 shell 的 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 个 shell 的作用相同:
$ 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)-release。
最佳答案
我倾向于不信任未加引号的参数扩展中的空格。我无法解释为什么它不起作用,但我可以为您提供一个解决方案:将空间移到参数扩展之外。 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 测试中运行了所有内容)
关于bash - bash 是否在 ${var+...} 中错误地进行了 "$@"扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047130/