![“[@]”对 bash for 循环中的变量做了什么](https://linux22.com/image/220209/%E2%80%9C%5B%40%5D%E2%80%9D%E5%AF%B9%20bash%20for%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88.png)
我在研究Gentoo的ebuilds是如何制作的,我发现了以下代码:
_VIM_PLUGIN_ALLOWED_DIRS=(
after autoload colors compiler doc ftdetect ftplugin indent keymap
macros plugin spell syntax
)
local d
for d in "${_VIM_PLUGIN_ALLOWED_DIRS[@]}" "${@}"; do
[[ -d "${d}" ]] || continue
doins -r "${d}"
done
据我所知,_VIM_PLUGIN_ALLOWED_DIRS
这是一个清单。d
是一个局部变量。
我不明白的是[@]
in _VIM_PLUGIN_ALLOWED_DIRS[@]
。通常我会省略[@]
, 并只d
迭代_VIM_PLUGIN_ALLOWED_DIRS
的值。
它在做什么?它的目的是什么?
我没见过[@]
,也不知道${@}
之后会做什么
PS:doins
是其他地方定义的外部函数
提前致谢
答案1
通常我会省略 [@],而只是迭代 _VIM_PLUGIN_ALLOWED_DIRS 的值。
在 Bash 也有的 ksh 样式数组中,引用没有索引的数组只会给出索引处的元素0
。这与 zsh 不同,zsh 使用索引引用数组将给出所有(非空)元素。
特殊索引@
用于获取数组的所有元素作为不同的字段。$@
类似地扩展到所有位置参数(脚本或函数的参数)。
例如
arr=(foo "bar doo")
printf "<%s> " "$arr"; echo # '<foo>'
printf "<%s> " "${arr[@]}"; echo # '<foo> <bar doo>'
请注意,在这两种情况下,您都应该引用"${arr[@]}"
并"$@"
避免分词和通配符不可避免地弄乱值。
看: