“[@]”对 bash for 循环中的变量做了什么

“[@]”对 bash for 循环中的变量做了什么

我在研究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[@]}""$@"避免分词和通配符不可避免地弄乱值。

看:

相关内容