/ / bash uzupełnienie o różne opcje oparte na pierwszej wartości - bash, bash-complete

uzupełnij bash różnymi opcjami opartymi na pierwszej wartości - bash, bash-complete

Obecnie próbuję napisać bash_completionskrypt dla jednego z naszych narzędzi. Szukałem pomocy w skryptach apt-get i chkconfig. Zasadniczo chcę zrobić inny wybór opcji na podstawie pierwszej wartości. Wartość może mieć więcej niż jedną opcję.

command <value1> <--option1> <--option2> ...
command <value2> <--option3> <--option4> ...

Patrząc na skrypt apt-get, zwróci tę samą listę opcji dla dowolnej pierwszej wartości. Więc to nie jest to, czego potrzebuję.

Oto, co dostałem do tej pory:

 _supdeploy()
{
local cur prev opts cword
_init_completion || return

COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="deploy destroy supported list fulllist status fullstatus getip shutdown powerOff powerOn"

case "${prev}" in
deploy)
if [[ "$cur" == -* ]]; then
if [[ $cword -eq 2 || $cword -eq 3 || $cword -eq 4 ]]; then
COMPREPLY=( $( compgen -W "--hostname --os --version" -- "$cur" ) )
fi
fi
return 0
;;
destroy)
if [[ "$cur" == -* ]]; then
COMPREPLY=( $( compgen -W "--name --silent" -- "$cur" ) )
fi
return 0
;;
*)
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
;;
esac

} &&
complete -F _supdeploy supdeploy

Dostaję inny wybór opcji zarówno dla rozmieszczenia, jak i zniszczenia. Ale mogę użyć tylko jednego -- opcja. Kiedy próbuję użyć -- znowu nic się nie dzieje i bez -- Dostaję listę od opcji.

Prawdopodobnie jest to łatwe, ale nie mogę w tej chwili znaleźć błędu. Ja też to próbowałem bez $cword wcześniej, ten sam wynik

Odpowiedzi:

1 dla odpowiedzi № 1

Zamiast prev, po prostu chcesz za każdym razem spojrzeć na wartość pierwszego argumentu:

case ${COMP_WORDS[1]} of

Robi się trochę trudniej, jeśli pozwolisz, aby opcje „ogólne” poprzedzały podkomendę, ale generalnie chcesz spojrzeć na pierwszy argument nie będący opcją, niekoniecznie na poprzedni argument.