Sé que puedo obtener fácilmente parámetros posicionados como este en bash:
$0 o $1
Quiero poder usar opciones de marca como esta para especificar para qué se usa cada parámetro:
mysql -u user -h host
¿Cuál es la mejor manera de obtener -u paramvalor y -h paramvalor por bandera en lugar de por posición?

Respuestas:
Este es el idioma que suelo usar:
Los puntos clave son:
$#es la cantidad de argumentosfuente
--action*y--output-dir*?--action=[ACTION], así como el caso donde alguien escribe--action [ACTION]*)qué rompes allí, no deberías salir o ignorar la mala opción? En otras palabras,-bad -o dirla-o dirparte nunca se procesa.Este ejemplo usa el
getoptscomando integrado de Bash y es de la Guía de estilo de Google Shell :Nota: Si un carácter va seguido de dos puntos (p
f:. Ej. ), Se espera que esa opción tenga un argumento.Ejemplo de uso:
./script -v -a -b -f filenameUsar getopts tiene varias ventajas sobre la respuesta aceptada:
-a -b -c→-abc)Sin embargo, una gran desventaja es que no admite opciones largas, solo opciones de un solo carácter.
fuente
?) printf '\nUsage: %s: [-a] aflag [-b] bflag\n' $0; exit 2 ;;getopt es tu amigo ... un ejemplo simple:
Debería haber varios ejemplos en su directorio / usr / bin.
fuente
/usr/share/doc/util-linux/examples, al menos en las máquinas Ubuntu.Creo que esto serviría como un ejemplo más simple de lo que quieres lograr. No hay necesidad de usar herramientas externas. Las herramientas integradas de Bash pueden hacer el trabajo por usted.
Esto le permitirá usar indicadores para que, sin importar en qué orden pase los parámetros, obtenga el comportamiento adecuado.
Ejemplo:
Salida:
Puede agregar esta función a su perfil o ponerla dentro de un script.
¡Gracias!
Editar: guarde esto como un archivo y luego ejecútelo como
yourfile.sh -last "Adios" -first "Hola"fuente
./hello.sh DOSOMETHING -last "Adios" -first "Hola"return 1;con el último ejemplo salidascan only 'return' from a function or sourced scripten macOS Sinexit 1;embargo, el cambio a trabajos funciona como se esperaba.Otra alternativa sería usar algo como el siguiente ejemplo que le permitiría usar etiquetas largas --image o short -i y también permitir métodos compilados -i = "example.jpg" o -i example.jpg separados para pasar argumentos .
fuente
Me gusta la respuesta de Robert McMahan la mejor aquí, ya que parece la más fácil de convertir en archivos de inclusión compartibles para que cualquiera de sus scripts los use. Pero parece tener un defecto con la línea que
if [[ -n ${variables[$argument_label]} ]]arroja el mensaje "variables: subíndice de matriz incorrecto". Yo no tengo el representante de comentario, y dudo que esto sea el correcto 'arreglar', pero que envolverifenif [[ -n $argument_label ]] ; thenlo limpia.Aquí está el código con el que terminé, si conoces una mejor manera, agrega un comentario a la respuesta de Robert.
Incluir archivo "flags-declares.sh"
Incluir archivo "flags-arguments.sh"
Tu "script.sh"
fuente
Si está familiarizado con Python argparse, y no le importa llamar a python para analizar argumentos bash, hay un código que encontré realmente útil y súper fácil de usar llamado argparse-bash https://github.com/nhoffman/ argparse-bash
Ejemplo tomado de su script example.sh:
fuente
Propongo un TLDR simple :; ejemplo para los no iniciados.
Cree un script bash llamado helloworld.sh
Luego puede pasar un parámetro opcional
-nal ejecutar el script.Ejecute el script como tal:
Salida
Notas
Si desea utilizar múltiples parámetros:
while getops "n:" arg: docon más parámetros comowhile getops "n:o:p:" arg: doo) Option=$OPTARGyp) Parameter=$OPTARGfuente
Guárdelo como sample.sh e intente ejecutar
en tu terminal
fuente
Tuve problemas para usar getopts con varias banderas, así que escribí este código. Utiliza una variable modal para detectar banderas y para usar esas banderas para asignar argumentos a las variables.
Tenga en cuenta que, si una bandera no debe tener un argumento, se puede hacer algo más que configurar CURRENTFLAG.
fuente
Así que aquí está mi solución. Quería poder manejar banderas booleanas sin guión, con un guión y con dos guiones, así como la asignación de parámetros / valores con uno y dos guiones.
Algunas referencias
declaredo$ bash -c "help declare".shiftdo$ bash -c "help shift".fuente