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.