我第一次尝试编写 bash 完成,对于 bash 数组解引用的两种方法(${array[@]}
和 ${array[*]}
) ,我感到有点困惑。
下面是相关的代码块(它可以工作,但我想更好地理解它) :
_switch()
{
local cur perls
local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
perls=($ROOT/perls/perl-*)
# remove all but the final part of the name
perls=(${perls[*]##*/})
COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) )
}
Bash 的 文件上说:
数组的任何元素都可以使用 ${ name [ subscript ]}引用。为了避免与 shell 的文件名扩展操作符发生冲突,需要使用大括号。如果下标为“@”或“ *”,则该单词将扩展到数组名称的所有成员。只有当单词出现在双引号中时,这些下标才会有所不同。如果单词是双引号的,${ name [ * ]}展开为单个单词,每个数组成员的值由 IFS 变量的第一个字符分隔,${ name [@]}将名称的每个元素展开为单独的单词。
现在我想我明白了 compgen -W
期望一个字符串包含一个可能的替代词列表,但是在这个上下文中我不明白“ ${ name [@]}将 name 的每个元素扩展为一个单独的单词”是什么意思。
长话短说: ${array[*]}
有效,${array[@]}
没有。我想知道为什么,我想更好地了解 ${array[@]}
到底扩展成什么。