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) - 发布.
我倾向于不信任未加引号的参数扩展内的空格。我无法解释为什么它不起作用,但我可以给你一个解决方案:将空间移到参数扩展之外。该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)