Uso de getopts dentro de la función definida por el usuario en bourne shell
Pregunta
¿Es posible pasar argumentos de línea de comando a una función desde un script bourne, para permitir que getopts los procese?
El resto de mi script está muy bien empaquetado en funciones, pero parece que tendré que mover el procesamiento de argumentos a la lógica principal.
Lo siguiente es cómo está escrito ahora, pero no funciona:
processArgs() { while getopts j:f: arg do echo "${arg} -- ${OPTARG}" case "${arg}" in j) if [ -z "${filename}" ]; then job_number=$OPTARG else echo "Filename ${filename} already set." echo "Job number ${OPTARG} will be ignored. fi;; f) if [ -z "${job_number}" ]; then filename=$OPTARG else echo "Job number ${job_number} already set." echo "Filename ${OPTARG} will be ignored." fi;; esac done } doStuff1 processArgs doStuff2
¿Es posible quizás definir la función de manera que pueda leer los argumentos de los scripts? ¿Se puede hacer esto de otra manera? Me gusta la funcionalidad de getopts, pero parece que en este caso tendré que sacrificar la belleza del código para obtenerlo.
Solución
Puede proporcionar argumentos a getopts después de la variable. El valor predeterminado es $ @, pero eso también es lo que utilizan las funciones de shell para representar sus argumentos. La solución es pasar & Quot; $ @ & Quot; & # 8212; representando todos los argumentos de la línea de comandos del script como cadenas individuales & # 8212; para procesar Args:
processArgs "$@"
Agregando eso a su script (y arreglando la cita en la línea 11), y probando algunos argumentos de prueba galimatizantes:
$ ./try -j asdf -f fooo -fasdfasdf -j424pyagnasd j -- asdf f -- fooo Job number asdf already set. Filename fooo will be ignored. f -- asdfasdf Job number asdf already set. Filename asdfasdf will be ignored. j -- 424pyagnasd