cómo analizar correctamente las banderas y los argumentos del script de shell usando getopts

Estoy usando esto:

por ejemplo ./imgSorter.sh -d directory -f format

el contenido de los scripts» es:

#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

casos de uso:

$ ./imgSorter.sh -d myDir -d was triggered with myDir OK

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f NOK: ¿cómo es que una cadena que comienza con – no se detecta como una bandera?

Respuesta

Le ha dicho a getopts que el -d La opción debe tener un argumento, y en la línea de comando se usa -d -f myformat que claramente (?) dice «-f es el «Le doy el argumento a la -d opción».

Esto no es un error en el código, sino en el uso del script en la línea de comando.

Su código necesita verificar que los argumentos de las opciones sean correctos y que todas las opciones estén configuradas de manera apropiada.

Posiblemente algo como

while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi 

Si la opción -d es opcional y si desea utilizar un valor predeterminado para la variable dir en el código anterior, comenzaría estableciendo dir en ese valor predeterminado antes de while loop.

Una opción de línea de comando no puede tomar y no tomar un argumento al mismo tiempo.

Comentarios

  • ok gracias @Kusalananda, asumí erróneamente que getopts tomó cada – por el comienzo de una bandera.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *