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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top