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