나는 처음으로 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]}를 사용하여 참조 할 수 있습니다. 셸의 파일 이름 확장 연산자와의 충돌을 방지하려면 중괄호가 필요합니다. 아래 첨자가 '@'또는 '*'이면 단어는 배열 이름의 모든 구성원으로 확장됩니다. 이 아래 첨자는 단어가 큰 따옴표 안에있는 경우에만 다릅니다. 단어가 큰 따옴표 인 경우 $ {name [*]}은 각 배열 구성원의 값이 IFS 변수의 첫 번째 문자로 구분 된 단일 단어로 확장되고 $ {name [@]}은 이름의 각 요소를 확장합니다. 별도의 단어로.
이제 compgen -W
가능한 대안의 단어 목록이 포함 된 문자열 이 예상 된다는 것을 이해한다고 생각 합니다. 그러나이 컨텍스트에서는 "$ {name [@]}이 이름의 각 요소를 별도의 단어로 확장합니다"가 의미하는 바를 이해하지 못합니다.
짧은 이야기 : ${array[*]}
작품; ${array[@]}
하지 않습니다. 그 이유를 알고 싶습니다 ${array[@]}
. 정확히 무엇이 확장 되는지 더 잘 이해하고 싶습니다 .