Как извлечь элемент из массива в скрипт оболочки завершения 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

Это удаляет все из списка текущих слов в команде из возможных замен. Одно предостережение: если два слова имеют общий префикс, вы можете частично удалить более длинное слово при удалении более короткого.

Другие вопросы по тегам