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

标签 bash shell scripting posix expansion

我目前得到 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/

相关文章:

bash - 当有其他 Pod 终止时,如何获取正在运行的 Pod 名称?

oracle - 使用 docker : "TNS:listener: all appropriate instances are blocking new connections" error 启动 oracle

Bash ls 和命令管道

c - 如何在 C 语言的 shell 中执行带有多个参数的命令?

linux - 如何 grep ls 和 grep 返回的文件内容?

mysql - 仅适用于静态查询,如何将其与变量一起使用

shell - Cut 命令未返回正确的输出

linux - 在 mailx 正文中包含日志文件内容

python - 如何从 Excel 中访问值,其中第一列是标题

docker - 脚本如何区分 Docker Toolbox 和 Docker for Windows?