bash是否在$ {var + ...}内错误地进行了"$ @"扩展?

Gue*_*ler 14 bash shell scripting posix expansion

我目前通过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
Run Code Online (Sandbox Code Playgroud)

或者我忽略了一些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
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果参数应该包含空格,$*与"$ @"不完全相同.

顺便说一句,我正在使用Bash版本4.4.12(1) - 发布.

Ada*_*atz 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
Run Code Online (Sandbox Code Playgroud)

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