Todo lo que veo usa getopt
o el ligeramente más lujoso getopts
que solo admite opciones de un carácter (por ejemplo, -h
pero no --help
). Quiero hacer opciones largas y elegantes.¿Cómo puedo analizar argumentos largos en shell?
Respuesta
que he hecho algo como this:
_setArgs(){
while [ "${1:-}" != "" ]; do
case "$1" in
"-c" | "--configFile")
shift
configFile=$1
;;
"-f" | "--forceUpdate")
forceUpdate=true
;;
"-r" | "--forceRetry")
forceRetry=true
;;
esac
shift
done
}
Como se puede ver, este es compatible tanto con el solo carácter y las opciones más largos agradable. Permite asociar valores con cada argumento, como en el caso de --configFile
. También es bastante extensible, sin limitaciones artificiales en cuanto a qué opciones se pueden configurar, etc.
Como se incluyó anteriormente, la "${1:-}"
evita un error "Variable no unido" cuando se ejecuta en modo fiesta "estricta" (set -euo pipefail
).
Esto funcionaría, pero no obedecería algunas convenciones: plegar argumentos de una sola letra, y cosas como '-configFile = filename' (the' = '). –
@IanBicking - Muy cierto. Sin embargo, para mi caso, decidí permitir esto sobre la frustración con getopt/getops reflejado en las muchas (aunque aún valiosas) respuestas provistas en el duplicado marcado en http://stackoverflow.com/questions/402377/using-getopts -in-bash-shell-script-to-get-long-and-short-command-line-options. – ziesemer
Ah ... esa pregunta no estaba entre los candidatos para duplicados cuando escribí mi pregunta. ¡Gracias! –
Suponiendo que "desea hacer opciones largas y elegantes" independientemente de la herramienta, simplemente vaya con getopt
(getopts
parece que se usa principalmente cuando la portabilidad es crucial). He aquí un example de la complejidad máxima que obtendrá:
params="$(getopt -o e:hv -l exclude:,help,verbose --name "$(basename "$0")" -- "[email protected]")"
if [ $? -ne 0 ]
then
usage
fi
eval set -- "$params"
unset params
while true
do
case $1 in
-e|--exclude)
excludes+=("$2")
shift 2
;;
-h|--help)
usage
;;
-v|--verbose)
verbose='--verbose'
shift
;;
--)
shift
break
;;
*)
usage
;;
esac
done
Con este código, puede especificar -e
/--exclude
más de una vez, y ${excludes[@]}
contendrá todos los excluye dadas. Después del procesamiento (--
siempre está presente), todo lo que queda se almacena en [email protected]
.
'basename' no toma la ruta como una opción, sino como un argumento. (No pude editar la respuesta, porque el sistema requiere al menos 6 ediciones de caracteres.) – jarno
Gracias @jarno, no sé cómo se metió. – l0b0
Por otro lado, creo que no es necesario que use '$ { 2-} ', pero' $ 2' es suficiente, ya que 'getopt' saldrá con un código distinto de cero, si no hubiera argumento para' -e', ¿no? – jarno
- 1. Comandos de Emacs y Shell largos
- 2. ¿Cómo paso argumentos al script de shell?
- 3. No se puede analizar opciones de línea de comandos largos
- 4. Cómo analizar rss-feeds/xml en un guión de shell
- 5. ¿Cómo formatear números largos?
- 6. ¿Cómo puedo ver textos largos/msg en logcat?
- 7. ¿Cómo puedo truncar textos largos en una tabla usando CSS?
- 8. Cómo analizar argumentos de línea de comandos en Python?
- 9. ¿Cómo recibir argumentos a través de shell pipe en python?
- 10. ¿Cómo puedo analizar JSON en Pig?
- 11. ¿Cómo puedo analizar JSON en Perl?
- 12. Biblioteca para analizar argumentos ¿estilo GNU?
- 13. Cómo deshabilitar PHP cortando partes de argumentos largos en el seguimiento de la pila de excepciones?
- 14. Analizando los argumentos del script de shell
- 15. ¿Cómo impulsar ngrams más largos en solr?
- 16. Ejecutar un archivo con argumentos en el shell de Python
- 17. ¿Cómo puedo expandir argumentos en Java?
- 18. ¿Cómo se muestran números largos en Excel?
- 19. NSDecimalNumber y enteros largos largos sin firmar (64 bits)
- 20. ¿Cómo puedo depurar EF? (analizar consultas SQL)
- 21. cómo puedo analizar un archivo dtd
- 22. ¿Cómo puedo permitir opciones definidas al analizar args con Getopt
- 23. ruby: cómo analizar correctamente varios números de argumentos de línea de comandos
- 24. Usando argparse para analizar los argumentos de forma "arg = val"
- 25. Nombres de variable largos
- 26. literales enteros largos
- 27. pasar argumentos entre scripts de shell pero conservar las comillas
- 28. línea de comandos personalizada analizar en Python
- 29. ¿Cómo puedo pasar los argumentos a Perl one-liner?
- 30. ¿Cómo puedo obtener argumentos del programa Formulario?
posible duplicado de [Uso de getopts en script bash shell para obtener opciones de línea de comandos largas y cortas] (http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get -long-and-short-command-line-options) –
@JonathanLeffler Realmente no es un duplicado como 'getops' no siempre tiene que ser la respuesta – Potherca
@Potherca: Y de hecho,' getopts' es * no * la respuesta, ya que explicado tanto en esta pregunta como en las respuestas a esa pregunta. – ruakh