我第一次嘗試寫一個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的documentation says:
數組的任何元素可以使用$ {name [下標]}引用。需要使用大括號以避免與shell的文件名擴展操作符衝突。如果下標是'@'或'*',則該單詞將擴展爲數組名稱的所有成員。這些下標僅在單詞出現在雙引號內時纔有所不同。如果該單詞被雙引號括起來,$ {name [*]}擴展爲一個單詞,每個數組成員的值由IFS變量的第一個字符分隔,$ {name [@]}擴展每個名稱元素到一個單獨的詞。
現在我想我明白compgen -W
預計包含可能的替代品單詞表一個字符串,但在這種情況下,我不明白什麼是「$ {名[@]}名稱的每個元素擴展爲一個字「的意思。
長話短說:${array[*]}
作品; ${array[@]}
沒有。我想知道爲什麼,並且我想更好地瞭解究竟${array[@]}
究竟擴展到哪裏。
這是優秀的;謝謝。我真的希望它更大聲地吹響,但這至少說明了爲什麼它不起作用。 – Telemachus 2010-07-28 18:38:05