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 param
valor y -h param
valor 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 dir
la-o dir
parte nunca se procesa.Este ejemplo usa el
getopts
comando 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 filename
Usar 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 script
en 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 envolverif
enif [[ -n $argument_label ]] ; then
lo 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
-n
al ejecutar el script.Ejecute el script como tal:
Salida
Notas
Si desea utilizar múltiples parámetros:
while getops "n:" arg: do
con más parámetros comowhile getops "n:o:p:" arg: do
o) Option=$OPTARG
yp) Parameter=$OPTARG
fuente
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
declare
do$ bash -c "help declare"
.shift
do$ bash -c "help shift"
.fuente