每当我编写一个应该将其参数“传递”到其他下游“可调用”(二进制、脚本、函数等)的脚本(或函数)时foo
,我都会像这样编写传递参数的代码
foo "$@"
...但我也看到过这个替代方案
foo "$@[@]"
zsh
我曾尝试虚构这两种方法会产生不同结果的场景,但没有成功(至少没有成功)。
它们真的是同义词吗?如果不是,什么时候人们会更喜欢一种形式而不是另一种形式?
(我主要对 的情况感兴趣zsh
,这是我的日常 shell,但在工作中我经常需要编写脚本,所以我也bash
对这个问题的答案感到好奇。)bash
答案1
"$@"
是 Bourne shell 的发明(1979)。这意味着扩展到位置参数列表,就像您键入了 一样"$1" "$2" "$3"...
。
当 David Korn 在 80 年代初添加数组支持时,它使用语法将该概念扩展到了数组"${array[@]}"
。zsh
还支持"$array[@]"
较短的形式。
"$@"
指位置参数(从 开始$1
),它有点像数组,但除了zsh
or之外yash
,不完全一样。其一,$@
从索引 1 开始,而其他数组在ksh
或bash
从 0 开始。在或${@[@]}
中不起作用。ksh
bash
唯一"${@[@]}"
有效的 shell 是zsh
和yash
。zsh
是唯一"$@[@]"
有效的。使用它超过标准是没有意义的"$@"
。更有用的是这样的说法:"$@[1,3]"
获取前 3 个位置参数。
如果您想使用类似数组的语法,则可以在 中使用zsh
("$argv[@]"
是$argv
引用位置参数的数组,如csh
// )。tcsh
fish