Você realmente não precisa de getopt
para lidar com opções longas de script. A função getopts
builtin pode fazer isso também (e normalmente sem sub-conjuntos) . O truque é usar -
como uma opção. Dessa forma, --dry-run
(por exemplo) torna-se optvar=-
e OPTARG=-dry-run
. Veja um exemplo funcional de como você pode fazer isso especificamente para este caso:
#!/bin/sh
help(){ echo usage; } #dummy help
unset user dryrun pass _o o #ensure all flag vars are unset
while getopts :-:u:p:d o && #getopts loop
o=${o#-} _o=${o:+$OPTARG} #empty $o if $o==-
do case $o$OPTARG in #test concatenated $o$OPTARG
(u*|-user) user=${_o:-$2} ;; #set $user to $_o or $2
(p*|-pass) pass=${_o:-$2} ;; #ditto for $pass
(d*|-dryrun) o=d dryrun=1 ;; #no $OPTARG either way - o=d base
(*) ! help ;; #no usage options met - opt error
esac || exit #quit with error if opt == ! help
shift "$((!${#o}+(OPTIND-(OPTIND=1))))" #shift params as they're read
done
Isso será executado como está. Na verdade, tentei várias possibilidades de opções diferentes. Por exemplo:
~/getopts.sh -p-user --user me -uyou -d --dry-run
... quando executar w / a #!/bin/sh -x
bangline imprimiu isso no meu stderr:
+ unset user dryrun pass _o o
+ getopts :-:u:p:d o
+ o=p _o=-user
+ pass=-user
+ shift 1
+ getopts :-:u:p:d o
+ o= _o=
+ user=me
+ shift 2
+ getopts :-:u:p:d o
+ o=u _o=you
+ user=you
+ shift 1
+ getopts :-:u:p:d o
+ o=d _o=
+ o=d dryrun=1
+ shift 1
+ getopts :-:u:p:d o
+ o= _o=
+ o=d dryrun=1
+ shift 1
+ getopts :-:u:p:d o
Depois de completar o ciclo getopts
, você pode fazer ...
[ "$((dryrun))" -eq 0 ] && production || dryrun
... se você declarou as funções production()
e dryrun()
. Eles encontrarão quaisquer valores de linha de comando especificados para $pass
e / ou $user
atribuídos conforme necessário. Se algum deles não foi declarado na linha de comando, você pode considerá-los como:
echo "${user=default_username}" "${pass=default_password}"
... apenas para cobrir todas as suas bases.