Eu não acho que há um método padrão (isto é, além de implementá-lo todo do zero) que estaria disponível, muito menos amplamente disponível em shells.
Embora ksh
ofereça suporte a getopts
embutido. Com base nisso (e em seus requisitos bastante exigentes) eu delineei uma possível solução baseada em ksh
com o seguinte fragmento de código:
while getopts ":[-][[n]:][99:verbose][s]" opt
do case $opt in
(n) n_arg=$OPTARG ;;
(99) verbose=1 ;;
(s) s=1 ;;
(*) arg_rest+=( "${@:OPTIND-1:1}" ) ;;
esac
done
shift OPTIND-1
printf "main opt(%s)=%s\n" "-n" "$n_arg"
printf "main opt(%s)=%s\n" "--verbose" "$verbose"
printf "main opt(%s)=%s\n" "-s" "$s"
function delegate
{
while getopts ":[-][i][98:long]" opt
do case $opt in
(i) int=1 ;;
(98) long=1 ;;
esac
done
shift OPTIND-1
printf "func opt(%s)=%s\n" "-i" "$int"
printf "func opt(%s)=%s\n" "--long" "$long"
}
printf "Delegate: '%s'\n" "${arg_rest[@]}"
delegate "${arg_rest[@]}"
Primeiro, o programa analisa todas as opções, define as variáveis internas conforme necessário e armazena as opções desconhecidas em uma matriz. Então você vê alguns printf
para controlar as configurações. Em seguida, uma definição de função para onde o restante das opções deve ser delegado; a função também pode ser substituída por um comando. Finalmente a chamada da função (ou outro comando) com o resto dos argumentos.
(Para obter uma descrição da chamada ksh
' getopts
dos recursos de dentro de ksh
session getopts --man
.)
A execução desse programa produz esta saída:
$ ksh ./getopts_script -s -n 23 --verbose -i --long
main opt(-n)=23
main opt(--verbose)=1
main opt(-s)=1
Delegate: '-i'
Delegate: '--long'
func opt(-i)=1
func opt(--long)=1
Para uma implementação shell de uma função getopts que suporta opções longas, consulte link