# bash completion for getent -*- shell-script -*- proc _getent { local cur prev words cword split _init_completion -s || return local i db for (( i=1; i < cword; i++ )); do case ${words[i]} in -V|--version|--usage|-'?'|--help) return ;; -s|--service) (( i++ )) ;; -*) ;; *) # First non-option value is the db db=${words[i]} break ;; esac done case (db) { passwd { setvar COMPREPLY = ''( $( compgen -u -- "$cur" ) ) return 0 } group { setvar COMPREPLY = ''( $( compgen -g -- "$cur" ) ) return 0 } services { setvar COMPREPLY = ''( $( compgen -s -- "$cur" ) ) return 0 } hosts { setvar COMPREPLY = ''( $( compgen -A hostname -- "$cur" ) ) return 0 } protocols|networks|ahosts|ahostsv4|ahostsv6|rpc { setvar COMPREPLY = ''( $( compgen -W "$( $1 $db | \ awk '{ print $1 }' )" -- "$cur" ) ) return 0 } aliases|shadow|gshadow { setvar COMPREPLY = ''( $( compgen -W "$( $1 $db | cut -d: -f1 )" \ -- "$cur" ) ) return 0 } ethers|netgroup { return } } case (prev) { -s|--service { return } } $split && return if [[ $cur == -* ]] { setvar COMPREPLY = ''( $( compgen -W '$( _parse_help "$1" )' -- "$cur" ) ) [[ $COMPREPLY == *= ]] && compopt -o nospace } elif [[ -z $db ]] { setvar COMPREPLY = ''( $( compgen -W 'passwd group hosts services protocols networks ahosts ahostsv4 ahostsv6 aliases ethers netgroup rpc shadow gshadow' -- "$cur" ) ) } } && complete -F _getent getent # ex: ts=4 sw=4 et filetype=sh