Как извлечь элемент из массива в скрипт оболочки завершения bash?
Я учусь о завершении bash. Вот мой код:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="push pull"
case "${prev}" in
push)
COMPREPLY=( $(compgen -W "--file --key" -- ${cur}) )
return 0
;;
pull)
COMPREPLY=( $(compgen -W "--data --url" -- ${cur}) )
return 0
;;
esac
if [[ $COMP_CWORD == 1 ]] ; then
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
fi
return 0
}
complete -o default -F _foo foo
Я хочу знать, как извлечь элемент из массива после его использования? Позвольте мне объяснить с примером. Этот код работает следующим образом:
$ foo [TAB]
$ foo pu [TAB]
push pull
$ foo push [TAB]
$ foo push -- [TAB]
--file --key
$ foo push --file [TAB]
content of PWD
Поскольку я использовал --file в качестве аргумента, в следующий раз он не должен отображаться в качестве доступных аргументов. Это значит, что если я так сделаю
$ foo push --file file.txt [TAB]
--key ##It should be display as output
может кто-нибудь сказать мне, как я могу это сделать? Благодарю.
1 ответ
Там нет элегантного решения; вам нужно перебрать список ключей, чтобы удалить и заменить его пустой строкой. Новый массив создается без цитирования старого расширения массива, что обычно вызывает некоторую обеспокоенность, за исключением того, что оригинал был создан без цитирования compgen
подстановка команд, так что все в порядке.
for x in ${COMPWORDS[@]}; do
COMPREPLY=( ${COMPREPLY[@]//$x} )
done
Это удаляет все из списка текущих слов в команде из возможных замен. Одно предостережение: если два слова имеют общий префикс, вы можете частично удалить более длинное слово при удалении более короткого.