关于“$@”和“$@[@]”的相对优点

关于“$@”和“$@[@]”的相对优点

每当我编写一个应该将其参数“传递”到其他下游“可调用”(二进制、脚本、函数等)的脚本(或函数)时foo,我都会像这样编写传递参数的代码

foo "$@"

...但我也看到过这个替代方案

foo "$@[@]"

zsh我曾尝试虚构这两种方法会产生不同结果的场景,但没有成功(至少没有成功)。

它们真的是同义词吗?如果不是,什么时候人们会更喜欢一种形式而不是另一种形式?


(我主要对 的情况感兴趣zsh,这是我的日常 shell,但在工作中我经常需要编写脚本,所以我也bash对这个问题的答案感到好奇。)bash

答案1

"$@"是 Bourne shell 的发明(1979)。这意味着扩展到位置参数列表,就像您键入了 一样"$1" "$2" "$3"...

当 David Korn 在 80 年代初添加数组支持时,它使用语法将该概念扩展到了数组"${array[@]}"zsh还支持"$array[@]"较短的形式。

"$@"指位置参数(从 开始$1),它有点像数组,但除了zshor之外yash,不完全一样。其一,$@从索引 1 开始,而其他数组在kshbash从 0 开始。在或${@[@]}中不起作用。kshbash

唯一"${@[@]}"有效的 shell 是zshyashzsh是唯一"$@[@]"有效的。使用它超过标准是没有意义的"$@"。更有用的是这样的说法:"$@[1,3]"获取前 3 个位置参数。

如果您想使用类似数组的语法,则可以在 中使用zsh("$argv[@]"$argv引用位置参数的数组,如csh// )。tcshfish

相关内容