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 № 1Zamiast 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.