bash 补全:如何补全特定参数的主机列表?

bash 补全:如何补全特定参数的主机列表?

我的程序可以采用以下格式:

<command_name> <arguments> <options> -hosts <host1> <host2> ... <hostn> (<more_arguments>) ...

我正在尝试设置 bash 自动完成,并基于Debian 管理的文章中,我已经完成了这样的主机补全:

(...)
case "${prev}" in
    -hosts)
        _known_hosts_real -a "$cur"
        return 0
        ;;
    (...)
(...)

当然写完后-hostsbash是可以补全单个主机的名称,但不能补全多个主机。当我们处理除 之外的其他参数时,是否有一种漂亮的方法可以在不完成主机的情况下实现此黑客攻击-hosts

答案1

如果您忽略(<more_arguments>)大小写,那么您只需检查是否-hosts是较早的单词之一:

(...)
for ((i=1;i<COMP_CWORD;i++)); do 
  if [ "-hosts" == "${COMP_WORDS[i]}" ]; then 
    _known_hosts_real -a "$cur" 
    return 0 
  fi 
done 
case "${prev}" in 

答案2

我不确定是否可以为空格分隔的主机值创建这样的自动完成规则。但如果您不介意使用逗号分隔的列表,那么:

_myhost () {
  local cur prev opts
  _get_comp_words_by_ref cur prev

  opts='-hosts'
  servers='name1 name2 name3'

  if [[ ${cur} == -* ]] ; then
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
  else
    case "${prev}" in
      -hosts)
        if [[ "$cur" == *,* ]]; then
          local realcur prefix
          realcur=${cur##*,}
          prefix=${cur%,*}
          COMPREPLY=( $(compgen -W "${servers}" -P "${prefix}," -- ${realcur}) )
        else
          COMPREPLY=( $(compgen -W "${servers}" -- ${cur}) )
        fi
        ;;
      *)
        # do nothing
        ;;
    esac
  fi
}
complete -F _myhost myhost

相关内容